物联网开源平台开发系列009 – Thingsboard服务器对IoT设备下发指令

上一篇文章讲述了IoT设备如何向Thingsboard上报遥测数据 , 这篇来讲述从服务器向IoT设备下发指令有哪些方法。

Thingsboard中向IoT设备下发指令,通常有以下2种:

  1. RPC , 主要是Server端的RPC
  2. 属性订阅, IoT设备订阅属性更新
  3. 我设计的指令队列方式

一、RPC

RPC(Remote Procedure Call) 即远程过程调用,在Thingsboard中提供了多种RPC调用方法, 参考官方文档

1、服务器端RPC

从服务器端给IoT设备下发指令,因此最适合的就是服务器端的双向 RPC(Two-way server-side RPC),看官方原图画的很清晰。

物联网开源平台开发系列009 – Thingsboard服务器对IoT设备下发指令

管理系统下指令给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 调用请求节点将消息发送到设备。

规则引擎设计如下:

物联网开源平台开发系列009 – Thingsboard服务器对IoT设备下发指令
物联网开源平台开发系列009 – Thingsboard服务器对IoT设备下发指令

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命令的下发情况:

物联网开源平台开发系列009 – Thingsboard服务器对IoT设备下发指令

持久性 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请求, 服务器把指令发给设备端。

物联网开源平台开发系列009 – Thingsboard服务器对IoT设备下发指令

a. 客户端 RPC request包含两个字段,均为必填字段:

  • method – RPC调用的方法名称。例如,“getCurrentTime”或“getWeatherForecast”。该参数的值是一个字符串。简单说,就是一个请求指令名供服务器识别。
  • params – 用于处理请求的附加参数。该值为 JSON。如果不需要参数,则保留为空的 JSON“{}”。

b. RPC reponse可以是任意数字、字符串或 JSON。

c. 规则链如下设计:

物联网开源平台开发系列009 – Thingsboard服务器对IoT设备下发指令
物联网开源平台开发系列009 – Thingsboard服务器对IoT设备下发指令

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

淘宝小店:陈皮王五工作室

(0)
GaryGary
上一篇 2025-02-07 下午7:40
下一篇 2025-02-12 下午4:46

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

评论列表(18条)