配网开发指南

本节将会介绍如何开发App端的设备配网、用户绑定等功能。

概述

  • 配网部分,提供了以下页面的开发方式:

    • 基于配网SDK自行开发配网界面(设备配网和设备绑定)。

      说明

      基于配网SDK开发的设备类型主要有WiFi、以太网、蜂窝网、蓝牙、ZigBee、BLE Mesh。

  • 绑定部分,介绍了不同设备类型的绑定接口:

    • 基于token方式的设备绑定(Wi-Fi、以太网)。

    • 基于时间窗口方式的设备绑定(蜂窝网、蓝牙、Zigbee、其他)。

基于配网SDK自行开发配网界面

  • Wi-Fi设备配网界面开发

  • Zigbee设备配网界面开发

    Zigbee设备的配网指的是将Zigbee设备连接到某个Zigbee网关的过程,Zigbee的配网流程如下图所示。

    Zigbee配网流程

    • 指定网关的IoTID

      开发者可以根据用户绑定的设备去拉取用户绑定的Zigbee网关设备,并让用户从中选择希望接入Zigbee设备的网关,从而明确网关的IoTID

      拉取用户已绑定设备列表的接口为:/uc/listBindingByAccount,详细调用方法如下。

    • 指定Zigbee设备的ProductKey

      开发者可以通过扫码方式获取设备的ProductKey,或者通过列出Zigbee产品列表让用户选择的方式获知Zigbee设备的ProductKey

    • 配网引导

      由于不同Zigbee设备的配对按钮位置与外观不同,厂家要将自己Zigbee设备的配对按键的指示图片放在生活物联网平台上,开发者可以通过待配网Zigbee设备的ProductKey去生活物联网平台获取设备的配网引导页面,显示给用户显示如何启动Zigbee设备的配网。

      获取产品配网引导页面的接口为/awss/enrollee/guide/get。调用方法请参见产品管理服务

    • 网关添加子设备

      调用云端接口让网关进入允许添加设备状态,并等待来自云端的配网结果。

      设置网关允许添加设备的接口为/thing/gateway/permit。调用方法请参见配网服务

      等待配网结果的topic为/thing/topo/add/status,详细调用方法如下。

      最后将接收到的配网结果向用户显示即可。

  • 以太网设备开发

    对于接入设备端SDK的以太网设备,配网SDK提供以太网设备的发现和获取绑定token的能力。

  • 获取以太网设备绑定token

  • 以太网设备获取token和Wi-Fi设备获取绑定token的逻辑是一致的,详细调用方法如下。

调用平台提供的配网插件

在产品-人机交互配网引导中,手动填写配网引导页面中的图片和文字。该插件中兼容了Wi-Fi、以太网和蜂窝网的配网流程。其中Wi-Fi仅支持一键配网、设备热点配网和手机热点配网,如需其他配网方式,请使用基于配网SDK开发配网界面。

调用配网的插件如下。

  • 插件ID国内版:a123kfz2KdRdrfYc

  • 插件ID国际版:a223c2beCJQ2Xpk2

插件入参参数介绍如下。

属性

说明

类型

是否必选

默认值

productKey

产品的唯一标识符。

String

deviceName

同一产品下,设备的唯一标识符。本地发现设备进入配网、GPRS设备扫码配网时需用到该参数。

String

token

设备令牌,用于绑定设备时鉴权,本地发现已配网设备时需使用该参数。

String

addDeviceFrom

标识该设备是由路由器发现的或零配设备发现的待配设备,调用本地发现接口时会返回该值。该参数配置如下。

  • 零配:ZERO_DEVICE

  • 路由器配网:ROUTER

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相关介绍如下。

  • Wi-Fi、以太网,使用基于token方式设备绑定接口。

  • 蜂窝网、蓝牙、Zigbee、其他,使用基于时间窗口方式的绑定设备接口。

  • 更多配网相关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失败
                                  }
            }
    ];