自行开发配网流程

更新时间: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)。

  • 在开发过程中,请务必按照上面链接最后的“安卓配网开发”“iOS配网开发”两篇文章介绍的流程进行。

子设备配网

  • 子设备配网的时候,需要网关、子设备、手机相互配合才能完成。

  • 首先要保证子设备和网关建立起连接,这一点由子设备和网关进行一系列交互完成。

  • 在此基础上,手机按照如下流程进行配网:

  • 手机应用获取已绑定的网关列表,调用接口 /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匹配,三个条件都满足,才最终认定子设备配网成功。

绑定

手机应用完成了配网工作之后就可以调用绑定接口进行绑定了。

绑定流程

  1. 先调接口 /thing/allProductInfo/getByProductKey 获取待绑定设备的信息,从出参的netType来判断这个设备的类型:

    netType = NET_ETHERNET // 以太网设备
    netType = NT_WIFI // WiFi设备
    
  2. 绑定以太网WiFi设备过程中需要手机和设备进行本地通讯拿到一个token。这个token的用途是做绑定操作的合法性校验,保证这次绑定是由手机和设备约定好的。手机通过SDK的本地通讯功能向设备请求一个token,设备会把token发给云端服务,同时用这个token回复给 手机。手机在调用绑定接口的时候,带着这个token发送给云端,云端完成token匹配校验之后正式开始绑定流程。

Android SDK获取token的方式

// 获取设备绑定 token
LocalDeviceMgr.getInstance().getDeviceToken(context, productKey, deviceName, 60*1000, 5*1000new 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同步的设备。基于配网时间窗口的绑定接口要求在配网时间窗关闭之前完成绑定。

results matching ""

    No results matching ""