设备的自定义任务示例
物联网平台提供设备任务的配置和管理服务。设备的自定义任务需要您根据实际需求,自行定义任务规则和设备端的实现逻辑。本文提供示例代码,通过手动输入命令,模拟设备上报自定义任务状态,为您介绍自定义任务运行过程。
本文以华东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%。