上一篇文章讲述了IoT设备如何向Thingsboard上报遥测数据 , 这篇来讲述从服务器向IoT设备下发指令有哪些方法。
在Thingsboard中向IoT设备下发指令,通常有以下2种:
- RPC , 主要是Server端的RPC
- 属性订阅, IoT设备订阅属性更新
- 我设计的指令队列方式
一、RPC
RPC(Remote Procedure Call) 即远程过程调用,在Thingsboard中提供了多种RPC调用方法, 参考官方文档。
1、服务器端RPC
从服务器端给IoT设备下发指令,因此最适合的就是服务器端的双向 RPC(Two-way server-side RPC),看官方原图画的很清晰。

管理系统下指令给Thingsboard服务器,thingsboard服务器向IoT设备RPC Request , 设备收到后返回Response。
ThingsBoard 提供对持久RPC 调用的支持。持久 RPC 具有可配置的生命周期,并存储在数据库的RPC表中。当您的设备可能长时间无法访问时,持久 RPC 非常有用。这通常发生在网络连接不佳或省电模式(PSM) 的情况下。
a. RPC结构
服务器端RPC Request 由多个字段组成:
- method – 必选,方法名,用于区分 RPC 调用。例如,“getCurrentTime” 或 “getWeatherForecast”。该参数的值是一个字符串。
- params – 必填,用于处理请求的参数。值为 JSON。如果不需要参数,则保留为空 JSON“{}”。
- timeout – 可选,处理超时值(以毫秒为单位)。默认值为 10000(10 秒)。最小值为 5000(5 秒)。
- expirationTime – 可选,纪元时间值(以毫秒为单位,UTC 时区)。如果存在,则覆盖timeout。
- persistent – 可选,是否永久有效,请参阅 [persistent] vs [lightweight] RPC。默认值为“false”。
- retries – 可选,定义在网络和/或设备端出现故障时重新发送持久 RPC 的次数。
- additionalInfo – 可选,定义将添加到 [持久 RPC 事件] 的持久 RPC 的元数据。
b. RPC response ,可以是任意的Json结构体。
c. 发送 服务器端RPC
服务器端 RPC 通常使用 REST API 或仪表板小部件发送。事实上,仪表板小部件使用相同的 REST API。平台收到 RPC 后,会验证有效负载并运行权限检查。然后,服务器端 RPC 命令转换为规则引擎消息。规则引擎可能会使用其他参数丰富命令,并最终将命令交付给设备。
使用Rest API
API:/api/plugins/rpc/{callType}/{deviceId}
使用仪表板
控制小部件用于向IoT设备发送 RPC 命令。最流行的小部件是“RPC 按钮”、“圆形开关”、“开关控制”和“旋钮控制”。这些小部件的高级设置允许您定义 RPC 方法名称和参数。您还可以开发自定义小部件并使用控制 API发送 RPC 命令。
使用规则引擎
所有从小部件或 REST API 发送的服务器端 RPC 命令最终都转换为“RPC_CALL_FROM_SERVER_TO_DEVICE”
消息类型的规则引擎消息。
该消息包含基于 UUID 的唯一标识符,该标识符存储在“requestUUID”元数据字段中。您可以设计规则链 以使用转换、丰富或任何其他规则节点类型来处理传入消息。最后,应该使用RPC 调用请求节点将消息发送到设备。
规则引擎设计如下:


generate节点: 下发的指令,这是在规则链中自动生成指令 ,一般情况下会从仪表板或Rest API 产生下发指令。
var msg = { method: "rpcCommand", params: {} };
var metadata = {
expirationTime: new Date().getTime() + 60000,
oneway: true,
persistent: false
};
var msgType = "RPC_CALL_FROM_SERVER_TO_DEVICE";
return { msg: msg, metadata: metadata, msgType: msgType };
可以做一个log节点,用来跟踪RPC命令的下发情况:

