【我的物联网成长记17】一条物联网设备控制命令的一生
【摘要】 一条物联网设备控制命令从诞生到完成使命,它的一生是什么样的?本文将带你解读物联网设备控制命令的完整生命周期。
概述
为能有效地对设备进行管理,设备的产品模型中定义了物联网平台可向设备下发的命令,应用服务器可以调用物联网平台开放的API接口向单个设备或批量设备下发命令,或者用户通过物联网平台直接向单个设备下发命令,以实现对设备的远程控制。
华为物联网平台有两种命令下发机制:
立即下发:不管设备是否在线,平台收到命令后立即下发给设备。如果设备不在线或者设备没收到指令则下发失败。支持给本应用的设备和被授予权限的其它应用的设备下发命令。
立即下发适合对命令实时性有要求的场景,比如路灯开关灯,燃气表开关阀。使用立即下发时,命令下发的时机需要由应用服务器来保证。
缓存下发:物联网平台在收到命令后先缓存,等设备上线或者设备上报数据时再下发给设备,如果单个设备存在多条缓存命令,则进行排队串行下发。支持给本应用的设备和被授予权限的其它应用的设备下发命令。
缓存下发适合对命令实时性要求不高的场景,比如配置水表的参数。
对于使用LWM2M/CoAP协议的设备,建议用户使用缓存下发模式,工作模式设置为PSM模式(系统默认值)。如需使用立即下发模式(工作模式设置为DRX或eDRX模式),需要在设备上报数据后立即下发命令才能成功。
对于集成了Agent Lite SDK或使用原生MQTT协议的设备,物联网平台仅支持立即下发模式。
业务流程
LWM2M/CoAP协议设备场景
物联网平台提供立即下发和缓存下发两种机制。应用服务器向物联网平台下发命令时,携带参数expireTime(简称TTL,表示最大缓存时间)。如果不带expireTime,则默认expireTime为48小时。
expireTime=0:命令立即下发。
expireTime>0:命令缓存下发。
命令立即下发流程
应用调用华为物联网平台提供的接口,下发请求到物联网平台,携带expireTime参数为0。消息样例如下:
Method: POST
request: https://server:port/iocm/app/cmd/v1.4.0/deviceCommands
Header:
"app_key: ******"
"Authorization:Bearer******"
Content-Type:application/json
Body:
{"deviceId": "********","command": {"serviceId": "Brightness","method": "SET_DEVICE_LEVEL","paras": {"value": "1",}},"callbackUrl": "http://127.0.0.1:9999/cmd/callbackUrl","expireTime": 0,"maxRetransmit": 1
}
2.物联网平台调用编解码插件对命令请求进行编码后,会通过LWM2M协议定义的设备管理和服务实现接口的Execute操作下发命令,消息体为二进制格式。
3.物联网平台向应用返回201 Created,携带命令状态为SENT。(如果设备不在线或者设备没收到指令则下发失败,命令状态为FAIL)
4.设备收到命令后返回ACK响应。
5.若应用下发命令时携带了"callbackUrl",物联网平台推送状态通知消息给应用,携带命令状态为DELIVERED。消息样例如下:
Method: POST
request:
Body:
{"deviceId": "6543214c-72bb-4131-9e14-fad974123456","commandId": "108a9c71462a48e09426e06e844d47ba3","result": {"resultCode": "DELIVERED","resultDetail": null}
}
6.设备执行命令后通过205 Content响应返回命令执行结果。
7.若应用下发命令时携带了"callbackUrl",物联网平台会调用编解码插件对设备响应进行解码,然后推送状态通知消息给应用,携带命令状态为SUCCESSFUL。消息样例如下:
Method: POST
request:
Body:
{"deviceId": "6543214c-72bb-4131-9e14-fad974123456","commandId": "108a9c71462a48e09426e06e844d47ba","result": {"resultCode": "SUCCESSFUL","resultDetail": null}
}
命令缓存下发流程
应用调用华为物联网平台提供的接口,下发请求到物联网平台,携带expireTime参数大于0。
物联网平台将命令写入缓存队列,并上报201 Created,携带命令状态为PENDING。
设备上线或设备上报数据到平台。
物联网平台调用编解码插件对命令请求进行编码后,根据协议规范下发命令给设备。
若应用下发命令时携带了"callbackUrl",物联网平台推送状态通知消息给应用,携带命令状态为SENT。
后续流程请参考“命令立即下发”的步骤4到步骤7。
集成Agent Lite SDK设备/原生MQTT设备场景
对于集成Agent Lite SDK或使用原生MQTT协议接入的设备,物联网平台只支持立即下发模式,设备不在线时命令下发失败。
整个命令下发流程中命令执行状态以及状态变化机制如下图所示。
- 应用调用华为物联网平台提供的接口,下发请求到物联网平台。消息样例如下:
Method: POST request: https://server:port/iocm/app/cmd/v1.4.0/deviceCommands Header: "app_key: ******" "Authorization:Bearer******" Content-Type:application/json Body: {"deviceId": "********","command": {"serviceId": "Brightness","method": "SET_DEVICE_LEVEL","paras": {"value": "1",}},"callbackUrl": "http://127.0.0.1:9999/cmd/callbackUrl","expireTime": 0,"maxRetransmit": 1 }
物联网平台根据协议规范下发命令给设备。
MQTT设备必须先订阅平台指定的Topic才能收到平台下发的命令,消息样例如下:
{ "msgType": "cloudReq", "serviceId": "Brightness", "mid": 2016, "cmd": "SET_DEVICE_LEVEL", "paras": { "value": "1"} }
物联网平台向应用返回202 Accepted,携带命令状态为SENT。
设备收到命令后返回ACK响应。
若应用下发命令时携带了"callbackUrl",物联网平台推送状态通知消息给应用,携带命令状态为DELIVERED。消息样例如下:
Method: POST request: Body: {"deviceId": "6543214c-72bb-4131-9e14-fad974123456","commandId": "108a9c71462a48e09426e06e844d47ba","result": {"resultCode": "DELIVERED","resultDetail": null} }
设备执行命令后返回命令执行结果,消息样例如下:
response: Status Code: 200 OK
若应用下发命令时携带了"callbackUrl",物联网平台会调用编解码插件对设备响应进行解码,然后推送状态通知消息给应用,携带命令状态为SUCCESSFUL。消息样例如下:
Method: POST request: Body: {"deviceId": "6543214c-72bb-4131-9e14-fad974123456","commandId": "108a9c71462a48e09426e06e844d47ba","result": {"resultCode": "SUCCESSFUL","resultDetail": null} }
命令执行状态说明
等待(PENDING)
NB-IoT设备采用缓存下发模式下发命令时,如果设备未上报数据,物联网平台会将命令进行缓存,此时任务状态为“等待”状态。
NB-IoT设备采用立即下发模式下发命令时,无此状态。
MQTT设备下发命时令,无此状态。
超期(EXPIRED)
NB-IoT设备采用缓存下发模式下发命令时,如果在设置的超期时间内,物联网平台未将命令下发给设备,则状态变更为“超期”。超期时间会根据北向接口中携带的expireTime为准,如果未携带,默认48h。
NB-IoT设备采用立即下发模式下发命令时,无此状态。
MQTT设备下发命时令,无此状态。
取消(CANCELED)
如果命令下发任务为“等待”状态时,用户人工取消了命令下发任务,则任务状态变更为“取消”。
已发送(SENT)
NB-IoT设备采用缓存下发模式下发命令时,设备上报数据,物联网平台会将缓存的命令发送给设备,此时状态会由“等待”变为“已发送”。
NB-IoT设备采用立即下发模式下发命令时,如果设备在线,状态为“已发送”。
MQTT设备下发命时令,如果设备在线,状态为“已发送”。
超时(TIMEOUT)
NB-IoT设备收到命令后,物联网平台在180秒内未收到设备反馈的收到命令响应,此时状态会变为“超时”。MQTT设备无此状态。
已送达(DELIVERED)
物联网平台收到设备反馈的已收到下发命令响应后,状态变为“已送达”。
成功(SUCCESSFUL)
如果设备在执行完命令后,会给物联网平台反馈命令执行成功的结果,将任务状态变更为“成功”。
失败(FAIL)
如果设备在执行完命令后,会给物联网平台反馈命令执行失败的结果,将任务状态变更为“失败”。
NB-IoT设备采用立即下发模式下发命令时,如果设备离线,状态为“失败”。
MQTT设备下发命令时,如果设备离线,状态为“失败”。
作者:华为云云享专家 我是卤蛋
【我的物联网成长记17】一条物联网设备控制命令的一生相关推荐
- 【我的物联网成长记12】当物联网遇上边缘计算
[摘要] 针对设备直联云端方案的痛点,将边缘计算概念引入物联网解决方案的IoT边缘服务应运而生.本文将会为您介绍IoT边缘的能力与价值. 边缘,指实体或逻辑概念中离中心较远,靠近边界的部分.在数据处理 ...
- 【我的物联网成长记5】如何进行物联网大数据分析?
[摘要] 在物联网时代,数量庞大的"物"会产生海量数据,本文为您介绍两种基于物联网平台进行大数据分析的方法-实时分析和离线分析. 在物联网时代,数量庞大的"物" ...
- 【我的物联网成长记7】物联网主流通信协议解读【华为云分享】
[摘要] 当今物联网的主流通信协议是CoAP/LWM2M协议和MQTT协议,本文将会为您分别解读这些协议的工作方式,了解它们的特点,助您选择最适合您的设备的通信协议. 通信协议又称为传输协议,用于定义 ...
- 【我的物联网成长记3】如何开发物联网应用?
[摘要] 物联网应用是设备管理.故障监测.数据分析的重要工具.本文介绍如何基于物联网平台开发应用,包括API.SDK和图形化开发三种方式. -------------------整体方案------- ...
- 【我的物联网成长记2】设备如何进行选型?
[摘要] 在设备集成开发过程中,主要涉及三类用户: 模组厂商:提供Wifi.NB-IoT.2/3/4G等通信模组的厂商.设备厂商可以利用模组提供的能力接入到华为IoT平台. 设备厂商:开发并销售最终设 ...
- 【我的物联网成长记6】由浅入深了解NB-IoT
[摘要] 什么是NB-IoT?NB-IoT有什么优势?NB-IoT能做什么?本文将会从NB-IoT技术的发展历程,技术特点,通信协议,应用场景等方面为您全方面解读NB-IoT技术,了解NB-IoT的独 ...
- 【我的物联网成长记11】8招带你玩转规则引擎
[摘要] 华为云物联网平台提供的规则引擎包括数据转发和设备联动等多种能力,这些能力都要怎么使用?本文教您8招最常用的用法,带您玩转规则引擎. 规则引擎是华为云物联网平台提供的一种能力,用户对接入平台的 ...
- 【我的物联网成长记13】物联网卡能否携号转网?
[摘要] 物联网设备也会用到SIM卡,那物联网卡能否携号转网呢?本文将带您一探究竟. 2019年12月1日,携号转网业务正式在全国范围内推出,相关新闻也不断刷屏. 相信各位物联网爱好者都很好奇,物联网 ...
- 【我的物联网成长记9】物联网平台安全如何破?
[摘要] 很多朋友都很关心华为物联网云平台的安全能力,今天它来了.安全的设备接入,稳定放心:安全的数据传输,可靠不怕泄露:安全的数据处理,保护用户隐私.今天我们就将围绕端.管.云和应用的安全能力为大家 ...
最新文章
- Python使用matplotlib可视化条形图(bar plot)、自定义在条形图的顶部添加数值标签(Bar Chart)
- CSS实现鼠标移入图片边框有小三角
- Android中的各种Adapter
- GoLand配置数据库、远程host以及远程调试
- vue路由中设置linkActiveClass
- ds证据理论python实现_ALI模型理论以及Python实现
- node-webkit学习(4)Native UI API 之window
- python列表、元组、集合、字典、json相互转换以及其他基础入门
- Python Pandas General functions(静态方法)
- oracle raw如何生成,如何使用raw device构建Oracle数据库
- linux多线程调度设置
- MATLAB 中ans变量详细介绍
- SaaS之光照亮经济型酒店信息化道路
- 破解 WIDCOMM 蓝牙驱动的方法
- 论文推介:CaTT-KWS—基于级联Transducer-Transformer的多阶段自定义关键词识别框架
- 程序物语(五):经营自己的程序生涯
- 2020-10-19 Nvidia与vGPU
- Vue中el-table追加行后固定列滚动错位问题
- 我如何构建heimdall开源个人电子邮件监护人
- IIS的启动与停止命令
热门文章
- oracle查询数据库日志大小,Oracle的日志缓冲区大小查询方法———学习笔记 | 学步园...
- datax 模板_datax模板
- 题目1003:A+B(字符串转数字)
- BestCoder Round #36 [B] Gunner
- Python——eventlet.greenpool
- C# 对文本文件的几种读写方法
- 分布式事务slides
- BlackBerry 开发笔记入门 J2ME
- js 值类型和引用类型
- 不攀比,不张望,用心,专一