對于Combo設(shè)備(同時(shí)支持Wi-Fi和BLE),除了可以先配網(wǎng)再綁定設(shè)備(即藍(lán)牙輔助配網(wǎng)開發(fā)實(shí)踐),還可以先綁定設(shè)備再配網(wǎng),且該方式配網(wǎng)速度更快。當(dāng)您的業(yè)務(wù)場景需要快速配網(wǎng)時(shí),可根據(jù)本文檔來進(jìn)行App端的Android系統(tǒng)開發(fā)。
操作步驟
- 創(chuàng)建一個(gè)自有App,詳細(xì)操作請參見創(chuàng)建自有App。
- 獲取App端SDK。詳細(xì)操作請參見下載并集成SDK。
- 初始化SDK。詳細(xì)操作請參見SDK初始化。
- 開發(fā)Combo設(shè)備發(fā)現(xiàn)。
Combo設(shè)備通過調(diào)用LocalDeviceMgr中的startDiscovery方法來實(shí)現(xiàn)設(shè)備發(fā)現(xiàn)。如果您已實(shí)現(xiàn)過設(shè)備發(fā)現(xiàn)業(yè)務(wù),則在該基礎(chǔ)上,在EnumSet<DiscoveryType>入?yún)⒅行略?個(gè)DiscoveryType.BLE_ENROLLEE_DEVICE類型即可。
- 發(fā)起本地發(fā)現(xiàn)。
EnumSet<DiscoveryType> discoveryTypes=EnumSet.of(DiscoveryType.CLOUD_ENROLLEE_DEVICE, DiscoveryType.SOFT_AP_DEVICE, DiscoveryType.LOCAL_ ONLINE_DEVICE, DiscoveryType.BLE_ENROLLEE_DEVICE); LocalDeviceMgr.getInstance().startDiscovery(AApplication.getInstance (), discoveryTypes, null, new IDeviceDiscoveryListener() { @Override public void onDeviceFound(DiscoveryType discoveryType, L ist<DeviceInfo> list) { } });
- 調(diào)用獲取產(chǎn)品productKey接口來使用productId換取設(shè)備的ProductKey。
- 調(diào)用本地發(fā)現(xiàn)設(shè)備列表信息過濾接口來過濾掉非法設(shè)備(如已綁定的設(shè)備等)。說明 對于Combo設(shè)備,該接口的請求參數(shù)中deviceName需配置為Combo設(shè)備的MAC地址。
- 發(fā)起本地發(fā)現(xiàn)。
- 開發(fā)Combo設(shè)備綁定。
下面以公版App為示例介紹Combo快速配網(wǎng)流程,您可以根據(jù)自己的業(yè)務(wù)邏輯來實(shí)現(xiàn)。
- 調(diào)用藍(lán)牙上線接口DevService.breezeSubDevLogin,傳入ProductKey、MAC等參數(shù)。
示例代碼如下。
DevService.breezeSubDevLogin(pk, mac, new DevService.ServiceListener() { @Override public void onComplete(boolean b, Object o) { } });
調(diào)用接口后SDK會(huì)通過onComplete接口返回藍(lán)牙上線結(jié)果。如果藍(lán)牙上線成功則繼續(xù)綁定操作;藍(lán)牙上線失敗,則流程結(jié)束。
- 調(diào)用基于時(shí)間窗口方式的綁定設(shè)備接口在云端綁定設(shè)備。
- 調(diào)用DevService.notifySubDeviceBinded接口通知設(shè)備綁定結(jié)果。
示例代碼如下。
private void tmpNotify(String iotId){ ALog.d(TAG,"tmpNotify->"+iotId); SubDevInfo subDevInfo=new SubDevInfo(); subDevInfo.iotId=iotId; if (netType==ILopNetTypeCodes.NET_TYPE_BT){ ALog.d(TAG,"mac->"+mac); subDevInfo.deviceName=mac; }else { ALog.d(TAG,"dn->"+dn); subDevInfo.deviceName=dn; } subDevInfo.productKey=pk; // 調(diào)用DevService.notifySubDeviceBinded接口通知設(shè)備已綁定成功 DevService.notifySubDeviceBinded(subDevInfo,new DevService.ServiceListener(){ @Override public void onComplete(boolean b, @Nullable Object o) { ThreadTools.runOnUiThread(new Runnable() { @Override public void run() { gotoStepFinish(); } }); } }); }
- 調(diào)用藍(lán)牙上線接口DevService.breezeSubDevLogin,傳入ProductKey、MAC等參數(shù)。
- 開發(fā)Combo設(shè)備配網(wǎng)。說明
Combo設(shè)備類型為DiscoveryType.COMBO_SUBTYPE_0X04_DEVICE,表示已配網(wǎng),此時(shí)您可忽略該步驟的以下操作。
- 開始配網(wǎng)時(shí),設(shè)置wifistate為DeviceWifiStatus_Setting,表示W(wǎng)i-Fi正在配置中。
示例代碼如下。
DevService.setWifiStatus(iotID, TmpEnum.DeviceWifiStatus.DeviceWifiStatus_Setting, new DevService.ServiceListenerEx() { @Override public void onComplete(boolean b, @Nullable String s) { }});
- 調(diào)用AddDeviceBiz.getInstance().setDevice設(shè)置配網(wǎng)信息。
示例代碼如下。
DeviceInfo deviceInfo = new DeviceInfo(); deviceInfo.devType = ILopNetTypeCodes.DEV_TYPYE_BLE_SUBTYPE_3; deviceInfo.mac = mac; deviceInfo.linkType = LinkType.ALI_BLE.getName(); RegionInfo regionInfo = new RegionInfo(); regionInfo.shortRegionId = 0; deviceInfo.regionInfo = regionInfo; ProvisionConfigParams params = new ProvisionConfigParams(); params.ignoreSoftAPRecoverWiFi = true; params.enableGlobalCloudToken = true; ProvisionConfigCenter.getInstance().setProvisionConfiguration(params); AddDeviceBiz.getInstance().setDevice(deviceInfo);
- 調(diào)用AddDeviceBiz.getInstance().startAddDevice方法發(fā)起配網(wǎng)。
示例代碼如下。
AddDeviceBiz.getInstance().startAddDevice(AApplication.getInstance(), new IAddDeviceListener() { @Override public void onPreCheck(boolean b, DCErrorCode dcErrorCode) { } @Override public void onProvisionPrepare(int prepareType) { if (prepareType == 1) { //傳入SSID和Wi-Fi密碼開始配網(wǎng) AddDeviceBiz.getInstance().toggleProvision(ssid, password, 60); } } @Override public void onProvisioning() { } @Override public void onProvisionStatus(ProvisionStatus provisionStatus) { if ((provisionStatus != null) && provisionStatus.code() == ProvisionStatus.BLE_DEVICE_SCAN_SUCCESS.code()) { ALog.d(TAG, "BLE_DEVICE_SCAN_SUCCESS"); if (provisionStatus.getExtraParams() != null) { //掃描到該設(shè)備 String devType = (String) provisionStatus.getExtraParams().get(ILopNetTypeCodes.KEY_DEV_TYPE); String bleMac = (String) provisionStatus.getExtraParams().get(ILopNetTypeCodes.KEY_BLE_MAC); String prouctID = (String) provisionStatus.getExtraParams().get(ILopNetTypeCodes.KEY_PRODUCT_ID); ALog.d(TAG, "devType->" + devType + " bleMac->" + bleMac + " prouctID->" + prouctID); if (ILopNetTypeCodes.DEV_TYPYE_BLE_SUBTYPE_3.equals(devType)){ //繼續(xù)配網(wǎng) AddDeviceBiz.getInstance().continueProvision(null); } } } } @Override public void onProvisionedResult(boolean isSuccess, DeviceInfo deviceInfo, DCErrorCode dcErrorCode) { String message = "onProvisionedResult. isSuccess:" + isSuccess + " deviceInfo:" + deviceInfo + " dcErrorCode:" + dcErrorCode; ALog.d(TAG, message); ThreadTools.runOnUiThread(new Runnable() { @Override public void run() { AddDeviceBiz.getInstance().stopAddDevice();//配網(wǎng)完成,結(jié)束當(dāng)前配網(wǎng)流程 if (isSuccess) { //配網(wǎng)成功 } else { //配網(wǎng)失敗 } } }); } });
- 開始配網(wǎng)時(shí),設(shè)置wifistate為DeviceWifiStatus_Setting,表示W(wǎng)i-Fi正在配置中。
- 調(diào)用DevService#setWifiStatus向TMP通知設(shè)備的配網(wǎng)結(jié)果。
示例代碼如下。
DevService.setWifiStatus(iotID, TmpEnum.DeviceWifiStatus.state, new DevService.ServiceListenerEx() { //配網(wǎng)成功state為DeviceWifiStatus_Set;配網(wǎng)不成功state為DeviceWifiStatus_NotSet @Override public void onComplete(boolean b, @Nullable String s) { } });