藍牙可以輔助純Wi-Fi方式來配網(wǎng),當Wi-Fi配網(wǎng)出現(xiàn)錯誤時,還可以用來反饋錯誤信息,幫助用戶定位問題。當您的自有App需要藍牙輔助配網(wǎng)功能時,請根據(jù)本文檔開發(fā)Android自有App中藍牙輔助配網(wǎng)功能。
前提條件
- 創(chuàng)建一個自有App,詳細操作請參見創(chuàng)建自有App。
- 選擇下面任一方式獲取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'
- maven倉庫
- 初始化SDK。
- (可選)開發(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)限申請。 - 開發(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做綁定 } });
- 獲取設(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) { } });