定义
Downstream Command(下行指令)指平台向设备下发的控制指令、配置或 Thing Model 服务调用。与设备上报的 Telemetry 上行数据相对,支持同步/异步、QoS 配置,是 Remote Control 的实现方式。
指令类型
下行指令包括:属性设置(写入 Device Shadow 设备影子,设备在线时推送)、服务调用(如重启、OTA 触发、参数配置)、自定义指令(按业务协议封装)。支持同步模式(等待设备响应,超时返回)与异步模式(下发即返回,设备异步执行后上报结果)。
传输与可靠性
通过 MQTT 等协议下发时,可配置 QoS 等级:QoS 0 至多一次、QoS 1 至少一次、QoS 2 恰好一次。对于离线设备,指令可缓存至 Device Shadow,设备上线后自动拉取。平台需记录指令下发状态、设备响应及超时情况,支撑 Remote Control 远程控制的可观测性。
安全与权限
下行指令涉及设备控制,需结合 RBAC 权限控制,仅授权用户可下发;敏感操作(如重启、恢复出厂)可要求二次确认。指令内容需防篡改,建议采用签名或加密,防止中间人攻击。
同步应答和影子缓存怎么选
下行指令的技术含义,是平台发起、由指定设备执行的一次控制、一次配置写入或一次服务调用,执行结果要能回到发起者。它和设备主动上报方向相反。同步方式在超时时间内等待设备的应答,适合人正等着看结果、并且设备当时在线的操作。异步方式先接受请求,设备随后用事件或属性上报结果,适合耗时较长的动作。需要在离线期间仍记住“最终应变成什么样”的配置,应写入影子,而不是堆一串无法合并的旧指令。选用哪种,取决于这个动作能否合并、设备现在是否在线、调用者能否等待。
使用指令的条件,是目标设备标识明确、调用者拥有该动作的权限、参数符合物模型,并且设备处于允许执行的生命周期状态。面向一批设备时,应先固定名单再发送,不能在发送过程中让目标集合自己变化。服务质量等级决定的是传输上的重复与到达,不决定业务是否执行成功。至少一次的传输可能让设备收到两次,因此指令要能重复执行而不产生二次危害,或者带上调用标识让设备丢掉重复。与设备认证的关系是:没有有效会话或影子拉取权,指令就不应该显示成已送达。
指令已送达却执行了旧参数
常见错误是把“报文已交给传输层”记录成“设备已执行”。设备可能收到了旧的排队指令,新的参数还在后面,现场效果和界面上最后一次填写的不一致。超时后调用者重试,若没有调用标识,设备会把同一次重启做成两次。影子和即时指令同时用在同一属性上,后到达的即时指令会被下一次上线时的旧期望覆盖回去。参数单位和取值范围没有在平台侧校验,非法值要等设备拒绝才发现,拒绝原因却没有展示给调用者。
权限只包到“可以打开控制页”,没有包到具体服务,任何登录者都能恢复出厂。批量指令中部分设备失败,若整批被标成成功,失败的那些不会被重试。时钟和时序也要看:应答很晚才到,界面已经允许下一次修改,两次结果交叉。指令审计应保留动作种类、目标和结果,不保留不该出现的密钥。审计日志里的成功必须和设备上报的执行结果一致,不能只抄传输层的发送回执。取消尚未执行的离线指令要有明确入口,否则设备几天后上线,会突然执行被人遗忘的重启。
传输成功和执行成功不是一件事
报文交给传输层,只说明发出去了,不说明设备执行了调用者最后一次填写的参数。离线队列里可能还堆着更早的指令,新参数排在后面,现场先发生的是旧动作。超时后的重试若没有调用标识,同一次重启会被做两遍。影子里的旧期望和刚刚发出的即时指令如果作用在同一属性上,设备下一次上线会把即时结果改回去。因此每个指令都要有调用标识,设备对重复标识返回上一次的结果,而不是再执行。界面上的状态至少要分开:已接受、已送达、已执行、被拒绝、已取消。把这几步收成一个成功,失败的设备不会被重试。
取消尚未执行的离线指令必须有入口。否则设备几天后上线,会突然执行被人遗忘的重启或恢复出厂。参数应在平台侧按模型和取值范围检查,不要等设备拒绝才发现单位写错,而且拒绝原因要回到调用者,不能只留在设备本地日志。权限要落到具体服务,而不是落到能不能打开控制页。批量执行中的部分失败要逐台留下原因。审计里的成功必须引用设备上报的执行结果,不能只抄传输回执。传输质量处理的是重复和丢失,业务上是否允许重复执行,要在指令设计时单独决定。