藍牙可以輔助純Wi-Fi方式來配網(wǎng),當Wi-Fi配網(wǎng)出現(xiàn)錯誤時,還可以用來反饋錯誤信息,幫助用戶定位問題。當您的自有App需要藍牙輔助配網(wǎng)功能時,請根據(jù)本文檔開發(fā)Android自有App中藍牙輔助配網(wǎng)功能。

前提條件

已完成控制臺上產(chǎn)品開發(fā)工作,以及藍牙輔助配網(wǎng)的設(shè)備端開發(fā),請參見設(shè)備端開發(fā)
  1. 創(chuàng)建一個自有App,詳細操作請參見創(chuàng)建自有App
  2. 選擇下面任一方式獲取SDK。
    • 從控制臺下載并集成SDK(需勾選配網(wǎng)套餐包),請參見下載并集成SDK
    • 在App工程中添加如下代碼。
      • maven倉庫
        maven {
            url "http://maven.aliyun.com/nexus/content/repositories/releases/"
        }
      • gradle依賴
        // 配網(wǎng)SDK依賴
        api('com.aliyun.alink.linksdk:ilop-devicecenter:1.7.5')
        // api通道 依賴
        api('com.aliyun.alink.linksdk:api-client-biz:1.0.1')
        // 藍牙SDK依賴
        api 'com.aliyun.alink.linksdk:breeze-biz:1.1.4'
  3. 初始化SDK。
    藍牙輔助配網(wǎng)依賴和云端的交互,在調(diào)用配網(wǎng)SDK之前需要先完成SDK初始化,請參見SDK初始化(API網(wǎng)關(guān)接口的使用示例請參見API通道SDK)。
  4. (可選)開發(fā)發(fā)現(xiàn)設(shè)備。
    設(shè)備發(fā)現(xiàn)接口提供發(fā)現(xiàn)附近的藍牙輔助配網(wǎng)、零配、設(shè)備熱點配網(wǎng)的待配設(shè)備和局域網(wǎng)已配設(shè)備的能力。這里介紹藍牙輔助配網(wǎng),示例代碼會只選發(fā)現(xiàn)藍牙輔助配網(wǎng)待配設(shè)備。
    說明 Wi-Fi&BLE Combo藍牙模塊廣播的subType必須設(shè)置為2(表示藍牙Wi-Fi雙模設(shè)備),才能保障設(shè)備被藍牙輔助配網(wǎng)方式發(fā)現(xiàn)。
    // 開始發(fā)現(xiàn)藍牙輔助配網(wǎng)待配設(shè)備
    // 第三個參數(shù)是其它發(fā)現(xiàn)方式需要的,這里直接置為null
    final EnumSet<DiscoveryType> discoveryTypes = EnumSet.of(DiscoveryType.BLE_ENROLLEE_DEVICE);
    LocalDeviceMgr.getInstance().startDiscovery(context, enumSet, null, new IDeviceDiscoveryListener() {
        @Override
        public void onDeviceFound(DiscoveryType discoveryType, List<DeviceInfo> list) {
            // 發(fā)現(xiàn)的設(shè)備
            // discoveryType=BLE_ENROLLEE_DEVICE 表示發(fā)現(xiàn)的是藍牙Wi-Fi雙模設(shè)備
            //如果發(fā)現(xiàn)到藍牙輔助配網(wǎng)的待配設(shè)備,返回的設(shè)備信息只包含productId,
            //用戶需要根據(jù)productId獲取產(chǎn)品對應的productKey相關(guān)信息,然后開始后續(xù)的配網(wǎng)。
        }
    });
    說明 在聯(lián)調(diào)藍牙輔助配網(wǎng)發(fā)現(xiàn)和配網(wǎng)的時候,需要確保App具有位置權(quán)限,且藍牙處于打開狀態(tài); 在app開發(fā)時需要做相應的權(quán)限檢測和權(quán)限申請。
  5. 開發(fā)設(shè)備配網(wǎng)。

    設(shè)備配網(wǎng)主要包含四個流程(設(shè)置配網(wǎng)設(shè)備信息、開始配網(wǎng)、設(shè)置Wi-Fi信息、接收配網(wǎng)結(jié)果),詳細介紹參見以下代碼示例。

    /**
     * 第一步 設(shè)置配網(wǎng)設(shè)備信息
     * 包含設(shè)備的productKey、productId信息
     * 配網(wǎng)的信息可以通過上面的發(fā)現(xiàn)接口來獲取,也可以直接通過掃碼的方式拿到配網(wǎng)所需要的信息開始配網(wǎng)。
     * 不是通過發(fā)現(xiàn)接口進行藍牙輔助配網(wǎng)的需要確保當前確實有進入配網(wǎng)狀態(tài)的combo設(shè)備,并能被發(fā)現(xiàn)。
    */
    DeviceInfo deviceInfo = new DeviceInfo();
    // 商家后臺注冊的 productKey,不可為空
    deviceInfo.productKey = "xx"; 
    // 產(chǎn)品 ID, 藍牙輔助配網(wǎng)必須
    deviceInfo.productId = "xxx";
    deviceInfo.linkType = "ForceAliLinkTypeBLE"; // 默認一鍵配網(wǎng)  
    //設(shè)置待添加設(shè)備的基本信息
    AddDeviceBiz.getInstance().setDevice(deviceinfo);
    
    /**
     * 第二步 開始配網(wǎng)
     * 設(shè)置配網(wǎng)信息回調(diào)
    */
    AddDeviceBiz.getInstance().startAddDevice(context, new IAddDeviceListener(){
        @Override
        public void onPreCheck(boolean b, DCErrorCode dcErrorCode) {
            // 參數(shù)檢測回調(diào) 
        }
    
        @Override
        public void onProvisionPrepare(int prepareType) {
    
            // prepareType = 1 執(zhí)行第三步
            /**
             * 第三步 設(shè)置Wi-Fi信息
             * 設(shè)置需要設(shè)備連接的Wi-Fi的ssid、password、配網(wǎng)超時時間信息
            */
             // 需要設(shè)備連接Wi-Fi的ssid,一般為當前Wi-Fi
            String ssid = "ssid";
            // 需要設(shè)備連接Wi-Fi的password,一般為當前Wi-Fi
            String ssid = "xxxxxxxx";
            int timeout = 60;//單位秒 目前最短只能設(shè)置60S
            AddDeviceBiz.getInstance().toggleProvision(ssid, password, timeout);
    
        }
    
        @Override
        public void onProvisioning() {
            // 配網(wǎng)中
        }
    
        @Override 
        public void onProvisionStatus(ProvisionStatus provisionStatus) {
        }
    
        @Override
        public void onProvisionedResult(boolean isSuccess, DeviceInfo deviceInfo, DCErrorCode errorCode) {
            /**
             * 第四步 接收配網(wǎng)結(jié)果
             * isSuccess = true 表示配網(wǎng)成功,deviceInfo會包含設(shè)備的productKey、deviceName相關(guān)信息
             * isSuccess = false 表示配網(wǎng)失敗,errorCode會包含配網(wǎng)失敗的錯誤code和原因;
            */
            // 配網(wǎng)結(jié)果 如果配網(wǎng)成功之后包含token,請使用配網(wǎng)成功帶的token做綁定
        }
    });
  6. 獲取設(shè)備綁定Token。

    獲取設(shè)備綁定Token需要productKey、deviceName、超時時間、輪詢間隔。該接口提供從設(shè)備端獲取綁定token的功能。配網(wǎng)SDK不包含綁定的邏輯,實現(xiàn)綁定邏輯可參見基于token方式設(shè)備綁定

    /**
     * 獲取設(shè)備端綁定的token
     * 該接口需要設(shè)備配網(wǎng)成功,且設(shè)備連云成功后,才會出現(xiàn)成功返回。
     * 60*1000 ms表示總超時時間,5*1000表示每5s去查詢一次
    */
    LocalDeviceMgr.getInstance().getDeviceToken(context, productKey, deviceName, 60*1000, 5*1000, new IOnDeviceTokenGetListener() {
                @Override
                public void onSuccess(String token) {
                    // TODO 設(shè)備綁定
                }
    
                @Override
                public void onFail(String reason) {
                }
            });