本章節提供了把WiFi設備配置上家庭路由器以及局域網內已聯網設備的發現能力,具體方案包括一鍵廣播配網(P2P)、手機熱點配網、藍牙輔助配網、智能路由器配網、設備間相互配網以及藍牙Mesh配網等。
依賴SDK | 概述 |
API 通道 | 提供云端API通道能力,需要完成該SDK的初始化。 |
身份認證 | 提供云端API通道身份認證(需要零配發現能力的時候需要該依賴)。 |
Breeze-biz SDK | 提供藍牙輔助配網支持,依賴breeze-biz SDK。 |
SDK依賴
- Maven倉庫地址
// 阿里云倉庫地址,包括了IOT事業部開發的SDK maven { url "http://maven.aliyun.com/nexus/content/repositories/releases/" }
- Gradle依賴
compile ('com.aliyun.alink.linksdk:ilop-devicecenter:1.6.7.1'){ transitive = true } // 如果需要藍牙輔助配網能力,請加上如下依賴;不需要藍牙輔助配網能力,則不需要加下面這個依賴; // compile ('com.aliyun.alink.linksdk:breeze-biz:1.1.4')
設備發現
配網SDK提供了局域網內發現已配網的設備,包括 WiFi 設備以及以太網設備,以及局域網內已上電的待配設備(前提是當前局域網內已經有一個已配好網的智能設備,且該設備具有發現待配網設備的能力)的能力。
設備發現相關API,請參見LocalDeviceMgr。
- 啟動設備發現。
發現本地的已配網設備、零配、路由器發現的待配設備,或者符合
adh_{pk}_{mac}
格式的設備熱點設備。發現的待配設備信息可以作為后續設備配網的入參信息。如果您需要對已發現且已配網設備做過濾(如過濾已綁定的設備,不支持的設備等),請參見本地發現設備列表信息過濾。// 開始發現設備 // enumSet 是需要使用的防發現方式 EnumSet<DiscoveryType>, 請根據需要選擇發現方式,并添加對應的依賴; // 第三個參數是獲取零配或智能路由器發現的待配設備,請求時需要攜帶的參數 LocalDeviceMgr.getInstance().startDiscovery(context, enumSet, null, new IDeviceDiscoveryListener() { @Override public void onDeviceFound(DiscoveryType discoveryType, List<DeviceInfo> list) { // 發現的設備 // LOCAL_ONLINE_DEVICE 當前和手機在同一局域網已配網在線的設備 // CLOUD_ENROLLEE_DEVICE 零配或智能路由器發現的待配設備 // BLE_ENROLLEE_DEVICE 發現的是藍牙Wi-Fi雙模設備(藍牙模塊廣播的subType=2即為雙模設備) // SOFT_AP_DEVICE 發現的設備熱點 // BEACON_DEVICE 一鍵配網發現的待配設備 // APP_FOUND_BLE_MESH_DEVICE 本地藍牙Mesh發現的待配網設備 // 注意:發現藍牙設備需添加 breeze-biz SDK依賴 } });
- 停止發現設備。
停止發現本地已配和線上待配設備,調用該接口會清除已發現設備列表,確保與startDiscovery成對調用。
// 停止設備發現 LocalDeviceMgr.getInstance().stopDiscovery();
設備配網
配網設備可以是本地發現的待配設備,也可以是通過掃碼等其他途徑獲取的待配設備。更多配網方式請參見Android App Native開發配網。設備配置添加相關API說明,請參見AddDeviceBiz。
- 設置待配網設備信息
DeviceInfo deviceInfo = new DeviceInfo(); deviceInfo.productKey = "xx"; // 商家后臺注冊的 productKey,不可為空 deviceInfo.deviceName = "xxx";// 設備名, 可為空 deviceInfo.productId = "xxx";// 產品 ID, 藍牙輔助配網必須 deviceInfo.id= "xxx";// 設備熱點的id,在發現熱點設備返回到APP的時候會帶這個字段 // 設備熱點配網 ForceAliLinkTypeSoftAP 藍牙輔助配網 ForceAliLinkTypeBLE // 二維碼配網 ForceAliLinkTypeQR 手機熱點配網 ForceAliLinkTypePhoneAP // 一鍵配網 ForceAliLinkTypeBroadcast 零配 ForceAliLinkTypeZeroAP deviceInfo.linkType = "ForceAliLinkTypeNone"; // 默認一鍵配網 //設置待添加設備的基本信息 AddDeviceBiz.getInstance().setDevice(DeviceInfo deviceinfo);
配網時,指定的配網方式 linkType,請參見LinkType。
設備信息相關實體類,請參見DeviceInfo。
- 開始設備配網
上述設置好待添加設備信息,進入配網。調用
startAddDevice
接口進入配網流程。如果出現獲取在某些高版本手機無法獲取WiFi SSID,需要申請位置權限,并打開GPS。- 如使用手機熱點方式配網,
linkType= "ForceAliLinkTypePhoneAP"
,需要用戶確保應用已具備了WRITE_SETTINGS
權限,該權限需要APP動態申請。 - 設備熱點配網必須要位置權限和GPS服務。
// 開始添加設備 AddDeviceBiz.getInstance().startAddDevice(context, new IAddDeviceListener(){ @Override public void onPreCheck(boolean b, DCErrorCode dcErrorCode) { // 參數檢測回調 } @Override public void onProvisionPrepare(int prepareType) { // 手機熱點配網、設備熱點配網、一鍵配網、藍牙輔助配網、二維碼配網會走到該流程, // 零配和智能路由器配網不會走到該流程。 // prepareType = 1提示用戶輸入賬號密碼 // prepareType = 2提示用戶手動開啟指定熱點 aha 12345678 // 執行完上述操作之后,調用toggleProvision接口繼續執行配網流程 } @Override public void onProvisioning() { // 配網中 } @Override public void onProvisionStatus(ProvisionStatus provisionStatus) { // 二維碼配網會走到這里 provisionStatus=ProvisionStatus.QR_PROVISION_READY表示二維碼ready了 // ProvisionStatus.QR_PROVISION_READY.message() 獲取二維碼內容 // 注意:返回二維碼時已開啟監聽設備是否已配網成功的通告,并開始計時,UI端應提示用戶盡快掃碼; // 如果在指定時間配網超時了,重新調用開始配網流程并刷新二維碼; } @Override public void onProvisionedResult(boolean b, DeviceInfo deviceInfo, DCErrorCode errorCode) { // 配網結果 如果配網成功之后包含token,請使用配網成功帶的token做綁定 } });
配網回調接口,請參見IAddDeviceListener。
- 如使用手機熱點方式配網,
- 輸入賬號密碼
在收到
onProvisionPrepare
回調后,引導用戶輸入ssid
和password
,并調用此方法傳入ssid
、password
、timeout
信息啟動配網。 只有廣播配網場景下,才會觸發onProvisionPrepare
回調。如果出現部分手機一直無法獲取到ssid
,可以打開 GPS 再獲取ssid
(部分手機需要開啟 GPS 才能獲取到)。String ssid = "ssid";// 熱點配網的時候注意,要先獲取ssid,然后再開啟熱點,否則無法正確獲取到SSID String ssid = "xxxxxxxx"; int timeout = 60;//單位秒,目前最短只能設置60S AddDeviceBiz.getInstance().toggleProvision(ssid, password, timeout);
- 停止配網
// 停止配網 AddDeviceBiz.getInstance().stopAddDevice();
- 設置配網模式
String linkType = "ForceAliLinkTypeBroadcast"; // 設置配網模式 AddDeviceBiz.getInstance().setAliProvisionMode(linkType);
混淆配置
-keep public class com.aliyun.alink.business.devicecenter.** {*;}
-keep public class com.aliyun.alink.linksdk.alcs.coap.**{*;}
獲取設備綁定Token
設備綁定的時候除了需要productKey、deviceName,還需要一個設備端的 token,該接口提供從設備端獲取綁定 token 的功能。WiFi 設備或者以太網設備均可以使用該接口獲取綁定需要的 Token。以太網設備需要先獲取到設備的 productKey、deviceName,可以參考使用startDiscovery
接口去獲取。
// 獲取設備綁定 token
LocalDeviceMgr.getInstance().getDeviceToken(context, productKey, deviceName, 60*1000, 5*1000, new IOnDeviceTokenGetListener() {
@Override
public void onSuccess(String token) {
// TODO bind
}
@Override
public void onFail(String reason) {
}
});
在插件中使用配網能力
如果需要在插件中使用配網能力,需要向BoneMobile容器中注冊配網API,請在插件加載前,調用如下注冊代碼:
BonePluginRegistry.register("BoneAddDeviceBiz",BoneAddDeviceBiz.class);
BonePluginRegistry.register("BoneLocalDeviceMgr",BoneLocalDeviceMgr.class);
BonePluginRegistry.register("BoneHotspotHelper",BoneHotspotHelper.class);