蓝牙辅助配网可以让手机App将WiFi热点信息通过蓝牙传递给设备,配网错误信息也可以通过蓝牙通道反馈给手机用户来定位问题。若您希望通过Android系统对您的设备使用蓝牙进行配网,并开启设备语音能力,请根据本文档进行功能的开发。
前提条件
已完成控制台上产品开发工作,以及蓝牙辅助配网的设备端开发,请参见设备端开发。
- 创建一个自有App,详细操作请参见创建自有App。
- 获取App端SDK。详细操作请参见下载并集成SDK。
- 初始化SDK。详细操作请参见SDK初始化。
- 开发Combo设备发现。Combo设备通过调用
LocalDeviceMgr
中的startDiscovery
方法来实现设备发现。如果您已实现过设备发现业务,则在该基础上,在EnumSet<DiscoveryType>
入参中新增⼀个DiscoveryType.BLE_ENROLLEE_DEVICE
类型即可。- 发起本地发现。
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) { } });
- 调用接口获取产品productKey,使用
ProductId
换取设备的ProductKey
。 - 调用接口本地发现设备列表信息过滤,过滤掉非法设备(如已绑定的设备等)。
- 发起本地发现。
- 开发Combo设备绑定。下面以云智能App为示例介绍Combo快速配网流程,您可以根据自己的业务逻辑来实现。
- 调用蓝牙上线接口
DevService.breezeSubDevLogin
,传入ProductKey
、MAC
等参数。示例代码如下。DevService.breezeSubDevLogin(pk, mac, new DevService.ServiceListener() { @Override public void onComplete(boolean b, Object o) { } });
- 调用接口后SDK会通过onComplete接口返回蓝牙上线结果。如果蓝牙上线成功则继续绑定操作;蓝牙上线失败,则流程结束。
- 调用接口基于时间窗口方式的绑定设备,在云端绑定设备。
- 调用
DevService.notifySubDeviceBinded
接口通知设备绑定结果。示例代码如下。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; // 调用DevService.notifySubDeviceBinded接口通知设备已绑定成功 DevService.notifySubDeviceBinded(subDevInfo,new DevService.ServiceListener(){ @Override public void onComplete(boolean b, @Nullable Object o) { ThreadTools.runOnUiThread(new Runnable() { @Override public void run() { gotoStepFinish(); } }); } }); }
- 调用蓝牙上线接口
- 开发Combo设备配网。说明 Combo设备类型为
DiscoveryType.COMBO_SUBTYPE_0X04_DEVICE
,表示已配网,此时您可忽略该步骤的以下操作。- 开始配网时,设置
wifistate
为DeviceWifiStatus_Setting
,表示Wi-Fi正在配置中。示例代码如下。DevService.setWifiStatus(iotID, TmpEnum.DeviceWifiStatus.DeviceWifiStatus_Setting, new DevService.ServiceListenerEx() { @Override public void onComplete(boolean b, @Nullable String s) { }});
- 调用
AddDeviceBiz.getInstance().setDevice
设置配网信息。示例代码如下。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; // 语音能力激活,标注设备是否支持语音能力 deviceInfo.isInSide = true; ProvisionConfigParams params = new ProvisionConfigParams(); params.ignoreSoftAPRecoverWiFi = true; params.enableGlobalCloudToken = true; ProvisionConfigCenter.getInstance().setProvisionConfiguration(params); AddDeviceBiz.getInstance().setDevice(deviceInfo);
说明 语音能力激活,标注设备是否支持语音能力。deviceInfo.isInSide = true;
- 调用
AddDeviceBiz.getInstance().startAddDevice
方法发起配网。示例代码如下。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密码开始配网 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) { //扫描到该设备 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)){ //继续配网 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();//配网完成,结束当前配网流程 if (isSuccess) { //配网成功 } else { //配网失败 } } }); } });
- 开始配网时,设置
- 调用
DevService#setWifiStatus
向TMP通知设备的配网结果。示例代码如下。DevService.setWifiStatus(iotID, TmpEnum.DeviceWifiStatus.state, new DevService.ServiceListenerEx() { //配网成功state为DeviceWifiStatus_Set;配网不成功state为DeviceWifiStatus_NotSet @Override public void onComplete(boolean b, @Nullable String s) { } });