持久性 RPC,有 7 种可用状态 ,记录在RPC表的status字段:
- QUEUED – RPC 已创建并保存到数据库;尚未尝试将 RPC 发送到设备;ThingsBoard 将在设备在线或已经在线时立即尝试发送 RPC;平台默认会尝试一次发送所有待处理的 RPC 调用。在极少数情况下,如果设备受限且队列中有多个消息,这可能会导致网络或设备过载。为了避免过载,您可以使用“ACTORS_RPC_SEQUENTIAL”配置参数启用 RPC 调用的顺序传递。
- SENT – ThingsBoard 尝试将 RPC 发送到设备。
- DELIVERED – 设备确认 RPC 已送达;这是单向RPC 处理的最后一步;
- SUCCESSFUL – ThingsBoard 收到了双向RPC 的回复;
- TIMEOUT – ThingsBoard 传输层 (MQTT/CoAP/LwM2M 等) 检测到 RPC 传递超时;超时使用相应配置参数之一进行控制:MQTT_TIMEOUT(默认 10 秒)、COAP_TIMEOUT(默认 10 秒)、LWM2M_TIMEOUT(默认 120 秒)默认情况下,平台不会重试传递 RPC,状态将更改为 FAILED。您可以在 RPC 主体中配置重试次数。最大重试次数由“ACTORS_RPC_MAX_RETRIES”配置参数控制(默认为 5)。
- EXPIRED – RPC 未送达或平台未在配置的到期时间内收到来自设备的回复;
- FAILED – 在可配置的重试次数内传递 RPC 失败或设备固件不支持此类命令。
d. 设备端的API,参考官方链接
ThingsBoard 提供了一个方便的 API 来接收和处理设备上的服务端 RPC 命令。此 API 特定于每个支持的网络协议。您可以在相应的参考页面上查看 API 和示例:
2、客户端RPC
客户端RPC, 通常是IoT设备端发来RPC请求, 服务器把指令发给设备端。

a. 客户端 RPC request包含两个字段,均为必填字段:
- method – RPC调用的方法名称。例如,“getCurrentTime”或“getWeatherForecast”。该参数的值是一个字符串。简单说,就是一个请求指令名供服务器识别。
- params – 用于处理请求的附加参数。该值为 JSON。如果不需要参数,则保留为空的 JSON“{}”。
b. RPC reponse可以是任意数字、字符串或 JSON。
c. 规则链如下设计:


