藍牙輔助配網可以讓手機App將WiFi熱點信息通過藍牙傳遞給設備,配網錯誤信息也可以通過藍牙通道反饋給手機用戶來定位問題。若您希望通過iOS系統對您的設備使用藍牙進行配網,請根據本文檔進行功能的開發。

前提條件

已完成控制臺上產品開發工作,以及藍牙輔助配網的設備端開發,請參見設備端開發

操作步驟

  1. 創建一個自有App,詳細操作請參見創建自有App
  2. 選擇下面任一方式獲取SDK。
    • 從控制臺下載并集成SDK(需勾選配網套餐包),請參見下載并集成SDK
    • 在App工程中更新如下代碼。
      # SDK最低支持版本為iOS 9.0 
      platform :ios, '9.0' 
      
      # github官方pod源
      source 'https://github.com/CocoaPods/Specs.git' 
      
      # 阿里云pod源
      source 'https://github.com/aliyun/aliyun-specs.git' 
      
      # 需要替換下述"IMSDemoApp"為開發者App的target名稱 
      target "IMSDemoApp" do 
      
        ...
      
        # 配網SDK依賴
        pod 'IMSDeviceCenter', '1.11.5'
      
        # 藍牙SDK依賴
        pod 'IMSBreezeSDK', '1.6.9'
      
        ...
      
      end
  3. 初始化SDK。
    藍牙輔助配網依賴和云端的交互,在調用配網SDK之前需要先完成SDK初始化,可參見SDK初始化(API網關接口使用示例請參見API通道SDK)。
  4. (可選)開發設備發現。
    設備發現接口提供發現附近的藍牙輔助配網、零配、設備熱點配網的待配設備和局域網已配設備的能力。這里介紹藍牙輔助配網,示例代碼會只選發現藍牙輔助配網待配設備。
    說明 Wi-Fi&BLE Combo藍牙模塊廣播的subType必須設置為2(表示藍牙Wi-Fi雙模設備),才能保障設備被藍牙輔助配網方式發現。
    // 引入頭文件
    #import <IMLDeviceCenter/IMLDeviceCenter.h>
    
    // 本地發現入口
    [[IMLLocalDeviceMgr sharedMgr] startDiscovery:^(NSArray *devices, NSError *err) {
            //devices 為 IMLCandDeviceModel 對象array,
            // 可根據 IMLCandDeviceModel 中的 devType 區分待配網設備聯網類型;
            // devType 為@"ble_subtype_2" 代表藍牙輔助配網設備*/
        }];
  5. 開發設備配網。
    // 引入頭文件
    #import <IMLDeviceCenter/IMLDeviceCenter.h>
    
    
    /**
     * 第一步,設置待添加設備信息
     * 包含設備的productKey、productId信息
     * 配網的信息可以通過上面的發現接口來獲取,也可以直接通過掃碼的方式拿到配網所需要的信息開始配網。
     * 不是通過發現接口進行藍牙輔助配網的需要確保當前確實有進入配網狀態的combo設備,并能被發現。
    */
    
    // 自行創建待配設備信息
    IMLCandDeviceModel *model = [[IMLCandDeviceModel alloc] init];
    // 商家后臺注冊的 productKey,不可為空
    model.productKey = @"xxxx"; 
    // 產品 ID, 藍牙輔助配網必須
    model.productId = @"xxx";
    // 設置為藍牙輔助配網模式
    model.linkType = ForceAliLinkTypeBLE;
    //設置待添加設備的基本信息
    [kLkAddDevBiz setDevice:model];
    
    
    /**
     * 第二步,開始配網
     * 設置配網信息回調
    */
    //其中 self 為配網過程中 notifier 監聽回調對象(代理)
    [kLkAddDevBiz startAddDevice:self];
    
    - (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){
            // 輸入WiFi及密碼相關引導,執行第三步
            /**
             * 第三步,設置 Wi-Fi 信息
             * 設置需要設備連接的 Wi-Fi 的ssid、password、配網超時時間信息
            */
            // 需要設備連接的 Wi-Fi ssid,一般為當前 Wi-Fi
            NSSstring *ssid = @"example ssid";
            // 需要設備連接的 Wi-Fi password,一般為當前 Wi-Fi
            NSString *password = @"1qaz@WSX";
            NSInterger timeout = 60;(單位秒,s);//單位秒,目前最短只能設置60S
    
            [kLkAddDevBiz toggleProvision:ssid pwd:password timeout:timeout];
        }
    }
    
    -(void)notifyProvisioning 
    {
        NSLog(@"notifyProvisioning callback(正在進行配網...) ");
    }
    
    /**
     通知上層UI:配網完成結果回調
    
     @param candDeviceModel 配網結果設備信息返回:配網失敗時為 nil
     @param provisionError 錯誤信息
     */
    
    - (void)notifyProvisionResult:(IMLCandDeviceModel *)candDeviceModel withProvisionError:(NSError *)provisionError
    {
        NSLog(@"配網結果:%@",candDeviceModel);
        /**
         * 第四步,接收配網結果
        */
        if(candDeviceModel != nil){
            NSLog(@"配網成功:%@",candDeviceModel);
        } else{
            NSLog(@"配網失敗,錯誤信息;%@", provisionError);
        }
    
        // 配網結果:如果配網成功之后包含token,請使用配網成功帶的token做綁定
    }
  6. 獲取設備綁定Token。

    獲取設備綁定Token需要productKey、deviceName、超時時間、輪詢間隔。該接口提供從設備端獲取綁定token的功能。配網SDK不包含綁定的邏輯,實現綁定邏輯可參見基于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){
        // 調用綁定接口進行設備綁定
        } else{
            NSLog(@"獲取token失敗(超時)");
        }
    }];