物模型SDK提供了App端的物模型(屬性、事件、服務),用來開發設備界面,實現手機對設備的查看和控制。
依賴 SDK | 概述 |
API通道SDK | API通道SDK,提供IoT業務協議封裝的HTTPS請求能力,并通過整合安全組件來提升通道的安全性。 |
長連接通道SDK | 長連接通道SDK,提供IoT業務協議封裝的云端數據下行能力;為App 提供訂閱、發布消息的能力,和支持請求響應模型。 |
初始化
使用方式
本地通信功能是物模型SDK提供的一項基礎能力,它提供了在外網斷開的情況下,局域網內設備控制的特性。
當外網絡斷開時,本地通信模塊會搜尋當前局域網內的設備,如果發現的設備是App用戶曾經控制過的設備,此時可以通過本地通信鏈路去控制設備。
在外網斷開時,向云端拉取用戶賬號下的設備列表會失敗,此時可以使用以下接口獲取當前可以本地通信控制的設備列表。此API在SDK2.1.4版本中新增。
DeviceManager.getInstance().getLocalAuthedDeviceDataList();
返回值是一個JSON Array對象,對象內的數據格式具體請參見根據設備獲取綁定關系協議的AccountDevDTO結構。
設備創建
PanelDevice panelDevice = new PanelDevice(iotid);
iotid可以通過云端接口獲取。具體請參見物的模型服務。
panelDevice.init(context, new IPanelCallback() {
@Override
public void onComplete(boolean bSuc, Object o) {
}
});
//context是應用的上下文,IPanelCallback是初始化回調接口
// bSuc表示初始化結果,true為成功,false為失敗
// o表示具體的數據,失敗時是一個AError結構,成功時忽略
設備控制
設備控制是基于物的模型對設備定義的屬性、事件、服務進行操作。關于屬性、事件、服務的描述,請參見 生成物的模型TSL。
- 獲取設備狀態
panelDevice.getStatus(new IPanelCallback() { @Override public void onComplete(boolean bSuc, Object o) { ALog.d(TAG,"getStatus(), request complete," + bSuc); JSONObject data = new JSONObject((String)o); } }); // bSuc表示是否獲取成功,true為成功,false為失敗 // o 表示具體的數據,失敗時是一個AError結構,成功時是json字符串格式如下 /* { "code":200, "data":{ "status":1 "time":1232341455 } } 說明:status表示設備生命周期,目前有以下幾個狀態, 0:未激活;1:上線;3:離線;8:禁用;time表示當前狀態的開始時間 */
- 獲取設備屬性
panelDevice.getProperties(new IPanelCallback() { @Override public void onComplete(boolean bSuc, Object o) { ALog.d(TAG,"getProps(), request complete," + bSuc); JSONObject data = new JSONObject((String)o); } }); //bSuc表示是否獲取成功,true為成功,false為失敗 //o表示具體的數據,失敗時是一個AError結構,成功時是json字符串格式如下 /* { "code":200, "data":{ "WorkMode": { "time": 1516347450295, "value": 0 } } } */
通過panelDevice的
getProperties
接口,獲取到設備當前的所有屬性值。 - 設置設備屬性
panelDevice.setProperties(paramsStr, new IPanelCallback() { @Override public void onComplete(boolean bSuc, Object o) { ALog.d(TAG,"setProps(), request complete,"+bSuc); JSONObject data = new JSONObject((String)o); } }); //paramsStr 格式參考如下: /* { "items":{ "LightSwitch":0 }, "iotId":"s66CDxxxxXH000102" } */ //bSuc表示是否獲取成功,true為成功,false為失敗 //o表示具體的數據,失敗時是一個AError結構,成功時忽略
paramsStr是設置屬性協議中params參數的字符串,請參見生成物的模型TSL。
- 調用服務
panelDevice.invokeService(paramsStr, new IPanelCallback() { @Override public void onComplete(boolean bSuc, Object o) { ALog.d(TAG,"callService(), request complete,"+bSuc); JSONObject data = new JSONObject((String)o); } }); //paramsStr 格式參考如下 /* { "args":{ "Saturation":80, "LightDuration":50, "Hue":325, "Value":50 }, "identifier":"Rhythm", "iotId":"s66CDxxxxItXH000102" } */ //bSuc表示是否獲取成功,true為成功,false為失敗 //o表示具體的數據,失敗時是一個AError結構,成功時忽略
- 訂閱所有事件
App上用戶主動解綁一臺設備或者在設備端reset,云端會主動向App發送通知。App收到推送通知后,SDK內部會自動清除相關緩存數據,且發出解綁通知。具體的解綁通知格式請參見調用示例。
panelDevice.subAllEvent( new IPanelCallback() { @Override public void onComplete(boolean bSuc, Object data) { ALog.d(TAG,"doTslTest data:" + data) ; } } ,new IPanelEventCallback() { @Override public void onNotify(String iotid,String topic, Object data) { ALog.d(TAG,"onNofity(),topic = "+topic); JSONObject jData = new JSONObject((String)data); } } ,null); //IPanelCallback訂閱成功或者失敗時回調 //IPanelCallback的onComplete接口回調其中的參數 //bSuc表示是否獲取成功,true為成功,false為失敗 //o 表示具體的數據。失敗時是一個AError結構,不會有事件回調,成功時忽略 //IPanelEventCallback在事件觸發時回調 //iotid參數是設備iotid //topic參數是回調的事件主題字符串 //Object data參數是觸發事件的內容,類型為json字符串,格式參考如下 /* { "params": { "iotId":"0300MSKL03xxxx4Sv4Za4", "productKey":"X5xxxxH7", "deviceName":"5gJtxDxxxxpisjX", "items":{ "temperature":{ "time":1510292697471, "value":30 } } }, "method":"thing.properties" } */ //當operation為Unbind時,表示該設備已解綁,解綁通知的格式參考如下 //topic: /sys/${pk}/${dn}/app/down/_thing/event/notify /* { "identifier":"awss.BindNotify", "value":{ "iotId":"apVtLzgkxxxxV000102", "identityId":"5063op37bxxxxxe0bfa9d98037", "owned":1, "productKey":"a2xxxxxyi", "deviceName":"IoT_Dev_33", "operation":"Unbind" } } */
清理緩存
賬號退出時需要清理賬號緩存的數據。
DeviceManager.getInstance().clearAccessTokenCache();
獲取物的模型
panelDevice.getTslByCache(new IPanelCallback() {
@Override
public void onComplete(boolean bSuc, Object data) {
ALog.d(TAG,"doTslTest data:" + data) ;
}
});
//bSuc表示是否獲取成功,true為成功,false為失敗
//data 為具體的返回數據,格式為json字符串,失敗時為一個AError結構
開發者也可以使用云端接口來獲取原始的物的模型。具體請參見物的模型服務。
混淆配置
在proguard-rules.pro文件中,加入以下代碼,排除不需要被混淆的類和方法。
-keep class com.aliyun.alink.linksdk.tmp.**{*;}
-keep class com.aliyun.alink.linksdk.cmp.**{*;}
-keep class com.aliyun.alink.linksdk.alcs.**{*;}
-keep class com.aliyun.iot.ble.**{*;}
-keep class com.aliyun.iot.breeze.**{*;}
藍牙設備支持
藍牙設備受連接特性的約束,往往無法直接跟生活物聯網云端平臺連接,因而需要借助一個網關設備來實現藍牙設備與云端平臺的連接通道。手機在這一過程中可以充當網關角色。
此部分API提供以下幾方面的能力如下。
- 提供發現藍牙設備/連接藍牙設備的能力
- 提供連云通道,可以供藍牙設備數據上下云
- 提供藍牙設備控制與數據獲取的能力
依賴 SDK | 概述 |
藍牙 Breeze SDK | 是按照規范實現的手機端藍牙 SDK,方便合作廠商在手機端快速接入藍牙功能。Breeze SDK包含的主要功能有:設備發現連接,設備通信,加密傳輸,大數據傳輸等。 |
移動端設備網關 SDK | 移動端設備網關SDK,運行于App上的子設備網關,對于無法直連網絡的子設備,如藍牙設備,提供子設備的管理功能,如子設備添加拓撲,刪除拓撲,上線,下線以及數據上下行等。 |
- 藍牙API依賴導入
在物模型SDK支持藍牙設備時,需要導入如下的依賴。您可以在生活物聯網控制臺,SDK下載頁面獲取相關的版本(相關操作請參見下載并集成SDK)。
compile 'com.aliyun.alink.linksdk:lpbs-plugin-breeze:${version}' compile 'com.aliyun.alink.linksdk:breeze-biz:${version}' compile 'com.aliyun.alink.linksdk:breeze:${version}' compile 'com.aliyun.alink.linksdk:ble-library:${version}'
- 初始化移動端設備網關SDK
此功能模塊依賴移動端設備網關SDK。使用前請先初始化該SDK。
- 使用藍牙接入注意事項
使用藍牙設備前,App必須有如下權限,缺一不可。
- 藍牙權限
- 藍牙管理權限
同時在apilevel 21(含level 21)之上的Anroid系統,須額外具有如下權限,缺一不可。
- 低精度位置權限
- 高精度位置權限
說明除了上述權限,在API level 21(含level 21)之上的Anroid系統上,系統必須開啟位置服務,否則掃描將無法正常工作,如何開啟位置服務,參見Android開發參考文檔,需求位置權限及開啟位置服務的原因,參見官方說明。
更多介紹,請參見官方文檔。
- 發現藍牙設備
//discoverDevices 接口為發現本地設備接口 //第一個參數是userdata,一般設置為null //第二個參數表示是否清理之前發現的設備。true表示清理;false表示不清理,一般使用false //第三個參數表示發現設備多久超時,單位為毫秒 //第四個參數是過濾接口,返回true表示該設備為業務層需要的設備;返回false表示將該設備排除 //第五個參數為返現回調接口,會將本地發現的設備通過該回調接口返回 DeviceManager.getInstance().discoverDevices(null, false, 5000, new IDiscoveryFilter() { @Override public boolean doFilter(DeviceBasicData basicData) { return true; } },listener);
- 添加綁定藍牙設備
藍牙設備的綁定流程分為兩個步驟。
- 藍牙設備通過App去云端上線,可以使用SDK提供的API完成。
DevService.subDeviceAuthenLogin(params, new DevService.ServiceListener() { @Override public void onComplete(boolean isSuccess,Object bundle) { ALog.e(TAG,"subDeviceAuthenLogin onComplete isSuccess:" + isSuccess + " bundle:" + bundle); String productKey = null; String deviceName = null; if(bundle != null && bundle instanceof Bundle){ Bundle resultBundle = (Bundle)bundle; productKey = resultBundle.getString(DevService.BUNDLE_KEY_PRODUCTKEY); deviceName = resultBundle.getString(DevService.BUNDLE_KEY_DEVICENAME); } if(boneCallback != null){ boneCallback.success(getRspObject(isSuccess,productKey,deviceName)); } } }); //params 參數是子設備信息,參考格式如下: /* { "iotId":"your iotid", "productKey":"your productkey", "deviceName":"your deviceName " } */ //ServiceListener 是回調接口, //isSuccess表示是否成功,true表示成功,false表示失敗 //bundle是回調的擴展參數,包含設備的一些信息
- 上線成功后,調用云端API去做綁定賬號。綁定成功后通知SDK已經綁定成功。
IoTCallback callback = new IotCallback(){ @Override void onFailure(IoTRequest var1, Exception var2){ } @Override void onResponse(IoTRequest var1, IoTResponse var2){ SubDevInfo subDevInfo = new SubDevInfo(deviceInfo.productKey,deviceInfo.deviceName); DevService.notifySubDeviceBinded(); } } Map<String, Object> params = new HashMap(); params.put("deviceName", deviceInfo.deviceName); params.put("productKey", deviceInfo.productKey); IoTRequest request = (new IoTRequestBuilder()).setApiVersion("1.0.3").setAuthType("iotAuth").setPath("/awss/time/window/user/bind").setParams(params).build(); IoTAPIClient ioTAPIClient = (new IoTAPIClientFactory()).getClient(); ioTAPIClient.send(request, callback); //api 網關請求,接口需要設備的productKey,deviceName //具體請參見API通道SDK
- 藍牙設備通過App去云端上線,可以使用SDK提供的API完成。
- 連接/斷開本地的藍牙設備
此SDK相關功能在初始化后成功后,本地鏈路已經建立成功,不需要上層主動調用鏈接和斷開接口。在一段時間后,遇見設備斷開鏈接后,可以通過本地連接接口再次建立鏈接。
- 建立本地鏈接
panelDevice.startLocalConnect(new IPanelCallback() { @Override public void onComplete(boolean bSuc, Object o) { ALog.d(TAG,"startLocalConnect, onComplete,"+bSuc); } }); // bSuc 表示初始化結果,true為成功,false為失敗 // o 為擴展參數,成功時忽略,失敗時是一個AError結構
- 斷開本地鏈接
panelDevice.stopLocalConnect(new IPanelCallback() { @Override public void onComplete(boolean bSuc, Object o) { ALog.d(TAG,"stopLocalConnect, onComplete,"+bSuc); } }); // bSuc 表示初始化結果,true為成功,false為失敗 // o 為擴展參數,成功時忽略,失敗時是一個AError結構
- 建立本地鏈接
- 控制藍牙設備
藍牙設備的控制以及信息獲取跟WiFi設備的API一致,參照本文檔前部分的內容。