Script 节点:
var rpcResponse;
if (msg.method === "getCurrentTime"){
rpcResponse = new Date().getTime();
} else {
rpcResponse = "Unknown RPC request method: " + msg.method;
}
return {msg: rpcResponse, metadata: metadata, msgType: msgType};
d. 设备端的API,参考官方链接:
二、属性订阅
服务器端通过共享属性,更新某个共享属性(如指令),IoT设备端通过订阅属性更新,可以获得这个共享属性。这种方式比较简单。
1、服务器通过Rest API 更新和维护一个指令属性
API: /api/v1/{deviceToken}/attributes
2、IoT设备端订阅属性更新,拿到指令属性
v1/devices/me/attributes
三、我设计的指令队列方式
指令队列方式,能记录指令的所有状态,能按先进先出的方式下发指令。
1、管理端把指令当做遥测数据发到设备的遥测数据(Telemetry)中,可以发好多条形成队列
2、走Client-side RPC 路径(也可以Server-side RPC,只是要多一个generate节点来触发第3步 )
3、服务器在收到 IoT设备的RPC Request后,用 Originator telemetry 节点去遥测数据获取指令
4、用Script节点, 对取到的指令进行处理
5、最后用RPC call reply 把指令发给客户端
系列文章:
物联网开源平台开发系列001 – 开源平台Thingsboard 介绍
物联网开源平台开发系列002 – Thingsboard 用户系统分析
物联网开源平台开发系列003 – Thingsboard OAuth2 – Google身份验证登陆
物联网开源平台开发系列004 – Thingsboard的实体、资产、设备一般说明及数据存储 – 陈皮王五de杂记
物联网开源平台开发系列005 – Thingsboard的API简述 – 陈皮王五de杂记
物联网开源平台开发系列006 – 在Thingsboard内创建一个设备 – 陈皮王五de杂记
物联网开源平台开发系列007 – Thingsboard的批量导入设备 – 陈皮王五de杂记
物联网开源平台开发系列008 – 浅谈物联网传输协议 – 陈皮王五de杂记
物联网开源平台开发系列009 – Thingsboard服务器对IoT设备下发指令 – 陈皮王五de杂记
物联网开源平台开发系列010 – Thingsboard规则引擎简介 – 陈皮王五de杂记
物联网开源平台开发系列011 – Thingsboard规则节点Originator Telemetry – 陈皮王五de杂记
物联网开源平台开发系列012 – Thingsboard 设备离线Alarm设置 – 陈皮王五de杂记
物联网开源平台开发系列013 – Thingsboard 遥测产生告警Alarm – 陈皮王五de杂记
物联网开源平台开发系列014 – Thingsboard遥测时序数据存储结构及分区策略 – 陈皮王五de杂记
物联网开源平台开发系列015 – Thingsboard postgresql数据库基本配置 – 陈皮王五de杂记
物联网开源平台开发系列016 – 再谈Thingsboard的设备注册 – 陈皮王五de杂记
物联网开源平台开发系列017 – Thingsboard的设备联动场景 – 陈皮王五de杂记
物联网开源平台开发系列018 – Thingsboard获取和处理天气信息 – 陈皮王五de杂记
物联网开源平台开发系列019 – Thingsboard设备数据传播给资产 – 陈皮王五de杂记
物联网开源平台开发系列020 – Thingsboard的实体视图Entity View – 陈皮王五de杂记
物联网开源平台开发系列021 – Thingsboard的网关gateway – 陈皮王五de杂记
物联网开源平台开发系列022 – 通过Thingsboard网关gateway动态创建设备 – 陈皮王五de杂记
物联网开源平台开发系列023 – Thingsboard设备列表仪表盘 – 陈皮王五de杂记
物联网开源平台开发系列024 – Thingsboard接入摄像头方案 – 陈皮王五de杂记
物联网开源平台开发系列025 – Thingsboard规则链节点的JS代码调试 – 陈皮王五de杂记
原创文章,作者:Gary,如若转载,请注明出处:https://www.cpw5.top/819.html
淘宝小店:陈皮王五工作室
评论列表(18条)
[…] 物联网开源平台开发系列009 – Thingsboard服务器对IoT设备下发指令 – 陈皮… […]
[…] 物联网开源平台开发系列009 – Thingsboard服务器对IoT设备下发指令 – 陈皮… […]
[…] 物联网开源平台开发系列009 – Thingsboard服务器对IoT设备下发指令 – 陈皮… […]
[…] 物联网开源平台开发系列009 – Thingsboard服务器对IoT设备下发指令 – 陈皮… […]
[…] 物联网开源平台开发系列009 – Thingsboard服务器对IoT设备下发指令 – 陈皮… […]
[…] 物联网开源平台开发系列009 – Thingsboard服务器对IoT设备下发指令 – 陈皮… […]
[…] 物联网开源平台开发系列009 – Thingsboard服务器对IoT设备下发指令 – 陈皮… […]
[…] 物联网开源平台开发系列009 – Thingsboard服务器对IoT设备下发指令 – 陈皮… […]
[…] 物联网开源平台开发系列009 – Thingsboard服务器对IoT设备下发指令 – 陈皮… […]
[…] 物联网开源平台开发系列009 – Thingsboard服务器对IoT设备下发指令 – 陈皮… […]
[…] […]
[…] […]
[…] […]
[…] […]
[…] […]
[…] […]
[…] […]
[…] […]