天天看點

阿裡雲物聯網平台物模型SDK試用

1.      

概述

“裝置可以使用物模型功能,實作屬性上報(如上報裝置狀态)、事件上報(上報裝置異常或錯誤)和服務調用(通過雲端調用裝置提供的服務)。”[1]

使用者可在裝置上安裝Link

Kit SDK,通過Link Kit SDK實作屬性上報、事件上報,服務定義等功能。同時,使用者也可在雲端通過IOT雲端SDK實作屬性設定、服務調用等功能。此外,使用者也可以通過自定義MQTT Topic和雲端通信。

本文主要采用産品管理進階版,實作屬性上報/獲得、事件上報以及服務定義/調用。代碼源自官方提供的裝置端SDK以及雲端SDK的DEMO。

2.      

架構

工業上使用較常見的場景是在工控機通用作業系統上安裝Link Kit SDK與雲端進行通訊。

阿裡雲物聯網平台物模型SDK試用

1 在通用OS上物模型樣例架構

3.      

功能

3.1.      

建立産品

在物聯網平台中建立産品Robot(進階版),并在産品的【功能定義】中添加屬性、事件和服務,詳情參見官方幫助。

阿裡雲物聯網平台物模型SDK試用
2 屬性、事件和服務的定義
阿裡雲物聯網平台物模型SDK試用
3 自定義事件
阿裡雲物聯網平台物模型SDK試用
4 事件參數
阿裡雲物聯網平台物模型SDK試用

5 服務定義

3.2.      

添加裝置

在物聯網平台中建立裝置robot,詳情參見官方幫助。

3.3.      

裝置端開發

3.3.1.      

下載下傳Demo

在阿裡雲幫助文檔“

裝置接入Link Kit SDK

”[2]中下載下傳Java SDK

Demo程式。

l  物聯網平台産品文檔:【阿裡雲物聯網平台】-【裝置端開發指南】-【下載下傳裝置端SDK】

http://gaic.alicdn.com/ztms/java-iot-device-sdk-demo-v1130/JavaLinkKitDemo.zip?spm=a2c4g.11186623.2.14.2fdd1058TJhODe&file=JavaLinkKitDemo.zip

l  下載下傳源碼後導入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.      

裝置屬性上報

檢視裝置屬性值。

阿裡雲物聯網平台物模型SDK試用

6 裝置屬性

3.5.2.      

裝置事件上報

阿裡雲物聯網平台物模型SDK試用

7 裝置事件

3.5.3.      

雲端服務調用和雲端屬性設定

阿裡雲物聯網平台物模型SDK試用

8 雲端服務

阿裡雲物聯網平台物模型SDK試用

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"

阿裡雲物聯網平台物模型SDK試用

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

繼續閱讀