平台已提供了一套完整的配网页面,如果您希望自己使用Native开发自己的定制化配网页面,可以阅读本文,使用配网SDK进行开发。
背景信息
配网SDK提供了将Wi-Fi设备连接上家庭路由器和发现局域网内已联网设备的能力,包括一键广播配网(P2P)、设备热点配网、蓝牙辅助配网和设备间相互配网(以下简称零配)等。各配网方式介绍参见Wi-Fi设备配网方案介绍和配网SDK。
设备热点配网
说明 需确保App已打开位置权限、GPS服务。
完整示例代码如下。
/**
* 第一步:设置待配网设备信息
*/
DeviceInfo deviceInfo = new DeviceInfo();
//方式一:指定productKey方式
deviceInfo.productKey = "xx";
deviceInfo.id = "xxx";// 通过startDiscovery发现的设备会返回该信息,在配网之前设置该信息,其它方式不需要设置
deviceInfo.linkType = "ForceAliLinkTypeSoftAP";
//方式二:不指定型号
deviceInfo.productKey = null;
deviceInfo.protocolVersion = "2.0";
deviceInfo.linkType = "ForceAliLinkTypeSoftAP";
//设置待添加设备的基本信息
AddDeviceBiz.getInstance().setDevice(deviceInfo);
/**
* 第二步:开始配网
* 前置步骤,设置待配信息并开始配网
*/
AddDeviceBiz.getInstance().startAddDevice(context, new IAddDeviceListener(){
@Override
public void onPreCheck(boolean b, DCErrorCode dcErrorCode) {
// 参数检测回调
}
@Override
public void onProvisionPrepare(int prepareType) {
/**
* 第三步:配网准备阶段,传入Wi-Fi信息
* TODO 修改使用手机当前连接的Wi-Fi的SSID和password
*/
if (prepareType == 1) {
AddDeviceBiz.getInstance().toggleProvision("Your Wi-Fi ssid", "Your Wi-Fi password", 60);
}
}
@Override
public void onProvisioning() {
// 配网中
}
@Override
public void onProvisionStatus(ProvisionStatus provisionStatus) {
/**
* 第四步:配网中,配网UI引导
* TODO 根据配网回调做 UI 引导
*/
if (provisionStatus == ProvisionStatus.SAP_NEED_USER_TO_CONNECT_DEVICE_AP) {
// 比如android 10,或者非android 10发现或连接设备热点失败。
// 需要引导用户连接设备热点,否则会配网失败
return;
}
if (provisionStatus == ProvisionStatus.SAP_NEED_USER_TO_RECOVER_WIFI) {
// 引导用户恢复手机Wi-Fi连接,否则会配网失败
return;
}
}
@Override
public void onProvisionedResult(boolean isSuccess, DeviceInfo deviceInfo, DCErrorCode errorCode) {
/**
* 第五步:监听配网结果
*/
// 如果配网结果包含token,请使用配网成功带的token做绑定。
}
});
蓝牙辅助配网
需要新增以下蓝牙相关SDK依赖。
compile ('com.aliyun.alink.linksdk:breeze-biz:1.1.4')
说明 需确保App已打开位置权限、GPS服务、蓝牙。
完整代码示例如下。
/**
* 第一步:设置待配网设备信息
*/
DeviceInfo deviceInfo = new DeviceInfo();
//方式一:指定productKey和productId方式
deviceInfo.productKey = "xx"; //必填
deviceInfo.productId = "xxx"; //必填,可通过发现接口返回或者根据productKey或云端换取
deviceInfo.id = "xxx";// 通过startDiscovery发现的设备会返回该信息,在配网之前设置该信息,其它方式不需要设置
deviceInfo.linkType = "ForceAliLinkTypeBLE";
//方式二:不指定型号
deviceInfo.productKey = null;
deviceInfo.productId = null;
deviceInfo.protocolVersion = "2.0";
deviceInfo.linkType = "ForceAliLinkTypeBLE";
//设置待添加设备的基本信息
AddDeviceBiz.getInstance().setDevice(deviceInfo);
/**
* 第二步:开始配网
* 前置步骤,设置待配信息并开始配网
*/
AddDeviceBiz.getInstance().startAddDevice(context, new IAddDeviceListener(){
@Override
public void onPreCheck(boolean b, DCErrorCode dcErrorCode) {
// 参数检测回调
}
@Override
public void onProvisionPrepare(int prepareType) {
/**
* 第三步:配网准备阶段,传入Wi-Fi信息
* TODO 修改使用手机当前连接的Wi-Fi的SSID和password
*/
if (prepareType == 1) {
AddDeviceBiz.getInstance().toggleProvision("Your Wi-Fi ssid", "Your Wi-Fi password", 60);
}
}
@Override
public void onProvisioning() {
// 配网中
}
@Override
public void onProvisionStatus(ProvisionStatus provisionStatus) {
}
@Override
public void onProvisionedResult(boolean isSuccess, DeviceInfo deviceInfo, DCErrorCode errorCode) {
/**
* 第四步:监听配网结果
*/
// 如果配网结果包含token,请使用配网成功带的token做绑定。
}
});
一键配网
完整示例代码如下。
/**
* 第一步:设置待配网设备信息
*/
DeviceInfo deviceInfo = new DeviceInfo();
deviceInfo.productKey = "xx"; //必填
deviceInfo.linkType = "ForceAliLinkTypeBroadcast";
//设置待添加设备的基本信息
AddDeviceBiz.getInstance().setDevice(deviceInfo);
/**
* 第二步:开始配网
* 前置步骤,设置待配信息并开始配网
*/
AddDeviceBiz.getInstance().startAddDevice(context, new IAddDeviceListener(){
@Override
public void onPreCheck(boolean b, DCErrorCode dcErrorCode) {
// 参数检测回调
}
@Override
public void onProvisionPrepare(int prepareType) {
/**
* 第三步:配网准备阶段,传入Wi-Fi信息
* TODO 修改使用手机当前连接的Wi-Fi的SSID和password
*/
if (prepareType == 1) {
AddDeviceBiz.getInstance().toggleProvision("Your Wi-Fi ssid", "Your Wi-Fi password", 60);
}
}
@Override
public void onProvisioning() {
// 配网中
}
@Override
public void onProvisionStatus(ProvisionStatus provisionStatus) {
}
@Override
public void onProvisionedResult(boolean isSuccess, DeviceInfo deviceInfo, DCErrorCode errorCode) {
/**
* 第四步:监听配网结果
*/
// 如果配网结果包含token,请使用配网成功带的token做绑定。
}
});
零配配网
零配配网需要依赖当前手机Wi-Fi下有一个已配网绑定的设备和一个已上电并进入配网状态的设备,已配网设备发现待配设备后会上报到云端,App端可以获取待配的设备列表。
完整示例代码如下。
/**
* 第一步:设置待配网设备信息
*/
DeviceInfo toProvisionDeviceInfo = null;
EnumSet<DiscoveryType> enumSet = EnumSet.of(DiscoveryType.CLOUD_ENROLLEE_DEVICE);
LocalDeviceMgr.getInstance().startDiscovery(this, enumSet, null, new IDeviceDiscoveryListener() {
@Override
public void onDeviceFound(DiscoveryType discoveryType, List<DeviceInfo> list) {
if (list != null && !list.isEmpty() && discoveryType == DiscoveryType.CLOUD_ENROLLEE_DEVICE) {
// 建议将发现的设备在UI上做展示,让用户触发对某个设备进行配网
// 发现的待配设备列表缓存在内存中,用户触发配网的时候将待配信息设置到SDK配网接口
}
}
}
// list是通过发现接口发现的零配待配设备
toProvisionDeviceInfo = list.get(0);
toProvisionDeviceInfo.linkType = "ForceAliLinkTypeZeroAP";
// 设置待添加设备的基本信息
AddDeviceBiz.getInstance().setDevice(toProvisionDeviceInfo);
/**
* 第二步:开始配网
* 前置步骤,设置待配信息并开始配网
*/
AddDeviceBiz.getInstance().startAddDevice(context, new IAddDeviceListener(){
@Override
public void onPreCheck(boolean b, DCErrorCode dcErrorCode) {
// 参数检测回调
}
@Override
public void onProvisionPrepare(int prepareType) {
}
@Override
public void onProvisioning() {
// 配网中
}
@Override
public void onProvisionStatus(ProvisionStatus provisionStatus) {
}
@Override
public void onProvisionedResult(boolean isSuccess, DeviceInfo deviceInfo, DCErrorCode errorCode) {
/**
* 第三步:监听配网结果
*/
// 如果配网结果包含token,请使用配网成功带的token做绑定。
}
});
设备绑定
配网SDK提供了获取设备端token的接口,该token可用于账号和设备的绑定(绑定接口非配网SDK提供,请参见基于token方式设备绑定)。