【华为云技术分享】【我的物联网成长记17】一条物联网设备控制命令的一生
作者:互联网
【摘要】 一条物联网设备控制命令从诞生到完成使命,它的一生是什么样的?本文将带你解读物联网设备控制命令的完整生命周期。
概述
为能有效地对设备进行管理,设备的产品模型中定义了物联网平台可向设备下发的命令,应用服务器可以调用物联网平台开放的API接口向单个设备或批量设备下发命令,或者用户通过物联网平台直接向单个设备下发命令,以实现对设备的远程控制。
华为物联网平台有两种命令下发机制:
- 立即下发:不管设备是否在线,平台收到命令后立即下发给设备。如果设备不在线或者设备没收到指令则下发失败。支持给本应用的设备和被授予权限的其它应用的设备下发命令。
立即下发适合对命令实时性有要求的场景,比如路灯开关灯,燃气表开关阀。使用立即下发时,命令下发的时机需要由应用服务器来保证。
- 缓存下发:物联网平台在收到命令后先缓存,等设备上线或者设备上报数据时再下发给设备,如果单个设备存在多条缓存命令,则进行排队串行下发。支持给本应用的设备和被授予权限的其它应用的设备下发命令。 缓存下发适合对命令实时性要求不高的场景,比如配置水表的参数。
对于使用LWM2M/CoAP协议的设备,建议用户使用缓存下发模式,工作模式设置为PSM模式(系统默认值)。如需使用立即下发模式(工作模式设置为DRX或eDRX模式),需要在设备上报数据后立即下发命令才能成功。
对于集成了Agent Lite SDK或使用原生MQTT协议的设备,物联网平台仅支持立即下发模式。
业务流程
LWM2M/CoAP协议设备场景
物联网平台提供立即下发和缓存下发两种机制。应用服务器向物联网平台下发命令时,携带参数expireTime(简称TTL,表示最大缓存时间)。如果不带expireTime,则默认expireTime为48小时。
- expireTime=0:命令立即下发。
- expireTime>0:命令缓存下发。
命令立即下发流程
应用调用华为物联网平台提供的接口,下发请求到物联网平台,携带expireTime参数为0。消息样例如下:
1 Method: POST 2 request: https://server:port/iocm/app/cmd/v1.4.0/deviceCommands 3 Header: 4 "app_key: ******" 5 "Authorization:Bearer******" 6 Content-Type:application/json 7 Body: 8 { 9 "deviceId": "********", 10 "command": { 11 "serviceId": "Brightness", 12 "method": "SET_DEVICE_LEVEL", 13 "paras": { 14 "value": "1", 15 } 16 }, 17 "callbackUrl": "http://127.0.0.1:9999/cmd/callbackUrl", 18 "expireTime": 0, 19 "maxRetransmit": 1 20 }
2.物联网平台调用编解码插件对命令请求进行编码后,会通过LWM2M协议定义的设备管理和服务实现接口的Execute操作下发命令,消息体为二进制格式。
3.物联网平台向应用返回201 Created,携带命令状态为SENT。(如果设备不在线或者设备没收到指令则下发失败,命令状态为FAIL)
4.设备收到命令后返回ACK响应。
5.若应用下发命令时携带了"callbackUrl",物联网平台推送状态通知消息给应用,携带命令状态为DELIVERED。消息样例如下:
1 Method: POST 2 request: 3 Body: 4 { 5 "deviceId": "6543214c-72bb-4131-9e14-fad974123456", 6 "commandId": "108a9c71462a48e09426e06e844d47ba3", 7 "result": { 8 "resultCode": "DELIVERED", 9 "resultDetail": null 10 } 11 }
6.设备执行命令后通过205 Content响应返回命令执行结果。
7.若应用下发命令时携带了"callbackUrl",物联网平台会调用编解码插件对设备响应进行解码,然后推送状态通知消息给应用,携带命令状态为SUCCESSFUL。消息样例如下:
1 Method: POST 2 request: 3 Body: 4 { 5 "deviceId": "6543214c-72bb-4131-9e14-fad974123456", 6 "commandId": "108a9c71462a48e09426e06e844d47ba", 7 "result": { 8 "resultCode": "SUCCESSFUL", 9 "resultDetail": null 10 } 11 }
命令缓存下发流程
-
应用调用华为物联网平台提供的接口,下发请求到物联网平台,携带expireTime参数大于0。
-
物联网平台将命令写入缓存队列,并上报201 Created,携带命令状态为PENDING。
-
设备上线或设备上报数据到平台。
-
物联网平台调用编解码插件对命令请求进行编码后,根据协议规范下发命令给设备。
-
若应用下发命令时携带了"callbackUrl",物联网平台推送状态通知消息给应用,携带命令状态为SENT。
-
后续流程请参考“命令立即下发”的步骤4到步骤7。
集成Agent Lite SDK设备/原生MQTT设备场景
对于集成Agent Lite SDK或使用原生MQTT协议接入的设备,物联网平台只支持立即下发模式,设备不在线时命令下发失败。
整个命令下发流程中命令执行状态以及状态变化机制如下图所示。
- 应用调用华为物联网平台提供的接口,下发请求到物联网平台。消息样例如下:
-
1 Method: POST 2 request: https://server:port/iocm/app/cmd/v1.4.0/deviceCommands 3 Header: 4 "app_key: ******" 5 "Authorization:Bearer******" 6 Content-Type:application/json 7 Body: 8 { 9 "deviceId": "********", 10 "command": { 11 "serviceId": "Brightness", 12 "method": "SET_DEVICE_LEVEL", 13 "paras": { 14 "value": "1", 15 } 16 }, 17 "callbackUrl": "http://127.0.0.1:9999/cmd/callbackUrl", 18 "expireTime": 0, 19 "maxRetransmit": 1 20 }
-
物联网平台根据协议规范下发命令给设备。
MQTT设备必须先订阅平台指定的Topic才能收到平台下发的命令,消息样例如下:
1 { 2 "msgType": "cloudReq", 3 "serviceId": "Brightness", 4 "mid": 2016, 5 "cmd": "SET_DEVICE_LEVEL", 6 "paras": { 7 "value": "1" 8 } 9 }
-
物联网平台向应用返回202 Accepted,携带命令状态为SENT。
-
设备收到命令后返回ACK响应。
-
若应用下发命令时携带了"callbackUrl",物联网平台推送状态通知消息给应用,携带命令状态为DELIVERED。消息样例如下:
1 Method: POST 2 request: 3 Body: 4 { 5 "deviceId": "6543214c-72bb-4131-9e14-fad974123456", 6 "commandId": "108a9c71462a48e09426e06e844d47ba", 7 "result": { 8 "resultCode": "DELIVERED", 9 "resultDetail": null 10 } 11 }
-
设备执行命令后返回命令执行结果,消息样例如下:
1 response: Status 2 Code: 200 OK
-
若应用下发命令时携带了"callbackUrl",物联网平台会调用编解码插件对设备响应进行解码,然后推送状态通知消息给应用,携带命令状态为SUCCESSFUL。消息样例如下:
1 Method: POST 2 request: 3 Body: 4 { 5 "deviceId": "6543214c-72bb-4131-9e14-fad974123456", 6 "commandId": "108a9c71462a48e09426e06e844d47ba", 7 "result": { 8 "resultCode": "SUCCESSFUL", 9 "resultDetail": null 10 } 11 }
命令执行状态说明
- NB-IoT设备采用缓存下发模式下发命令时,如果设备未上报数据,物联网平台会将命令进行缓存,此时任务状态为“等待”状态。
- NB-IoT设备采用立即下发模式下发命令时,无此状态。
- MQTT设备下发命时令,无此状态。
- NB-IoT设备采用缓存下发模式下发命令时,如果在设置的超期时间内,物联网平台未将命令下发给设备,则状态变更为“超期”。超期时间会根据北向接口中携带的expireTime为准,如果未携带,默认48h。
- NB-IoT设备采用立即下发模式下发命令时,无此状态。
- MQTT设备下发命时令,无此状态。
- NB-IoT设备采用缓存下发模式下发命令时,设备上报数据,物联网平台会将缓存的命令发送给设备,此时状态会由“等待”变为“已发送”。
- NB-IoT设备采用立即下发模式下发命令时,如果设备在线,状态为“已发送”。
- MQTT设备下发命时令,如果设备在线,状态为“已发送”。
已送达(DELIVERED)
物联网平台收到设备反馈的已收到下发命令响应后,状态变为“已送达”。
成功(SUCCESSFUL)
如果设备在执行完命令后,会给物联网平台反馈命令执行成功的结果,将任务状态变更为“成功”。
失败(FAIL)
- 如果设备在执行完命令后,会给物联网平台反馈命令执行失败的结果,将任务状态变更为“失败”。
- NB-IoT设备采用立即下发模式下发命令时,如果设备离线,状态为“失败”。
- MQTT设备下发命令时,如果设备离线,状态为“失败”。
作者:华为云云享专家 我是卤蛋
标签:状态,17,平台,下发,联网,命令,华为,设备 来源: https://www.cnblogs.com/huaweicloud/p/12525323.html