生活物联网平台已提供了一套完整的配网页面,如果您希望自己使用Native开发自己的定制化配网页面,可以阅读本文,使用配网SDK进行开发。

背景信息

配网SDK提供了把Wi-Fi设备配置上家庭路由器以及局域网内已联网设备的发现能力,具体方案包括一键广播配网(P2P)、手机热点配网、智能路由器配网和设备间相互配网(以下简称零配)等。各配网方式介绍参见Wi-Fi设备配网方案介绍配网SDK

设备热点配网

  1. 设置待配网设备信息。
    1. 选择配网方式。
      设备热点支持指定产品型号productKey进行配网,也支持不指定型号直接开始配网(详细参见下方代码)。

      获取产品型号productKey的方式如下。

      • 通过直接调用云端接口获取产品列表(非配网SDK提供接口)或App直接展示产品列表,用户选择后确定待配设备productKey。
      • 通过扫描产品二维码,获得设备ProductKey。
    2. 调用SDK setDevice设置待配信息。
  2. 开始配网。
    指定配网方式linkTypeForceAliLinkTypeSoftap,并调用SDK startAddDevice接口开始配网。
  3. 配网中,处理回调信息。
    配网中,收到notifyProvisionPrepare回调后,提醒用户手动切换到设备热点,切换完成后调用SDK toggleProvision方法传入当前连接路由器的ssidpassword
  4. 监听配网结果。
    /**
    * 第一步:设置待配网设备信息
    */
    //方式一:指定productKey方式
    IMLCandDeviceModel *model = [[IMLCandDeviceModel alloc] init];
    model.productKey = @"xxxx"; 
    model.linkType = ForceAliLinkTypeSoftap;
    [kLkAddDevBiz setDevice:model];
    
    //方式二:不指定型号
    IMLCandDeviceModel *model = [[IMLCandDeviceModel alloc] init];
    model.protocolVersion = @"2.0";
    model.linkType = ForceAliLinkTypeSoftap;
    [kLkAddDevBiz setDevice:model];
    
    //若希望自定义设备热点前缀,例如前缀为"demo_"
    model.softApSsidPrefix = @"demo_";
    
    /**
    * 第二步:开始配网
    */
    [kLkAddDevBiz startAddDevice:self];
    
    #pragma mark - 回调方法
    
    - (void)notifyPrecheck:(BOOL)success withError:(NSError *)err
    {
        NSLog(@"notifyPrecheck callback err : %@", err);
    }
    
    /*
     设备热点状态回调,根据不同状态进行提醒。
    status 状态码 
    1=提示应该切换到设备热点; 
    2=已经切换到设备热点 
    3=已发送数据(dic里面会有"token") 
    4=应该切换回路由器 
    5=已经切换回路由器
    */
    - (void)notifyProvisioningNoticeForSoftAp:(int)status withInfo:(NSDictionary *)dic
    {
        NSLog(@"notifyProvisioningNoticeForSoftAp,%d,%@",status,dic);
    }
    
    - (void)notifyProvisionPrepare:(LKPUserGuideCode)guideCode
    {
        NSLog(@"notifyProvisionPrepare callback guide code : %ld", guideCode);
        if(guideCode == LKPGuideCodeWithUserGuideForSoftAp){
            /**
            * 第三步:提醒用户输入切换到设备热点,切换完成后调用toggleProvision,参考inputSsidAndPassword
            */
        }
    }
    
    - (void)inputSsidAndPassword
    {
        NSSstring *ssid = @"example ssid";
        NSString *password = @"1qaz@WSX";
        NSInterger timeout = 60;(单位秒,s);
        [kLkAddDevBiz toggleProvision:ssid pwd:password timeout:timeout];
    }
    
    -(void)notifyProvisioning 
    {
        NSLog(@"notifyProvisioning callback(正在进行配网...) ");
    }
    
    /**
    * 第四步:监听结果回调
    */
    - (void)notifyProvisionResult:(IMLCandDeviceModel *)candDeviceModel withProvisionError:(NSError *)provisionError
    {
        NSLog(@"配网结果:%@",candDeviceModel);
    }

