本节将会介绍如何开发App端的设备配网、以及和用户绑定的功能。
- 配网部分,提供了两种页面的开发方式:
- 基于配网SDK自行开发配网界面(设备配网和设备绑定)
- 调用平台提供的配网插件
- 绑定部分,介绍了不同设备类型的绑定接口:
- 基于token方式的设备绑定(WiFi、以太网)
- 基于时间窗口方式的设备绑定(蜂窝网、蓝牙、Zigee、其他)
基于配网SDK自行开发配网界面
- WiFi设备配网界面开发
- 配网方案介绍参见:WiFi 配网方案介绍
- Android APP SDK:配网SDK
- iOS APP SDK:配网SDK
- 最佳实践:Android (Native)配网开发实践
- Zigbee设备配网界面开发
Zigbee设备的配网指的是将Zigbee设备连接到某个Zigbee网关的过程,Zigbee的配网流程为:
- 指定网关的IoTID
开发者可以根据用户绑定的设备去拉取用户绑定的Zigbee网关设备,并让用户从中选择希望接入Zigbee设备的网关,从而明确网关的IoTID。
拉取用户已绑定设备列表的接口为:/uc/listBindingByAccount,详细调用方法如下。
- Android系统:Andriod API通道使用说明
- iOS系统:iOS API通道使用说明
- 指定Zigbee设备的ProductKey
开发者可以通过扫码方式获取设备的ProductKey,或者通过列出Zigbee产品列表让用户选择的方式获知Zigbee设备的ProductKey。
- 配网引导
由于不同Zigbee设备的配对按钮位置与外观不同,厂家要将自己Zigbee设备的配对按键的指示图片放在生活物联网平台上,开发者可以通过待配网Zigbee设备的ProductKey去生活物联网平台获取设备的配网引导页面,显示给用户显示如何启动Zigbee设备的配网。
获取产品配网引导页面的接口为:/awss/enrollee/guide/get,详细调用方法参见产品管理服务。
- 网关添加子设备
调用云端接口让网关进入允许添加设备状态,并等待来自云端的配网结果。
设置网关允许添加设备的接口为:/thing/gateway/permit,详细调用方法参见配网服务。
等待配网结果的topic为:/thing/topo/add/status,详细调用方法如下。- Android系统:Andriod API通道使用说明
- iOS系统:iOS API通道使用说明
最后将接收到的配网结果向用户显示即可。
- 指定网关的IoTID
- 以太网设备开发
对于接入设备端SDK的以太网设备,配网SDK提供以太网设备的发现和获取绑定token的能力。
- 以太网设备发现
以太网设备的发现依赖配网SDK来实现,详细调用方法如下。
- Android系统:配网SDK以太网设备发现
- iOS系统:配网SDK以太网设备发现
- 以太网设备绑定
以太网设备的绑定分为两个部分:获取绑定token和调用绑定接口。
- 获取以太网设备绑定token
以太网设备获取token和WiFi设备获取绑定token的逻辑是一致的,详细调用方法如下。
- Android系统:配网SDK以太网设备获取绑定token
- iOS系统:配网SDK以太网设备获取绑定token
- 以太网设备发现
调用平台提供的配网插件
在产品-人机交互的配网引导中,手动填写配网引导页面中的图片和文字。该插件中兼容了WiFi、以太网和蜂窝网的配网流程。其中WiFi仅支持一键配网、设备热点配网和手机热点配网,如需其他配网方式,请使用基于配网SDK开发配网界面。
调用配网的插件如下。
- 插件ID国内版:a123kfz2KdRdrfYc
- 插件ID国际版:a223c2beCJQ2Xpk2
插件入参参数介绍如下。
属性 | 说明 | 类型 | 是否必选 | 默认值 |
---|---|---|---|---|
productKey | 产品的唯一标识符 | String | 是 | 无 |
deviceName | 同一产品下, 设备的唯一标示符。本地发现设备进入配网、GPRS设备扫码配网时需用到该参数 | String | 否 | 无 |
token | 设备令牌,用于绑定设备时鉴权,本地发现已配网设备是需使用该参数 | String | 否 | 无 |
addDeviceFrom | 标识该设备是由路由器发现的或零配设备发现的待配设备,调用本地发现接口时会返回该值。配置如下
|
String | 否 | 无 |
插件出参,退出配网流程:
属性 | 类型 | 必选 | 默认值 |
---|---|---|---|
productKey | String | 是 | 无 |
deviceName | String | 是 | 无 |
代码示例
- Android代码示例:
// 启动插件 Bundle bundle = new Bundle(); bundle.putString("productKey", pk); Router.getInstance().toUrlForResult(activity, "link://router/connectConfig",{your_request_code}, bundle); // 接收配网结果 protected void onActivityResult(int requestCode, int resultCode, Intent data) { ... if (REQUEST_CODE_PRODUCT_ADD == requestCode) { if (Activity.RESULT_OK != resultCode) { // 配网失败 return; } String productKey = data.getStringExtra("productKey"); String deviceName = data.getStringExtra("deviceName"); // 配网成功 } }
- iOS代码示例:
NSMutableDictionary *options = [NSMutableDictionary dictionary]; options[@"productKey"] = device.productKey; options[@"deviceName"] = device.deviceName; options[@"token"] = device.token; options[@"addDeviceFrom"] = device.addDeviceFrom; IMSRouterCallback block = ^(NSError *error, NSDictionary *info) { [self.navigationController popToViewController:self animated:YES]; if (error) { // 处理错误信息 } else if (info && [info count] > 0) { // 配网成功 } else { // 配网正常退出... } }; options[AKRouterCompletionHandlerKey] = block; // 配网插件id NSURL *url = [NSURL URLWithString:@"link://router/connectConfig"]; //NSString *pluginId = @"a123kfz2KdRdrfYc"; //以国内版插件Id举例, 此方法是老方法,现在统一用 router的方式调用 //NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"link://plugin/%@", pluginId]]; [[IMSRouterService sharedService] openURL:url options:options completionHandler:^(BOOL success) { if (!success) { // 进入配网插件失败 } }];
设备绑定
设备绑定的流程图如下。

API相关介绍如下。
- WiFi、以太网,使用API “基于token方式的设备绑定”。
- 蜂窝网、蓝牙、Zigee、其他,使用API “基于时间窗口方式的设备绑定” 。
- 具体配网相关API,如本地发现、配网、绑定等,请查看配网服务。
- 具体和用户关系API,如解绑、查询绑定关系、分享设备等,请查看用户服务。
- Android获取设备token代码示例如下。
LocalDeviceMgr.getInstance().getDeviceToken(productKey, deviceName, 60*1000, new IOnDeviceTokenGetListener() { @Override public void onSuccess(String token) { // 拿到绑定需要的token //TODO 用户根据具体业务场景调用 } @Override public void onFail(String reason) { } });
- iOS获取设备token代码示例如下。
[[IMLLocalDeviceMgr sharedMgr] getDeviceToken:self.productKey deviceName:self.deviceName timeout:60 resultBlock:^(NSString *token, BOOL boolSuccess) { if (token && boolSuccess) { // 获取token成功 } else { // 获取token失败 } }];