配网开发指南

更新时间:2019-07-25 21:09:55

概述

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

  • 配网部分,提供了两种页面的开发方式:
  • 基于配网SDK自行开发配网界面(设备配网 和 设备绑定)

  • 调用平台提供的配网插件

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

  • 基于token方式的设备绑定(WiFi、以太网)
  • 基于时间窗口方式的设备绑定(蜂窝网、蓝牙、Zigee、其他)

设备配网

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

WiFi设备配网界面开发

配网方案介绍参见:WiFi 配网方案介绍
Android APP SDK:Android 配网
iOS APP SDK:iOS 配网
最佳实践:Android 开发最佳实践

Zigbee设备配网界面开发

Zigbee设备的配网指的是将Zigbee设备连接到某个Zigbee网关的过程,zigbee的配网流程为:

如何指定网关的IoTID

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

拉取用户已绑定设备列表的接口为:/uc/listBindingByAccount
注:安卓系统调用接口的方式参见 Andriod API通道使用说明,iOS系统调用接口的方式参见 iOS API通道使用说明

指定zigbee设备的PK

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

配网引导

由于不同的zigbee设备的“配对”按钮所在的位置与外观都不同,厂家会将对应Zigbee设备的“配对”按键的指示图片放在飞燕平台上,开发者可以通过待配网Zigbee设备的PK去飞燕平台拉取设备的配网引导页面,显示给用户让用户得知如何启动Zigbee设备的配网。

获取产品配网引导页面的接口为:/awss/enrollee/guide/get

网关添加子设备

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

设置网关允许添加设备的接口为:/thing/gateway/permit
等待配网结果的topic为:"/thing/topo/add/status"。安卓系统的长连通道从topic接收消息的使用方法参见 Andriod长连接通道使用说明,iOS系统的长连通道从topic接收消息的使用方法参见 iOS长连接通道使用说明
最后将接收到的配网结果向用户显示即可

以太网设备开发

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

以太网设备发现

以太网设备的发现依赖配网SDK来实现,具体使用方法如下:
Android端:配网SDK 以太网设备发现
iOS端:配网SDK 以太网设备发现

以太网设备绑定

以太网设备的绑定包含两个过程:获取绑定 token;调用绑定接口。

获取以太网设备绑定 token

以太网设备获取 token 和 WiFi 设备获取绑定 token 的逻辑是一致的。
Android端:配网SDK 以太网设备获取绑定 token
iOS端:配网SDK 以太网设备获取绑定 token

2. 调用平台提供的配网插件

配合人机交互-配网引导,手动填写配网引导页面中的图片和文字。该插件中兼容了WiFi、以太网和蜂窝网的配网流程。其中WiFi仅支持一键配网、设备热点配网和手机热点配网,如需其他配网方式,请使用方法1,基于配网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介绍

  • 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失败    
    }
}];

results matching ""

    No results matching ""