蓝牙辅助配网

  1. 配网SDK版本。
    确认Podfile依赖的配网SDK版本在 1.11.5及以上,并接入了蓝牙SDK。
      # 配网SDK依赖
      pod 'IMSDeviceCenter', '1.11.5'
    
      # 蓝牙SDK依赖
      pod 'IMSBreezeSDK', '1.6.9'
  2. 设置待配网设备信息。
    1. 获取并设置待配设备的型号ProductKey和productID信息。
      获取方式如下。
      • 通过SDK本地发现接口IMLLocalDeviceMgr搜索周边蓝牙辅助配网设备,取得设备信息。
      • 通过直接调用云端接口获取产品列表(非配网SDK提供接口)或App直接展示产品列表,用户选择后确定待配设备productKey及 productID。
      • 通过扫描二维码获得待配设备信息,包含ProductKey及productID。
    2. 调用SDK setDevice设置待配信息。
  3. 开始配网。
    指定配网方式linkTypeForceAliLinkTypeBLE,并调用SDK startAddDevice接口开始配网。
  4. 配网中,处理回调信息。
    配网中,收到notifyProvisionPrepare回调后,提醒用户手动切换到设备热点,切换完成后调用SDK toggleProvision方法传入当前连接路由器的ssidpassword
  5. 监听配网结果。
    示例代码如下。
    /**
    * 第一步:设置待配网设备信息
    */
    //方式一:通过本地发现获取
    [[IMLLocalDeviceMgr sharedMgr] startDiscovery:^(NSArray *devices, NSError *err) {
            //devices 为 IMLCandDeviceModel 对象array,
            // 可根据 IMLCandDeviceModel 中的 devType 区分待配网设备联网类型:
            // devType 为@"ble_subtype_2" 代表蓝牙辅助配网设备*/
    
          //过滤获取出需要的蓝牙辅助设备数据 productId,通过prductId可通过 thing/productInfo/queryProductKey 接口查询到productKey
    
            IMLCandDeviceModel *model = [[IMLCandDeviceModel alloc] init];
            model.productKey = @"xxxx"; 
            model.productId = @"xxxx"; 
            model.linkType = ForceAliLinkTypeBLE;
            [kLkAddDevBiz setDevice:model];
        }];
    
    //方式二:其他获取方式设置
    IMLCandDeviceModel *model = [[IMLCandDeviceModel alloc] init];
    model.productKey = @"xxxx"; 
    model.productId = @"xxxx"; 
    model.linkType = ForceAliLinkTypeBLE;
    [kLkAddDevBiz setDevice:model];
    
    
    /**
    * 第二步:开始配网
    */
    [kLkAddDevBiz startAddDevice:self];
    
    #pragma mark - 回调方法
    
    - (void)notifyPrecheck:(BOOL)success withError:(NSError *)err
    {
        NSLog(@"notifyPrecheck callback err : %@", err);
    }
    
    - (void)notifyProvisionPrepare:(LKPUserGuideCode)guideCode
    {
        NSLog(@"notifyProvisionPrepare callback guide code : %ld", guideCode);
        if(guideCode == LKPGuideCodeOnlyInputPwd){
            /**
            * 第三步:配网中传入Wi-Fi信息
            */
            NSSstring *ssid = @"example ssid";
            NSString *password = @"example pwd";
            NSInterger timeout = 60;(单位秒,s);
            [kLkAddDevBiz toggleProvision:ssid pwd:password timeout:timeout];
        }
    }
    -(void)notifyProvisioning 
    {
        NSLog(@"notifyProvisioning callback(正在进行配网...) ");
    }
    
    /**
    * 第四步:监听结果回调
    */
    - (void)notifyProvisionResult:(IMLCandDeviceModel *)candDeviceModel withProvisionError:(NSError *)provisionError
    {
        NSLog(@"配网结果:%@",candDeviceModel);
    }

