生活物聯(lián)網(wǎng)平臺(tái)已提供了一套完整的配網(wǎng)頁(yè)面,如果您希望自己使用Native開(kāi)發(fā)自己的定制化配網(wǎng)頁(yè)面,可以閱讀本文,使用配網(wǎng)SDK進(jìn)行開(kāi)發(fā)。

背景信息

配網(wǎng)SDK提供了把Wi-Fi設(shè)備配置上家庭路由器以及局域網(wǎng)內(nèi)已聯(lián)網(wǎng)設(shè)備的發(fā)現(xiàn)能力,具體方案包括一鍵廣播配網(wǎng)(P2P)、手機(jī)熱點(diǎn)配網(wǎng)、智能路由器配網(wǎng)和設(shè)備間相互配網(wǎng)(以下簡(jiǎn)稱零配)等。各配網(wǎng)方式介紹參見(jiàn)Wi-Fi設(shè)備配網(wǎng)方案介紹配網(wǎng)SDK

設(shè)備熱點(diǎn)配網(wǎng)

  1. 設(shè)置待配網(wǎng)設(shè)備信息。
    1. 選擇配網(wǎng)方式。
      設(shè)備熱點(diǎn)支持指定產(chǎn)品型號(hào)productKey進(jìn)行配網(wǎng),也支持不指定型號(hào)直接開(kāi)始配網(wǎng)(詳細(xì)參見(jiàn)下方代碼)。

      獲取產(chǎn)品型號(hào)productKey的方式如下。

      • 通過(guò)直接調(diào)用云端接口獲取產(chǎn)品列表(非配網(wǎng)SDK提供接口)或App直接展示產(chǎn)品列表,用戶選擇后確定待配設(shè)備productKey。
      • 通過(guò)掃描產(chǎn)品二維碼,獲得設(shè)備ProductKey。
    2. 調(diào)用SDK setDevice設(shè)置待配信息。
  2. 開(kāi)始配網(wǎng)。
    指定配網(wǎng)方式linkTypeForceAliLinkTypeSoftap,并調(diào)用SDK startAddDevice接口開(kāi)始配網(wǎng)。
  3. 配網(wǎng)中,處理回調(diào)信息。
    配網(wǎng)中,收到notifyProvisionPrepare回調(diào)后,提醒用戶手動(dòng)切換到設(shè)備熱點(diǎn),切換完成后調(diào)用SDK toggleProvision方法傳入當(dāng)前連接路由器的ssidpassword
  4. 監(jiān)聽(tīng)配網(wǎng)結(jié)果。
    /**
    * 第一步:設(shè)置待配網(wǎng)設(shè)備信息
    */
    //方式一:指定productKey方式
    IMLCandDeviceModel *model = [[IMLCandDeviceModel alloc] init];
    model.productKey = @"xxxx"; 
    model.linkType = ForceAliLinkTypeSoftap;
    [kLkAddDevBiz setDevice:model];
    
    //方式二:不指定型號(hào)
    IMLCandDeviceModel *model = [[IMLCandDeviceModel alloc] init];
    model.protocolVersion = @"2.0";
    model.linkType = ForceAliLinkTypeSoftap;
    [kLkAddDevBiz setDevice:model];
    
    //若希望自定義設(shè)備熱點(diǎn)前綴,例如前綴為"demo_"
    model.softApSsidPrefix = @"demo_";
    
    /**
    * 第二步:開(kāi)始配網(wǎng)
    */
    [kLkAddDevBiz startAddDevice:self];
    
    #pragma mark - 回調(diào)方法
    
    - (void)notifyPrecheck:(BOOL)success withError:(NSError *)err
    {
        NSLog(@"notifyPrecheck callback err : %@", err);
    }
    
    /*
     設(shè)備熱點(diǎn)狀態(tài)回調(diào),根據(jù)不同狀態(tài)進(jìn)行提醒。
    status 狀態(tài)碼 
    1=提示應(yīng)該切換到設(shè)備熱點(diǎn); 
    2=已經(jīng)切換到設(shè)備熱點(diǎn) 
    3=已發(fā)送數(shù)據(jù)(dic里面會(huì)有"token") 
    4=應(yīng)該切換回路由器 
    5=已經(jīng)切換回路由器
    */
    - (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){
            /**
            * 第三步:提醒用戶輸入切換到設(shè)備熱點(diǎn),切換完成后調(diào)用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(正在進(jìn)行配網(wǎng)...) ");
    }
    
    /**
    * 第四步:監(jiān)聽(tīng)結(jié)果回調(diào)
    */
    - (void)notifyProvisionResult:(IMLCandDeviceModel *)candDeviceModel withProvisionError:(NSError *)provisionError
    {
        NSLog(@"配網(wǎng)結(jié)果:%@",candDeviceModel);
    }

藍(lán)牙輔助配網(wǎng)

  1. 配網(wǎng)SDK版本。
    確認(rèn)Podfile依賴的配網(wǎng)SDK版本在 1.11.5及以上,并接入了藍(lán)牙SDK。
      # 配網(wǎng)SDK依賴
      pod 'IMSDeviceCenter', '1.11.5'
    
      # 藍(lán)牙SDK依賴
      pod 'IMSBreezeSDK', '1.6.9'
  2. 設(shè)置待配網(wǎng)設(shè)備信息。
    1. 獲取并設(shè)置待配設(shè)備的型號(hào)ProductKey和productID信息。
      獲取方式如下。
      • 通過(guò)SDK本地發(fā)現(xiàn)接口IMLLocalDeviceMgr搜索周邊藍(lán)牙輔助配網(wǎng)設(shè)備,取得設(shè)備信息。
      • 通過(guò)直接調(diào)用云端接口獲取產(chǎn)品列表(非配網(wǎng)SDK提供接口)或App直接展示產(chǎn)品列表,用戶選擇后確定待配設(shè)備productKey及 productID。
      • 通過(guò)掃描二維碼獲得待配設(shè)備信息,包含ProductKey及productID。
    2. 調(diào)用SDK setDevice設(shè)置待配信息。
  3. 開(kāi)始配網(wǎng)。
    指定配網(wǎng)方式linkTypeForceAliLinkTypeBLE,并調(diào)用SDK startAddDevice接口開(kāi)始配網(wǎng)。
  4. 配網(wǎng)中,處理回調(diào)信息。
    配網(wǎng)中,收到notifyProvisionPrepare回調(diào)后,提醒用戶手動(dòng)切換到設(shè)備熱點(diǎn),切換完成后調(diào)用SDK toggleProvision方法傳入當(dāng)前連接路由器的ssidpassword
  5. 監(jiān)聽(tīng)配網(wǎng)結(jié)果。
    示例代碼如下。
    /**
    * 第一步:設(shè)置待配網(wǎng)設(shè)備信息
    */
    //方式一:通過(guò)本地發(fā)現(xiàn)獲取
    [[IMLLocalDeviceMgr sharedMgr] startDiscovery:^(NSArray *devices, NSError *err) {
            //devices 為 IMLCandDeviceModel 對(duì)象array,
            // 可根據(jù) IMLCandDeviceModel 中的 devType 區(qū)分待配網(wǎng)設(shè)備聯(lián)網(wǎng)類(lèi)型:
            // devType 為@"ble_subtype_2" 代表藍(lán)牙輔助配網(wǎng)設(shè)備*/
    
          //過(guò)濾獲取出需要的藍(lán)牙輔助設(shè)備數(shù)據(jù) productId,通過(guò)prductId可通過(guò) thing/productInfo/queryProductKey 接口查詢到productKey
    
            IMLCandDeviceModel *model = [[IMLCandDeviceModel alloc] init];
            model.productKey = @"xxxx"; 
            model.productId = @"xxxx"; 
            model.linkType = ForceAliLinkTypeBLE;
            [kLkAddDevBiz setDevice:model];
        }];
    
    //方式二:其他獲取方式設(shè)置
    IMLCandDeviceModel *model = [[IMLCandDeviceModel alloc] init];
    model.productKey = @"xxxx"; 
    model.productId = @"xxxx"; 
    model.linkType = ForceAliLinkTypeBLE;
    [kLkAddDevBiz setDevice:model];
    
    
    /**
    * 第二步:開(kāi)始配網(wǎng)
    */
    [kLkAddDevBiz startAddDevice:self];
    
    #pragma mark - 回調(diào)方法
    
    - (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){
            /**
            * 第三步:配網(wǎng)中傳入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(正在進(jìn)行配網(wǎng)...) ");
    }
    
    /**
    * 第四步:監(jiān)聽(tīng)結(jié)果回調(diào)
    */
    - (void)notifyProvisionResult:(IMLCandDeviceModel *)candDeviceModel withProvisionError:(NSError *)provisionError
    {
        NSLog(@"配網(wǎng)結(jié)果:%@",candDeviceModel);
    }

一鍵配網(wǎng)

  1. 設(shè)置待配網(wǎng)設(shè)備信息。
    1. 獲取并設(shè)置待配設(shè)備的型號(hào)ProductKey信息。
      獲取方式如下。
      • 通過(guò)直接調(diào)用云端接口獲取產(chǎn)品列表(非配網(wǎng)SDK提供接口)或App直接展示產(chǎn)品列表,用戶選擇后確定待配設(shè)備productKey及 productID。
      • 通過(guò)掃描二維碼獲得設(shè)備ProductKey。
    2. 調(diào)用SDK setDevice設(shè)置待配信息。
  2. 開(kāi)始配網(wǎng)。
    指定配網(wǎng)方式linkTypeForceAliLinkTypeBroadcast,并調(diào)用SDK startAddDevice接口開(kāi)始配網(wǎng)。
  3. 配網(wǎng)中,處理回調(diào)信息。
    配網(wǎng)中,收到notifyProvisionPrepare回調(diào)后,提醒用戶手動(dòng)切換到設(shè)備熱點(diǎn),切換完成后調(diào)用SDK toggleProvision方法傳入當(dāng)前連接路由器的ssidpassword
  4. 監(jiān)聽(tīng)配網(wǎng)結(jié)果。
    示例代碼如下。
    /**
    * 第一步:設(shè)置待配網(wǎng)設(shè)備信息
    */
    IMLCandDeviceModel *model = [[IMLCandDeviceModel alloc] init];
    model.productKey = @"xxx"; 
    model.linkType = ForceAliLinkTypeBroadcast;
    [kLkAddDevBiz setDevice:model];
    
    /**
    * 第二步:開(kāi)始配網(wǎng)
    * 設(shè)置待配信息,開(kāi)始配網(wǎng)
    */
    [kLkAddDevBiz startAddDevice:self];
    
    #pragma mark - 回調(diào)方法
    
    - (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){
            /**
            * 第三步:配網(wǎng)中傳入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(正在進(jìn)行配網(wǎng)...) ");
    }
    
    /**
    * 第四步:監(jiān)聽(tīng)結(jié)果回調(diào)
    */
    - (void)notifyProvisionResult:(IMLCandDeviceModel *)candDeviceModel withProvisionError:(NSError *)provisionError
    {
        NSLog(@"配網(wǎng)結(jié)果:%@",candDeviceModel);
    }

零配配網(wǎng)

  1. 設(shè)置待配網(wǎng)設(shè)備信息。
    1. 獲取并設(shè)置待配設(shè)備的信息。
      獲取方式為通過(guò)SDK本地發(fā)現(xiàn)接口 IMLLocalDeviceMgr 搜索周邊待配零配設(shè)備,取得設(shè)備信息。
    2. 調(diào)用SDK setDevice設(shè)置待配信息。
  2. 開(kāi)始配網(wǎng)。
    調(diào)用SDK startAddDevice接口開(kāi)始配網(wǎng)。
  3. 配網(wǎng)中,處理回調(diào)信息。
    配網(wǎng)中,收到notifyProvisionPrepare回調(diào)后,提醒用戶手動(dòng)切換到設(shè)備熱點(diǎn),切換完成后調(diào)用SDK toggleProvision方法傳入當(dāng)前連接路由器的ssidpassword
  4. 監(jiān)聽(tīng)配網(wǎng)結(jié)果。
    示例代碼如下。
    
    /**
    * 第一步:設(shè)置待配網(wǎng)設(shè)備信息
    */
    [[IMLLocalDeviceMgr sharedMgr] startDiscovery:^(NSArray *devices, NSError *err) {
            //devices 為 IMLCandDeviceModel 對(duì)象array,
            // 可根據(jù) IMLCandDeviceModel 中的 addDeviceFrom 為"ZERO_DEVICE" 過(guò)濾出零配待配設(shè)備信息 model
            [kLkAddDevBiz setDevice:model];
        }];
    
    
    /**
    * 第二步:開(kāi)始配網(wǎng)
    * 設(shè)置待配信息,開(kāi)始配網(wǎng)
    */
    [kLkAddDevBiz startAddDevice:self];
    
    #pragma mark - 回調(diào)方法
    
    - (void)notifyPrecheck:(BOOL)success withError:(NSError *)err
    {
        NSLog(@"notifyPrecheck callback err : %@", err);
    }
    
    -(void)notifyProvisioning 
    {
        NSLog(@"notifyProvisioning callback(正在進(jìn)行配網(wǎng)...) ");
    }
    
    /**
    * 第四步:監(jiān)聽(tīng)結(jié)果回調(diào)
    */
    - (void)notifyProvisionResult:(IMLCandDeviceModel *)candDeviceModel withProvisionError:(NSError *)provisionError
    {
        NSLog(@"配網(wǎng)結(jié)果:%@",candDeviceModel);
    }

設(shè)備綁定

本SDK提供的獲取綁定token的接口。綁定接口非本SDK提供。

獲取綁定token。
可通過(guò)以下方式獲取綁定使用的token。
  • 調(diào)用本地發(fā)現(xiàn)接口,返回的已配設(shè)備列表設(shè)備信息中包含token。

    該方式請(qǐng)參照零配的本地發(fā)現(xiàn)接口調(diào)用示例。

  • 主動(dòng)調(diào)用SDK接口獲取token。

    綁定token。使用設(shè)備的 ProductKey、DeviceName、Token 調(diào)用綁定接口進(jìn)行綁定。樣例代碼如下。

    /**
    * 第一步:獲取綁定token
    */
    // self.productKey 和 self.deviceName 是配網(wǎng)成功后返回的物模型中的 productKey 和 deviceName
    [[IMLLocalDeviceMgr sharedMgr] getDeviceToken:self.productKey deviceName:self.deviceName timeout:20 resultBlock:^(NSString *token, BOOL boolSuccess) {
        NSLog(@"主動(dòng)獲取設(shè)備token:%@,boolSuccess:%d", token, boolSuccess);
        if(token){
            // 拿到綁定需要的token
            /**
            * 第二步:調(diào)用綁定接口
            */
            //TODO 用戶根據(jù)具體業(yè)務(wù)場(chǎng)景調(diào)用
        } else{
            NSLog(@"獲取token失敗(超時(shí))");
        }
    }];
    • 使用本地發(fā)現(xiàn)的設(shè)備信息進(jìn)行綁定的時(shí)候,如果出現(xiàn)超時(shí)(如獲取token之后過(guò)了很久才去綁定),可以主動(dòng)調(diào)用getDeviceToken接口更新綁定token后,重新調(diào)用綁定接口。
    • 綁定token有一定的有效時(shí)限,失敗的時(shí)候可以主動(dòng)重試。