提供了把Wi-Fi设备配置上家庭路由器以及局域网内已联网设备的发现能力,具体方案包括一键广播配网(P2P)、设备热点配网、蓝牙辅助配网、手机热点配网、设备间相互配网、二维码配网等。本配网SDK主要提供设备发现、设备配网、获取设备端token等能力。

依赖SDK 概述
API 通道 提供云端API通道能力,需要完成该SDK的初始化
身份认证 提供云端API通道身份认证(需要零配发现能力的时候需要该依赖)
Breeze-biz SDK 提供蓝牙辅助配网支持,依赖breeze-biz SDK

引入方式

  • Maven仓库地址
    // 阿里云仓库地址,包括了阿里云IoT的SDK
    maven {
        url "http://maven.aliyun.com/nexus/content/repositories/releases/"
    }
  • Gradle依赖
    compile ('com.aliyun.alink.linksdk:ilop-devicecenter:1.7.7.1'){
        transitive = true
    }
    // 当您需要蓝牙辅助配网能力,还需添加以下依赖
    // compile ('com.aliyun.alink.linksdk:breeze-biz:1.2.0')      
  • 混淆配置

    proguard-rules.pro文件中,加入以下代码,排除不需要被混淆的类和方法。

    -keep public class com.aliyun.alink.business.devicecenter.** {*;}
    
    -keep public class com.aliyun.alink.linksdk.alcs.coap.**{*;}

初始化

初始化前需确保已集成安全图片,初始化的操作请参见SDK初始化

设备发现

配网SDK提供了局域网内设备发现的能力,可发现的设备如下。

  • 已配网设备
    • Wi-Fi设备
    • 以太网设备
  • 进入配网模式的待配网设备
    • 设备热点待配网设备
    • 蓝牙辅助配网待配网设备
    • 通过已配设备发现局域网内的待配设备

设备发现相关API,请参见LocalDeviceMgr

  1. 启动设备发现。

    发现本地的已配网设备、零配发现的待配网设备、符合adh_{pk}_{mac}格式的设备热点设备或者combo待配设备。发现的待配设备信息可以作为后续设备配网的入参信息。如果您需要过滤发现的设备(如过滤已配网的设备、不支持的设备等),请参见本地发现设备列表信息过滤

    // 开始发现设备
    // enumSet是需要使用的防发现方式 EnumSet<DiscoveryType>,请根据需要选择发现方式,并添加对应的依赖
    // 第三个参数是获取零配或智能路由器发现的待配设备,请求时需要携带的参数
    LocalDeviceMgr.getInstance().startDiscovery(context, enumSet, null, new IDeviceDiscoveryListener() {
        @Override
        public void onDeviceFound(DiscoveryType discoveryType, List<DeviceInfo> list) {
            // 发现的设备类型
            // LOCAL_ONLINE_DEVICE 当前和手机在同一局域网已配网在线的设备
            // CLOUD_ENROLLEE_DEVICE 零配或智能路由器发现的待配设备
            // BLE_ENROLLEE_DEVICE 发现的是蓝牙Wi-Fi双模设备(蓝牙模块广播的subType=2即为双模设备)
            // SOFT_AP_DEVICE 发现的设备热点
            // BEACON_DEVICE 一键配网发现的待配设备
            // 注意:发现蓝牙设备需添加breeze-biz SDK依赖
        }
    });
  2. 停止设备发现。

    停止发现本地已配网设备和待配网设备。调用该接口会清除已发现设备列表,确保与启动设备发现startDiscovery()成对调用。

    // 停止设备发现
    LocalDeviceMgr.getInstance().stopDiscovery();

设备配网

