裝置的自訂任務樣本
物聯網平台提供裝置任務的配置和管理服務。裝置的自訂任務需要您根據實際需求,自行定義任務規則和裝置端的實現邏輯。本文提供範例程式碼,通過手動輸入命令,類比裝置上報自訂任務狀態,為您介紹自訂任務運行過程。
本文以華東2(上海)地區企業版執行個體下裝置為例,類比裝置的自訂任務流程。
準備工作
您需先完成以下操作:
建立自訂任務
登入物聯網平台控制台。
-
在執行個體概覽頁面,單擊目標執行個體名稱或ID。
-
在左側導覽列,選擇。
-
在任務頁面,單擊建立任務。
-
在建立工作精靈頁面,完成以下配置,單擊下一步。
參數
說明
任務名稱
輸入任務示範。
任務類型
選擇自訂任務。
目標裝置,產品,或分組
選擇產品的任務管理示範。
下發給裝置的任務執行規則
上傳規則檔案:任務執行規則.json。
-
設定每分鐘作業執行數量 (50-1000)為50,逾時時間(分鐘)為5。
-
單擊完成,返回工作清單,單擊該任務的查看,然後單擊作業概覽頁簽,查看任務狀態。
任務已完成初始化,開始調度。此時作業概覽頁簽中顯示3台裝置(Device1、Device2、Device3)均處於已調度狀態。
運行自訂任務
範例程式碼使用的開發環境如下:
-
作業系統:Windows 10
-
JDK版本:JDK8
-
整合式開發環境:IntelliJ IDEA社區版
範例程式碼支援的命令參見下表。
命令、欄位和欄位後的參數值之間,必須使用單個空格分隔,但參數值中不能包含空格。
|
命令 |
支援欄位 |
使用說明 |
|
get |
|
|
|
|
taskId有三種取值方式:
|
|
|
update |
|
說明
|
|
|
|
有關自訂任務執行流程及其Topic說明,請參見裝置任務概述。
本文使用3個裝置,分別類比裝置任務中可能出現的最終狀態:已逾時、失敗和成功。
-
訪問並下載alibabacloud-iot-java-demo,解壓檔案。然後開啟IntelliJ IDEA,匯入Demo包中的樣本工程lp。
-
在src/main/java/com.aliyun.iotx.lp.demo/job目錄下的CustomJobSample.java檔案中,參照下表,設定裝置資訊。
public class CustomJobSample { /** * 產品productKey,待補充 */ private static String productKey = "a1xxx"; /** * 裝置名稱,待補充 */ private static String deviceName = "Device1"; /** * 裝置deviceSecret,待補充 */ private static String deviceSecret = "b5c9xxx"; /** * 地區資訊,產品&裝置所在region,待補充 */ private static String region = "cn-shanghai";參數
樣本
說明
productKey
a1f3***
您添加裝置後,儲存的裝置認證資訊。本樣本添加裝置Device1的資訊。
您也可在控制台中裝置Device1的裝置詳情頁面查看。
deviceName
Device1
deviceSecret
b5c96d***
region
cn-shanghai
您的服務所在地區對應的Region ID。請在物聯網平台控制台左上方,查看您服務所在的地區。Region ID的取值,請參見地區和可用性區域。
config.channelHost
iot-**.mqtt.iothub.aliyuncs.com
MQTT接入地址。具體說明,請參見查看執行個體終端節點。
-
運行CustomJobSample程式檔案。
裝置接入物聯網平台,並訂閱裝置任務相關Topic。
2021-05-25 02:07:50.805 - null[MqttSendExecutor.java] - asyncSend(162):MqttSendExecutor:subscribe: topic: [ /sys/xxx/Device1/thing/job/notify ] 2021-05-25 02:07:50.807 - null[MqttSendExecutor.java] - asyncSend(162):MqttSendExecutor:subscribe: topic: [ /sys/xxx/Device1/thing/job/get_reply ] 2021-05-25 02:07:50.809 - null[MqttSendExecutor.java] - asyncSend(162):MqttSendExecutor:subscribe: topic: [ /sys/xxx/Device1/thing/job/update_reply ] subscribe notify success subscribe get_reply success subscribe update_reply success Start Succeeded !!! enter your command: -
輸入以下命令,擷取裝置的工作清單資訊。
get -t $listget -t $list 2021-05-25 02:11:12.588 - null[MqttSendExecutor.java] - asyncSend(129):MqttSendExecutor:publish: topic: [ /sys/xxx/Device1/thing/job/get ] 2021-05-25 02:11:12.588 - null[MqttSendExecutor.java] - asyncSend(130):MqttSendExecutor:publish: payload: [ {"id":"123","params":{"taskId":"$list"},"version":"1.0"} ] enter your command: ... 收到任務資訊:{"code":200,"data":{"tasks":[{"taskId":"1a9300c10d7b41248cb657ca7191048d","status":"SENT"}],"taskId":"$list","id":"123","method":"thing.job.get","version":"1.0"}} -
輸入以下命令,擷取指定的任務詳情。
get -t 1a9300c10d7b41248cb657ca7191048dget -t 1a9300c10d7b41248cb657ca7191048d 2021-05-25 03:07:01.719 - null[MqttSendExecutor.java] - asyncSend(129):MqttSendExecutor:publish: topic: [ /sys/xxx/Device1/thing/job/get ] 2021-05-25 03:07:01.720 - null[MqttSendExecutor.java] - asyncSend(130):MqttSendExecutor:publish: payload: [ {"id":"123","params":{"taskId":"1a9300c10d7b41248cb657ca7191048d"},"version":"1.0"} ] enter your command: ... update sccess... messageArrived, topic = [/sys/xxx/Device1/thing/job/get_reply] , msg = [{"code":200,"data":{"task":{"jobDocument":{...}}}}] -
開始執行任務並上報進度。輸入以下命令,設定進度為26%。
update -t 1a9300c10d7b41248cb657ca7191048d -s IN_PROGRESS -p 26update -t 1a9300c10d7b41248cb657ca7191048d -s IN_PROGRESS -p 26 2021-05-25 03:30:03.903 - null[MqttSendExecutor.java] - asyncSend(129):MqttSendExecutor:publish: topic: [ /sys/xxx/Device1/thing/job/update ] 2021-05-25 03:30:03.903 - null[MqttSendExecutor.java] - asyncSend(130):MqttSendExecutor:publish: payload: [ {"id":"123","params":{"progress":26,"taskId":"1a9300c10d7b41248cb657ca7191048d","status":"IN_PROGRESS"},"version":"1.0"} ] enter your command: ... update sccess... messageArrived, topic = [/sys/xxx/Device1/thing/job/update_reply] , msg = [{"code":200,"data":{"taskId":"1a93..."}}]您可返回物聯網平台控制台的頁簽,查看任務狀態和進度。此時Device1的任務進度顯示為26%,狀態更新為執行中。
說明如果更新任務狀態時,status取值不合法,任務狀態將更新失敗。
不再繼續上報進度,超出任務設定的逾時時間後,任務最終狀態更新為已逾時。
此時作業概覽頁簽中Device1的任務狀態變為已逾時,進度停留在26%。
-
參考步驟2,修改裝置資訊為裝置Devie2的資訊,然後按照步驟3~步驟5擷取裝置任務,最後輸入以下命令,將任務狀態更新為失敗,並攜帶失敗的提示資訊。
update -t d3858707af6548cabe4ec2d6878e8639 -s FAILED -p 10 -d {"errorCode":"500","message":"SystemException"}update -t d3858707af6548cabe4ec2d6878e8639 -s FAILED -p 10 -d {"errorCode":"500","message":"SystemException"} 2021-05-25 03:47:37.628 - null[MqttSendExecutor.java] - asyncSend(129):MqttSendExecutor:publish: topic: [ /sys/xxx/Device2/thing/job/update ] 2021-05-25 03:47:37.628 - null[MqttSendExecutor.java] - asyncSend(130):MqttSendExecutor:publish: payload: [ {"id":"123","params":{"progress":10,"statusDetails":{"errorCode":"500","message":"SystemException"},"taskId":"d3858707af6548cabe4ec2d6878e8639","status":"FAILED"},"version":"1.0"} ] enter your command: ... update sccess... messageArrived, topic = [/sys/xxx/Device2/thing/job/update_reply] , msg = [{"code":200,"data":{"taskId":"d38..."}}]返回物聯網平台控制台的頁簽,可查看到任務狀態為失敗。此時Device2的進度為10%。
單擊執行詳情,可查看具體的錯誤提示資訊。
執行詳情對話方塊中顯示裝置上報的狀態詳情為
{"errorCode":"500","message":"SystemException"}。 -
參考步驟2,修改裝置資訊為裝置Devie3的資訊,然後按照步驟3~步驟6擷取並執行任務,最後輸入以下命令,更新任務狀態為成功。
update -t 3b888b9f892b4d3ead6e2e34f0ccd3c2 -s SUCCEEDED -p 100update -t 3b888b9f892b4d3ead6e2e34f0ccd3c2 -s SUCCEEDED -p 100 2021-05-25 04:06:34.559 - null[MqttSendExecutor.java] - asyncSend(129):MqttSendExecutor:publish: topic: [ /sys/xxx/Device3/thing/job/update ] 2021-05-25 04:06:34.559 - null[MqttSendExecutor.java] - asyncSend(130):MqttSendExecutor:publish: payload: [ {"id":"123","params":{"progress":100,"taskId":"3b888b9f892b4d3ead6e2e34f0ccd3c2","status":"SUCCEEDED"},"version":"1.0"} ] enter your command: ... update sccess... messageArrived, topic = [/sys/xxx/Device3/thing/job/update_reply] , msg = [{"code":200,"data":{"taskId":"3b88..."}}]返回物聯網平台控制台的頁簽,可查看到任務狀態為成功。此時Device3的進度為100%。