平臺已提供了一套完整的配網頁面,如果您希望自己使用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方式設備綁定)。