自行开发配网流程
更新时间:2020-03-13 10:13:55
设备配网和配网相关的接口定义见:配网服务API
配网
WiFi设备、通过网关代理的子设备需要进行配网。下面分别介绍配网过程。
WiFi设备配网
WiFi设备配网的核心问题是要解决WiFi设备联网,即告诉WiFi设备可以通过哪个AP联网,这个AP对应的SSID/密码是多少。要实现这种功能,需要WiFi设备自身具有某种机制来接收SSID/密码。
阿里云物联网的标准WiFi设备具有这种功能。点击参考更多关于WiFi设备配网的概念 。
目前配网需要在App上来操作,配网相关的API需要借助于智能人居开放平台的SDK,见SDK的下载和配置参考。具体的配网操作请按照“手机端WIFI配网开发过程”进行程序的设计(这篇文档中所说的SDK,即为智能人居开放平台上下载的SDK)。
子设备配网
子设备配网的时候,需要网关、子设备、手机相互配合才能完成。
首先要保证子设备和网关建立起连接,这一点由子设备和网关进行一系列交互完成。
在此基础上,手机按照如下流程进行配网:
- 手机应用获取已绑定的网关列表,调用接口 /uc/listBindingByAccount 获取绑定的设备。在这个接口请求参数里面,把变量nodeType设置为“GATEWAY”表明查询网关设备;
- 手机应用交由用户选择待配网子设备所在的网关;
- 手机应用获取可配网子设备的ProductKey,可以通过扫子设备上的二维码码方式获取子设备的ProductKey,或者通过列出子产品列表让用户选择的方式获知子设备的ProductKey。
- 手机应用发起网关配网流程,调用接口 /thing/gateway/permit 触发配网。
- 手机应用通过SDK(Mqtt协议)监听 topic为 /thing/topo/add/status 的消息,通过这个消息体来判断子设备是否已经加入到网关。消息体的格式如下:
{ "id":"msgId1", "version":"1.0", "param":{ "status":0, //0 添加topo成功,1 子设备注册,设备已被其它网关绑定, 2 子设备注册,注册失败,3 删除topo关系 "subIotId":"加入网关的子设备iotId", "subProductKey":"加入网关的子设备productKey", "subDeviceName":"加入网关的子设备deviceName", "oldGwIotId":"该子设备所属的旧的网关iotId", "oldGwProductKey":"该子设备所属的旧的网关productKey", "oldGwDeviceName":"该子设备所属的旧的网关deviceName", "newGwIotId":"该子设备新绑定到的网关iotId", "newGwProductKey":"该子设备新绑定到的网关productKey", "newGwDeviceName":"该子设备新绑定到的网关deviceName" }, "method":"thing.topo.add.status" }
5.1 需要注意,在发送/thing/gateway/permit消息的时候指定有一个timeout(单位秒)的时间窗,网关设备在这个指定时间窗内会尝试搜索子设备,如果超过这个时间窗,网关就不再进行子设备搜索。所以对于手机应用来说,每次发起配网之后,也需要等待timeout这么长时间。如果在这个时间窗口期内收到 /thing/topo/add/status 就按消息内容处理,如果没有收到/thing/topo/add/status消息,就做配网失败处理。
5.2 需要针对 /thing/topo/add/status 的消息体做进一步解析。
首先判断status,如果是0才是配网成功的消息,如果是1,2,3建议不处理,继续等待,直到有status==0的消息出现;
其次要判断newGwIotId这个字段和/thing/gateway/permit请求消息中的iotId是否一致,如果不一致则略过不处理;
再次要判断subProductKey是否和/thing/gateway/permit请求消息中的productKey一致,如果不一致也略过不处理;
最终,要status==0,newGwIotId匹配,subProductKey匹配,三个条件都满足,才最终认定子设备配网成功。
绑定
手机应用完成了配网工作之后就可以调用绑定接口进行绑定了。
绑定流程
先调接口 /thing/allProductInfo/getByProductKey 获取待绑定设备的信息,从出参的netType来判断这个设备的类型:
netType = NET_ETHERNET // 以太网设备 netType = NT_WIFI // WiFi设备
绑定以太网和WiFi设备过程中需要手机和设备进行本地通讯拿到一个token。这个token的用途是做绑定操作的合法性校验,保证这次绑定是由手机和设备约定好的。手机通过SDK的本地通讯功能向设备请求一个token,设备会把token发给云端服务,同时用这个token回复给 手机。手机在调用绑定接口的时候,带着这个token发送给云端,云端完成token匹配校验之后正式开始绑定流程。
Android SDK获取token的方式
// 获取设备绑定 token
LocalDeviceMgr.getInstance().getDeviceToken(context, productKey, deviceName, 60*1000, 5*1000, new IOnDeviceTokenGetListener() {
@Override
public void onSuccess(String token) {
// TODO bind
}
@Override
public void onFail(String reason) {
}
});
iOS SDK获取token的方式
// 引入头文件
#import <IMSDeviceCenter/IMLDeviceCenter.h>
// self.productKey 和 self.deviceName 是配网成功后返回的设备模型中的 productKey 和 deviceName
[[IMLLocalDeviceMgr sharedMgr] getDeviceToken:self.productKey deviceName:self.deviceName timeout:20 resultBlock:^(NSString *token, BOOL boolSuccess) {
NSLog(@"主动获取设备token:%@,boolSuccess:%d", token, boolSuccess);
if(token){
// 调用绑定接口进行设备绑定
} else{
NSLog(@"获取token失败(超时)");
}
}];
调用绑定接口
然后调用接口 /awss/enrollee/product/filter 判断待定设备是否还未绑定,如果没有完成绑定这个接口会返回传入的设备。也就是说如果这个接口有返回,则可以继续绑定。如果没返回,说明当前设备已经完成了绑定。
调用接口 /awss/enrollee/guide/get 获取设备商定义的一些配置信息,辅助手机应用做交互的文案
调用绑定接口。
绑定分两种,一种是基于token的绑定,用于WiFi设备和以太网设备;一种是基于配网时间窗口的,用于其他不能提供token同步的设备。基于配网时间窗口的绑定接口要求在配网时间窗关闭之前完成绑定。