一键配网

  1. 设置待配网设备信息。
    1. 获取并设置待配设备的型号ProductKey信息。
      获取方式如下。
      • 通过直接调用云端接口获取产品列表(非配网SDK提供接口)或App直接展示产品列表,用户选择后确定待配设备productKey及 productID。
      • 通过扫描二维码获得设备ProductKey。
    2. 调用SDK setDevice设置待配信息。
  2. 开始配网。
    指定配网方式linkTypeForceAliLinkTypeBroadcast,并调用SDK startAddDevice接口开始配网。
  3. 配网中,处理回调信息。
    配网中,收到notifyProvisionPrepare回调后,提醒用户手动切换到设备热点,切换完成后调用SDK toggleProvision方法传入当前连接路由器的ssidpassword
  4. 监听配网结果。
    示例代码如下。
    /**
    * 第一步:设置待配网设备信息
    */
    IMLCandDeviceModel *model = [[IMLCandDeviceModel alloc] init];
    model.productKey = @"xxx"; 
    model.linkType = ForceAliLinkTypeBroadcast;
    [kLkAddDevBiz setDevice:model];
    
    /**
    * 第二步:开始配网
    * 设置待配信息,开始配网
    */
    [kLkAddDevBiz startAddDevice:self];
    
    #pragma mark - 回调方法
    
    - (void)notifyPrecheck:(BOOL)success withError:(NSError *)err
    {
        NSLog(@"notifyPrecheck callback err : %@", err);
    }
    
    - (void)notifyProvisionPrepare:(LKPUserGuideCode)guideCode
    {
        NSLog(@"notifyProvisionPrepare callback guide code : %ld", guideCode);
        if(guideCode == LKPGuideCodeOnlyInputPwd){
            /**
            * 第三步:配网中传入Wi-Fi信息
            */
            NSSstring *ssid = @"example ssid";
            NSString *password = @"example pwd";
            NSInterger timeout = 60;(单位秒,s);
            [kLkAddDevBiz toggleProvision:ssid pwd:password timeout:timeout];
        }
    }
    -(void)notifyProvisioning 
    {
        NSLog(@"notifyProvisioning callback(正在进行配网...) ");
    }
    
    /**
    * 第四步:监听结果回调
    */
    - (void)notifyProvisionResult:(IMLCandDeviceModel *)candDeviceModel withProvisionError:(NSError *)provisionError
    {
        NSLog(@"配网结果:%@",candDeviceModel);
    }

零配配网

  1. 设置待配网设备信息。
    1. 获取并设置待配设备的信息。
      获取方式为通过SDK本地发现接口 IMLLocalDeviceMgr 搜索周边待配零配设备,取得设备信息。
    2. 调用SDK setDevice设置待配信息。
  2. 开始配网。
    调用SDK startAddDevice接口开始配网。
  3. 配网中,处理回调信息。
    配网中,收到notifyProvisionPrepare回调后,提醒用户手动切换到设备热点,切换完成后调用SDK toggleProvision方法传入当前连接路由器的ssidpassword
  4. 监听配网结果。
    示例代码如下。
    
    /**
    * 第一步:设置待配网设备信息
    */
    [[IMLLocalDeviceMgr sharedMgr] startDiscovery:^(NSArray *devices, NSError *err) {
            //devices 为 IMLCandDeviceModel 对象array,
            // 可根据 IMLCandDeviceModel 中的 addDeviceFrom 为"ZERO_DEVICE" 过滤出零配待配设备信息 model
            [kLkAddDevBiz setDevice:model];
        }];
    
    
    /**
    * 第二步:开始配网
    * 设置待配信息,开始配网
    */
    [kLkAddDevBiz startAddDevice:self];
    
    #pragma mark - 回调方法
    
    - (void)notifyPrecheck:(BOOL)success withError:(NSError *)err
    {
        NSLog(@"notifyPrecheck callback err : %@", err);
    }
    
    -(void)notifyProvisioning 
    {
        NSLog(@"notifyProvisioning callback(正在进行配网...) ");
    }
    
    /**
    * 第四步:监听结果回调
    */
    - (void)notifyProvisionResult:(IMLCandDeviceModel *)candDeviceModel withProvisionError:(NSError *)provisionError
    {
        NSLog(@"配网结果:%@",candDeviceModel);
    }

设备绑定

本SDK提供的获取绑定token的接口。绑定接口非本SDK提供。

获取绑定token。
可通过以下方式获取绑定使用的token。
  • 调用本地发现接口,返回的已配设备列表设备信息中包含token。

    该方式请参照零配的本地发现接口调用示例。

  • 主动调用SDK接口获取token。

    绑定token。使用设备的 ProductKey、DeviceName、Token 调用绑定接口进行绑定。样例代码如下。

    /**
    * 第一步:获取绑定token
    */
    // 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){
            // 拿到绑定需要的token
            /**
            * 第二步:调用绑定接口
            */
            //TODO 用户根据具体业务场景调用
        } else{
            NSLog(@"获取token失败(超时)");
        }
    }];
    • 使用本地发现的设备信息进行绑定的时候,如果出现超时(如获取token之后过了很久才去绑定),可以主动调用getDeviceToken接口更新绑定token后,重新调用绑定接口。
    • 绑定token有一定的有效时限,失败的时候可以主动重试。