1.
概述
“裝置可以使用物模型功能,實作屬性上報(如上報裝置狀态)、事件上報(上報裝置異常或錯誤)和服務調用(通過雲端調用裝置提供的服務)。”[1]
使用者可在裝置上安裝Link
Kit SDK,通過Link Kit SDK實作屬性上報、事件上報,服務定義等功能。同時,使用者也可在雲端通過IOT雲端SDK實作屬性設定、服務調用等功能。此外,使用者也可以通過自定義MQTT Topic和雲端通信。
本文主要采用産品管理進階版,實作屬性上報/獲得、事件上報以及服務定義/調用。代碼源自官方提供的裝置端SDK以及雲端SDK的DEMO。
2.
架構
工業上使用較常見的場景是在工控機通用作業系統上安裝Link Kit SDK與雲端進行通訊。

圖
1 在通用OS上物模型樣例架構
3.
功能
3.1.
建立産品
在物聯網平台中建立産品Robot(進階版),并在産品的【功能定義】中添加屬性、事件和服務,詳情參見官方幫助。
5 服務定義
3.2.
添加裝置
在物聯網平台中建立裝置robot,詳情參見官方幫助。
3.3.
裝置端開發
3.3.1.
下載下傳Demo
在阿裡雲幫助文檔“
裝置接入Link Kit SDK”[2]中下載下傳Java SDK
Demo程式。
l 物聯網平台産品文檔:【阿裡雲物聯網平台】-【裝置端開發指南】-【下載下傳裝置端SDK】
l
http://gaic.alicdn.com/ztms/java-iot-device-sdk-demo-v1130/JavaLinkKitDemo.zip?spm=a2c4g.11186623.2.14.2fdd1058TJhODe&file=JavaLinkKitDemo.zipl 下載下傳源碼後導入IDE
3.3.2.
修改Demo
(1)
device_id.json
修改device_id.json檔案,填寫三元組:
{ "productKey": "a1l3AKuGZ**", "deviceName": "robot", "productSecret":"xLDfQY1XTYru****", "deviceSecret": "kUbuNQvdLRDvlJtiGkuOk95SLGXm****", } |
(2)
HelloWorld.java
在HelloWorld.java檔案中修改executeScheduler方法,添加test();
public void executeScheduler(DeviceInfoData deviceInfoData) { thingTestManager.readData(System.getProperty("user.dir") + "/test_case.json"); thingTestManager.setServiceHandler(); test(); |
(3)
test()分三部分,分别是:
l 屬性上報:裝置屬性上報雲端物模型
private void test() { // (1)裝置屬性上報雲端物模型 // 裝置屬性上報值 Map<String, ValueWrapper> reportData = new HashMap<String, ValueWrapper>(); reportData.put("myname", new ValueWrapper.StringValueWrapper("shoen")); // identifier 是雲端定義的屬性的唯一辨別,valueWrapper是屬性的值 reportData.put("myage", new ValueWrapper.IntValueWrapper(20)); // 裝置屬性上報和回調 LinkKit.getInstance().getDeviceThing().thingPropertyPost(reportData, new IPublishResourceListener() { public void onSuccess(String s, Object o) { // 屬性上報成功 } public void onError(String s, AError aError) { // 屬性上報失敗 }); |
l 屬性擷取:從雲端物模型擷取裝置屬性
// (2)從雲端物模型擷取裝置屬性,根據 identifier 擷取目前物模型中該屬性的值 String identifier = "myname"; String myname=(String)LinkKit.getInstance().getDeviceThing().getPropertyValue(identifier).getValue(); ALog.d("helloTag:","shoen:"+myname); String identifier1 = "myage"; int myage=(Integer)LinkKit.getInstance().getDeviceThing().getPropertyValue(identifier1).getValue(); ALog.d("helloTag:","age:"+myage); |
l 事件上報:裝置事件上報雲端
// (3)裝置事件上報雲端 HashMap<String, ValueWrapper> valueWrapperMap = new HashMap<String, ValueWrapper>();; String identity = "myevent"; valueWrapperMap.put("p1", new ValueWrapper.IntValueWrapper(50)); // 參考示例,更多使用可參考demo OutputParams params = new OutputParams(valueWrapperMap); LinkKit.getInstance().getDeviceThing().thingEventPost(identity, params, new IPublishResourceListener() { public void onSuccess(String resId, Object o) { // 事件上報成功 ALog.d(TAG, "onSuccess() called with: s = [" + resId + "], o = [" + o + "]"); } public void onError(String resId, AError aError) { // 事件上報失敗 ALog.w(TAG, "onError() called with: s = [" + resId + "], aError = [" + aError.toString() + "]"); }); |
l 服務:裝置先注冊服務的處理監聽器
// (4)裝置先注冊服務的處理監聽器 ThingSample ts=new ThingSample(pk, dn); ts.setServiceHandler(); |
(4)
ThingSample.java
l 服務定義:定義可供雲端調研的服務
l 在mCommonHandler方法中添加如下代碼:
} else if (SERVICE_GET.equals(identify)) { // 初始化的時候将預設值初始化傳進來,物模型内部會直接傳回雲端緩存的值 } else if ("myscore".equals(identify)) { /// 響應雲端SDK的myscore服務調用 ALog.d(TAG, "響應雲端SDK的myscore服務調用"); OutputParams outputParams = new OutputParams(); outputParams.put("out1", new ValueWrapper.IntValueWrapper(50)); itResResponseCallback.onComplete(identify, null, outputParams); } else { |
3.4.
雲端開發
3.4.1.
在github上下載下傳IoT套件服務端API使用demo [3]
l 【阿裡雲物聯網平台】-【雲端開發指南】-【雲端SDK參考】- 【SDK下載下傳】
3.4.2.
Test.java
l 修改main方法
l 屬性設定:雲端SDK直接設定裝置屬性
public static void main(String[] args) throws ClientException { String accessKey = "LTAIUa25no******"; String accessSecret = "1ktxeXGKyFyiOxiMmb************"; DefaultProfile.addEndpoint("cn-shanghai", "cn-shanghai", "Iot", "iot.cn-shanghai.aliyuncs.com"); IClientProfile profile = DefaultProfile.getProfile("cn-shanghai", accessKey, accessSecret); DefaultAcsClient client = new DefaultAcsClient(profile); // (1) 雲端SDK直接設定裝置屬性 SetDevicePropertyRequest request = new SetDevicePropertyRequest(); request.setProductKey("a1l3AKuGZMp"); request.setDeviceName("robot"); JSONObject itemJson = new JSONObject(); itemJson.put("myage", 2); request.setItems(itemJson.toString()); try { SetDevicePropertyResponse response = client.getAcsResponse(request); System.out.println(response.getRequestId() + ", success: " + response.getSuccess()); } catch (ClientException e) { e.printStackTrace(); } |
l 服務調用:雲端SDK調用裝置端服務
//(2)雲端SDK調用裝置端服務 InvokeThingServiceRequest request1=new InvokeThingServiceRequest(); request1.setProductKey("a1l3AKuGZMp"); request1.setDeviceName("robot"); request1.setIdentifier("myscore"); request1.setArgs("{\"in1\":1}"); //request1.setArgs("{\"LightStatus\":1,\"LightNo\":2}"); try { InvokeThingServiceResponse response = client.getAcsResponse(request1); if (response.getSuccess()) { System.out.println("調用成功"); } else { System.out.println("error:" + response.getErrorMessage()); } catch (ClientException e) { e.printStackTrace(); |
3.5.
測試運作
先執行裝置端程式,在雲端裝置顯示“線上”後,檢視裝置屬性值以及裝置事件上報結果。然後,再執行雲端程式,檢視服務調用和屬性設定結果。
3.5.1.
裝置屬性上報
檢視裝置屬性值。
6 裝置屬性
3.5.2.
裝置事件上報
7 裝置事件
3.5.3.
雲端服務調用和雲端屬性設定
8 雲端服務
9 雲端屬性
3.5.4.
雲端調用服務傳回值
l 參考幫助檔案[4]介紹的樣例實作:采用服務端訂閱的方式獲得雲端調用裝置端服務的傳回參數。
l 傳回:
topic=/a1l3AKuGZMp/robot/thing/downlink/reply/message
payload={"iotId":"IaCkVvrHpvXBFqXWteqJ0010a87900","code":200,"data":{"out1":50},"requestId":"234609380","topic":"/sys/a1l3AKuGZMp/robot/thing/service/myscore_reply","source":"DEVICE","gmtCreate":1547548002868,"productKey":"a1l3AKuGZMp","deviceName":"robot"}
generateTime=1547548002869
3.5.5.
資料轉發獲得屬性
l 物模型中的屬性可通過規則引擎轉發至Datahub,通過Datahub檢視屬性值。
l SELECT
items.myname.value as name, items.myage.value as age FROM
"/sys/a1l3AKuGZMp/robot/thing/event/property/post"
10 規則引擎的設定
3.6.
小結
試用過程中,雲端SDK讀取裝置屬性仍有問題,樣例中的QueryDevicePropRequest傳回錯誤的屬性值,幫助也不完善,的确很有“開源的味道”,希望IOT團隊能快速完善SDK,提供優質的API。
目前,在我們的實際工程中,一般使用“服務端訂閱的方式”[4]或者通過規則引擎“資料轉發”兩種方式獲得裝置的屬性值或者調用服務的傳回值。
參考文獻
[1] 物模型開發[EB/OL].
https://help.aliyun.com/document_detail/97333.html.
[2] 裝置接入Link Kit SDK[EB/OL].
[3] IoT套件服務端API使用demo[EB/OL].
https://github.com/aliyun/iotx-api-demo[4] 服務端訂閱[EB/OL].
https://help.aliyun.com/document_detail/89906.html