本章節提供了把WiFi設備配置上家庭路由器以及局域網內已聯網設備的發現能力,具體方案包括一鍵廣播配網、手機熱點配網、藍牙輔助配網、智能路由器配網以及設備間相互配網等。
依賴SDK | 概述 |
日志 | 基礎依賴SDK,提供客戶端統一日志打印,日志等級控制,分模塊日志隔離等能力。 |
API通道 | 提供API通道能力,和基礎環境配置信息。 |
Breeze SDK | 提供藍牙輔助配網支持。 |
初始化
使用說明
設備發現
提供獲取局域網內已經配網的設備,包括WiFi設備以及以太網設備,以及局域網內已上電的待配設備(前提是當前局域網內內已經有一個已配好網的智能設備,且該設備支持未待配設備進行配網的能力)。
啟動發現設備
發現本地的已配網設備,或者已配網設備、路由器發現的待配設備。發現的待配設備信息可以作為后續設備配網的入參信息。
// 引入頭文件 #import <IMSDeviceCenter/IMLDeviceCenter.h> // 本地發現入口 [[IMLLocalDeviceMgr sharedMgr] startDiscovery:^(NSArray *devices, NSError *err) { //devices 為 IMLCandDeviceModel 對象array, // 可根據 IMLCandDeviceModel 中的 devType 區分待配網設備聯網類型: // 0代表wifi設備;1代表ethernet設備(網線連接):2代表路由器 ; @"ble_subtype_2" 代表藍牙輔助配網設備*/ }];
獲取所有已發現設備
// 引入頭文件 #import <IMSDeviceCenter/IMLDeviceCenter.h> NSArray *allLanDevicesArray = [kLKLocalDeviceMgr getLanDevices];
終止發現設備
停止發現本地已配和線上待配設備,調用該接口會清除已發現設備列表,確保和
startDiscovery
成對調用。// 引入頭文件 #import <IMSDeviceCenter/IMLDeviceCenter.h> // 停止發現設備 [kLKLocalDeviceMgr stopDiscovery];
通用配網流程
設置待添加設備信息
待添加設備信息來源可以為上面本地發現的待配設備,也可以通過掃碼等其他途徑獲取待配設備信息。
// 引入頭文件 #import <IMSDeviceCenter/IMLDeviceCenter.h> // 選取本地發現的待配設備 IMLCandDeviceModel *model = self.localDeviceList[index]; [kLkAddDevBiz setDevice:model];
說明其中(IMLCandDeviceModel *)model 為本地發現待配設備或者云端拉取產品列表組裝的model。
本地發現設備參見上述設備發現部分內容。
IMLCandDeviceModel
屬性說明如下:屬性
類型
是否必選
描述
productKey
NSString
是
設備的ProductKey
deviceName
NSString
否
設備名稱
productId
NSString
否
待配設備產品ID,藍牙輔助配網時為必選參數
linkType
assign
否
指定配網方式
ForceAliLinkTypeBroadcast
:一鍵廣播配網;ForceAliLinkTypeHotspot
:手機熱點配網;ForceAliLinkTypeSoftap
:設備熱點配網;ForceAliLinkTypeQR
:攝像頭掃碼配網;ForceAliLinkTypeBLE
:藍牙輔助配網。
設置配網模式
// 引入頭文件 #import <IMSDeviceCenter/IMLDeviceCenter.h> [kLkAddDevBiz setAliProvisionMode:ForceAliLinkTypeHotspot];
開始設備配網
上述設置好待添加設備信息,進入配網。調用
startAddDevice
接口進入配網流程,并實現監聽的協議方法。// 引入頭文件 #import <IMSDeviceCenter/IMLDeviceCenter.h> [kLkAddDevBiz startAddDevice:self]; 其中 self 為配網過程中 notifier 監聽回調對象(代理) - (void)notifyPrecheck:(BOOL)success withError:(NSError *)err { NSLog(@"notifyPrecheck callback err : %@", err); dispatch_async(dispatch_get_main_queue(), ^{ [self.addVC notifyProgress:LKAddStatePrechecking result:nil withError:err]; }); } // 用戶引導頁(一鍵配網和熱點配網會有相關回調,指引用戶接入相關操作) - (void)notifyProvisionPrepare:(LKPUserGuideCode)guideCode { NSLog(@"notifyProvisionPrepare callback guide code : %ld", guideCode); if(guideCode == LKPGuideCodeOnlyInputPwd){ // TODO:一鍵廣播配網相關引導 } else if(guideCode == LKPGuideCodeWithUserGuide){ // TODO:手機熱點配網相關引導 } else if(guideCode == LKPGuideCodeWithUserGuideForSoftAp) { // TODO:設備熱點配網相關引導 } else if(guideCode == LKPGuideCodeWithUserGuideForQR) { // TODO:攝像頭掃碼配網相關引導 } } -(void)notifyProvisioning { NSLog(@"notifyProvisioning callback(正在進行配網...) "); } /** 手機熱點配網狀態回掉調,提示用戶關閉熱點并切回以前的wifi,optional。 */ - (void)notifyProvisioningNotice{ NSLog(@"notifyProvisioningNotice"); } /* 設備熱點狀態回調,optional。 status 狀態碼 1=提示應該切換到設備熱點; 2=已經切換到設備熱點 3=已發送數據(dic里面會有"token") 4=應該切換回路由器 5=已經切換回路由器 */ - (void)notifyProvisioningNoticeForSoftAp:(int)status withInfo:(NSDictionary *)dic { NSLog(@"notifyProvisioningNoticeForSoftAp,%d,%@",status,dic); } /** 攝像頭二維碼配網模式相關回調,optional @param qrcode 需要UI展現的二維碼內容 */ - (void)notifyProvisioningNoticeForQR:(NSString *) qrcode; /** 通知上層UI:配網完成結果回調 @param candDeviceModel 配網結果設備信息返回:配網失敗時為 nil @param provisionError 錯誤信息 */ - (void)notifyProvisionResult:(IMLCandDeviceModel *)candDeviceModel withProvisionError:(NSError *)provisionError { NSLog(@"配網成功:%@",candDeviceModel); }
輸入配網WiFi名稱以及密碼信息
在收到
- (void)notifyProvisionPrepare:(LKPUserGuideCode)guideCode
回調引導完成相關操作(一鍵廣播指引用戶輸入ssid
和密碼,熱點配網指引用戶開啟熱點,輸入ssid
和密碼等)后,調用- (void)toggleProvision:(NSString *)ssid pwd:(NSString *)pwd timeout:(int)timeout
方法,傳入WiFi的ssid
及password
信息。說明一鍵廣播配網和熱點配網才會有
notifyProvisionPrepare
回調。// 引入頭文件 #import <IMSDeviceCenter/IMLDeviceCenter.h> - (void)notifyProvisionPrepare:(LKPUserGuideCode)guideCode { NSLog(@"notifyProvisionPrepare callback guide code : %ld", guideCode); [self inputSsidAndPassword]; } - (void)inputSsidAndPassword { NSSstring *ssid = @"example ssid"; NSString *password = @"1qaz@WSX"; NSInterger timeout = 60;(單位秒,s); [kLkAddDevBiz toggleProvision:ssid pwd:password timeout:timeout]; }
配網過程關鍵節點監聽處理
針對熱點配網必須監聽該回調。
// 引入頭文件 #import <IMSDeviceCenter/IMLDeviceCenter.h> - (void)notifyProvisionStatus:(LKProvisonStatus)provisionStatus boolSuccess:(BOOL)boolSuccess; { NSLog(@"notifyProvisionStatus callback provisionStatus:%d boolSuccess:%d", provisionStatus, boolSuccess); if(provisionStatus == LKProvisonStatusSwitchAP){ // 設備回復 switch ap 請求,提示用戶切換回之前的 wifi NSLog(@"請立即切換回開啟熱點之前的 wifi 網絡"); } }
配網結果監聽
- (void)notifyProvisionResult:(IMLCandDeviceModel *)candDeviceModel withProvisionError:(NSError *)provisionError { if(candDeviceModel != nil){ NSLog(@"配網成功:%@",candDeviceModel); } else{ NSLog(@"配網失敗,錯誤信息:%@", provisionError); } }
停止配網
// 引入頭文件 #import <IMSDeviceCenter/IMLDeviceCenter.h> [kLkAddDevBiz stopAddDevice];
設備綁定
當完成設備配網之后,后續需要將設備與用戶或者與家庭做一個關聯綁定,在綁定的時候需要調用SDK的獲取token方法,取得設備token,然后進行設備綁定。獲取token的代碼如下。
// 引入頭文件 #import <IMSDeviceCenter/IMLDeviceCenter.h> // 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){ // 調用綁定接口進行設備綁定 } else{ NSLog(@"獲取token失敗(超時)"); } }];
使用配網插件
配網插件基于Bone容器實現了完整的配網邏輯,因此在接入Bone容器的前提下,可以直接打開配網插件來完成配網邏輯,然后再自行處理配網之后的邏輯。
目前配網插件ID如下所示:
插件ID國內版:a123kfz2KdRdrfYc
插件ID國際版:a223c2beCJQ2Xpk2
插件ID的具體使用方式,參考見Bone容器部分。也可以參見配網開發指南中調用平臺提供的配網插件的內容。