配网设备可以是本地发现的待配设备,也可以是通过扫码等其他途径获取的待配设备。更多配网方式请参见Android App Native开发配网。设备配置添加相关API说明,参见配网服务

  1. 设置待配网设备的信息。
    // 启用全球配网时,ProvisionConfigParams的设置只需在配网前调用一次即可,无需每次配网前都调用
    ProvisionConfigParams params = new ProvisionConfigParams();
    params.enableGlobalCloudToken = true;
    ProvisionConfigCenter.getInstance().setProvisionConfiguration(params);
    
    DeviceInfo deviceInfo = new DeviceInfo();
    deviceInfo.productKey = "xx"; // 商家后台注册的productKey,不可为空
    deviceInfo.deviceName = "xxx";// 设备名,可为空
    deviceInfo.productId = "xxx";// 产品ID,蓝牙辅助配网时必配
    deviceInfo.id= "xxx";// 设备热点的ID,在发现热点设备返回到App时会携带这个字段
    // 设备热点配网:ForceAliLinkTypeSoftAP
    // 蓝牙辅助配网:ForceAliLinkTypeBLE
    // 二维码配网:ForceAliLinkTypeQR
    // 手机热点配网:ForceAliLinkTypePhoneAP
    // 一键配网:ForceAliLinkTypeBroadcast
    // 零配:ForceAliLinkTypeZeroAP
    deviceInfo.linkType = "ForceAliLinkTypeNone"; // 默认为一键配网  
    
    // 如果当前App需要全球使用,且涉及到切换账号的数据中心,配网SDK可以按照以下设置传递数据中心的信息
    // getStoredShortRegionId接口由IoTSmart所在的SDK提供
    RegionInfo regionInfo = new RegionInfo();
    regionInfo.shortRegionId = Integer.parseInt(RegionManager.getStoredShortRegionId());
    deviceInfo.regionInfo = regionInfo;
    
    //设置待添加设备的基本信息
    AddDeviceBiz.getInstance().setDevice(deviceinfo);                    

    可能用到的其他参照信息如下。

  2. 开始设备配网。

    调用startAddDevice接口进入配网流程。

    说明 配网过程需要位置权限和位置服务(GPS),在调用开始配网接口之前,请确保App已获得相关权限。如使用手机热点方式配网,App还需额外获得WRITE_SETTINGS的权限。
    // 开始添加设备
    AddDeviceBiz.getInstance().startAddDevice(context, new IAddDeviceListener(){
        @Override
        public void onPreCheck(boolean b, DCErrorCode dcErrorCode) {
            // 参数检测回调 
        }
    
    
        @Override
        public void onProvisionPrepare(int prepareType) {
            if (prepareType == 1) {
                // 一键配网、蓝牙辅助配网、设备热点配网、二维码配网、手机热点配网会走到prepareType==1的流程
                // 可以交互引导用户输入Wi-Fi的ssid、password信息,获取到ssid、password信息
                // 之后调用toggleProvision接口开始配网,参见第三步“输入账号密码”
    
            } else if (prepareType == 2) { 
               // 手机热点配网时会走到该流程,收到这个回调后,先引导用户开启指定热点,例如ssid为aha,password为12345678
               // 确保热点开启后,可以交互引导用户输入Wi-Fi的ssid、password信息,获取到ssid、password信息
               // 之后调用toggleProvision接口开始配网,参见第三步“输入账号密码”
            }
        }
    
        @Override
        public void onProvisioning() {
            // 配网中
        }
    
        @Override 
        public void onProvisionStatus(ProvisionStatus provisionStatus) {
          // 二维码配网
          // provisionStatus=ProvisionStatus.QR_PROVISION_READY表示二维码ready了
          // ProvisionStatus.QR_PROVISION_READY.message() 获取二维码内容
          // 注意:返回二维码时已开启监听设备是否已配网成功的通告,并开始计时,UI端应提示用户尽快扫码,
          // 如果在指定时间配网超时了,重新调用开始配网流程并刷新二维码。
    
          // 设备热点配网 
          // 只有需要提示用户需要手动连接设备热点或者恢复Wi-Fi连接的场景才会回调,
          // 比如android 10,或者非android 10发现或连接设备热点失败。
          // provisionStatus=ProvisionStatus.SAP_NEED_USER_TO_CONNECT_DEVICE_AP 表示需要用户手动连接设备热点,
          // provisionStatus=ProvisionStatus.SAP_NEED_USER_TO_RECOVER_WIFI 表示需要用户手动恢复到配网之前的Wi-Fi,
          // 针对android 10不支持的场景,可以根据这两个事件增加交互,让用户处理。
        }
    
        @Override
        public void onProvisionedResult(boolean b, DeviceInfo deviceInfo, DCErrorCode errorCode) {
            // 处理配网结果,如果配网成功后包含token,请使用配网成功带的token做绑定。
        }
    });

    配网回调接口,请参见 IAddDeviceListener

  3. 输入账号密码。

    在收到onProvisionPrepare回调后,引导App用户输入Wi-Fi的ssidpassword,并调用此方法传入ssidpasswordtimeout信息启动配网。

    String ssid = "ssid"; // 手机热点配网的时候注意 要先获取ssid,然后再开启热点,否则无法正确获取到ssid
    String password = "xxxxxxxx";
    int timeout = 60; //单位秒,目前最短只能设置为60秒
    AddDeviceBiz.getInstance().toggleProvision(ssid, password, timeout);
  4. 停止配网。
    // 停止配网
    AddDeviceBiz.getInstance().stopAddDevice();

获取设备绑定Token

Wi-Fi设备或以太网设备绑定时,除了需要productKeydeviceName,还需要设备端的token。以下提供从设备端获取绑定token的方法。

说明 以太网设备还需要先获取到设备的productKeydeviceName,可以使用startDiscovery接口去获取。
// 获取设备绑定的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) {
            }
        });

在插件中使用配网能力

如果需要在插件中使用配网能力,您需要向BoneMobile容器中注册配网API。请您在插件加载前,调用如下注册代码。

说明 插件配网面板不支持蓝牙辅助配网,且设备热点配网不支持Android10及以上版本。
BonePluginRegistry.register("BoneAddDeviceBiz",BoneAddDeviceBiz.class);
BonePluginRegistry.register("BoneLocalDeviceMgr",BoneLocalDeviceMgr.class);
BonePluginRegistry.register("BoneHotspotHelper",BoneHotspotHelper.class);