使用 RPC 功能
客户端 RPC
从设备发送客户端 RPC
平台处理客户端RPC
服务器端 RPC
服务器端RPC结构
发送服务器端RPC
使用 RPC 功能
ThingsBoard 允许您从服务器端应用程序向设备发送远程过程调用 (RPC),反之亦然。基本上,此功能允许您向设备发送命令或从设备发送命令并接收命令执行结果。本指南涵盖 ThingsBoard RPC 功能。阅读本指南后,您将熟悉以下主题:
- RPC 类型;
- 基本 RPC 用例;
- RPC客户端和服务器端API;
- RPC 小部件。
ThingsBoard RPC 功能根据远程过程执行的发起者可以分为两种类型:设备发起的 RPC 和服务器发起的 RPC。为了使用更熟悉的名称,我们将设备发起的 RPC 调用命名为客户端RPC,将服务器发起的 RPC 命名为服务器端RPC。
客户端 RPC
客户端 RPC 功能允许您将请求从设备发送到平台,并将响应返回给设备。
让我们回顾一下客户端 RPC 调用的典型用例:
- 灌溉系统通过平台从在线服务获取天气预报。
- 没有系统时钟的受限设备向平台请求当前时间戳。
- 门禁读卡器向第三方安全系统发送请求,以做出开门并记录访问的决定。
在底层,设备向平台发送一条消息,该消息由规则引擎处理。规则引擎可以使用设备属性、遥测或存储在平台中的任何其他数据来应用一些计算。如果需要,规则引擎还可以调用外部系统。处理消息后,结果将发送回设备。见下图:
客户端 RPC 请求由两个字段组成,这两个字段都是必填的:
- method - 用于区分 RPC 调用的方法名称。例如,“getCurrentTime”或“getWeatherForecast”。参数的值是一个字符串。
- params - 用于处理请求的附加参数。该值是 JSON。如果不需要参数,请保留空 JSON“{}”。
RPC 请求示例:
"method": "getCurrentTime",
RPC 响应可以是任何数字、字符串或 JSON。例如:
从设备发送客户端 RPC
ThingsBoard 提供了一个 API 来从设备发送 RPC 命令。该 API 特定于每个受支持的网络协议。您可以在相应的参考页面查看 API 和示例:
LwM2M 和 SNMP 协议尚不支持客户端 RPC。
客户端 RPC 命令转换为消息类型为“TO_SERVER_RPC_REQUEST”的规则引擎消息。该消息包含基于唯一 UUID 的标识符,该标识符存储在“requestId”元数据字段中。您可以设计规则链以使用转换、丰富或任何其他规则节点类型 来处理传入消息。一旦传入消息转换为响应消息,就应该使用RPC Call Reply节点向设备发送回复。
例如,让我们修改根规则链以处理“getCurrentTime”客户端 RPC 并回复当前时间(以毫秒为单位)。我们将使用“Script”转换节点和以下 JS 代码:
if (msg.method === "getCurrentTime"){
rpcResponse = new Date().getTime();
rpcResponse = "Unknown RPC request method: " + msg.method;
return {msg: rpcResponse, metadata: metadata, msgType: msgType};
将RPC命令发送到服务端必须PUBLISH消息发送到下面主题:
v1/devices/me/rpc/request/$request_id
$request_id表示请求的整型标识符服务端必须发布到下面主题:
v1/devices/me/rpc/response/$request_id
服务器端 RPC
服务器端 RPC 功能允许您将请求从平台发送到设备,并可选择将响应返回到平台。
服务器端 RPC 调用的典型用例是各种远程控制:重新启动、打开/关闭引擎、更改 GPIO/执行器的状态、更改配置参数等。
服务器端RPC分为单向和双向:
双向 RPC 请求期望在可配置的超时时间内收到设备的响应。
在 3.3 版本之前,ThingsBoard 仅支持轻量级RPC。轻量级 RPC 调用是短暂的,通常在 30 秒内,这是对平台的任何 REST API 调用的默认超时。由于它们的生命周期很短,因此没有理由将它们存储到数据库中。它们存在于服务器的内存中,假设如果服务器挂掉,仪表板小部件将向集群中的其他 ThingsBoard 服务器发送相同的请求。轻量级 RPC 消耗少量资源,因为它们的处理不会调用任何输入/输出操作,接受审计日志和规则引擎消息的存储。
从 3.3 版本开始,ThingsBoard 提供了对持久RPC 调用的支持。持久 RPC 具有可配置的生命周期并存储在数据库中。当您的设备可能长时间无法访问时,持久 RPC 非常有用。这种情况通常发生在网络连接不良或节能模式(PSM)的情况下。
服务器端RPC结构
服务器端RPC请求体由多个字段组成:
- method - 强制,用于区分 RPC 调用的方法名称。例如,“getCurrentTime”或“getWeatherForecast”。参数的值是一个字符串。
- params - 强制,用于处理请求的参数。该值是 JSON。如果不需要参数,请保留空 JSON“{}”。
- timeout - 可选,处理超时值(以毫秒为单位)。默认值为 10000(10 秒)。最小值为 5000(5 秒)。
- 过期时间- 可选,纪元时间值(以毫秒为单位,UTC 时区)。如果存在超时,则覆盖该超时。
- 持久性- 可选,请参阅[持久性]与[轻量级]RPC。默认值为“假”。
- 重试- 可选,定义在网络和/或设备端发生故障时将重新发送持久 RPC 的次数。
- extraInfo - 可选,定义将添加到[持久 RPC 事件]的持久 RPC 的元数据。
RPC 请求示例:
发送服务器端RPC
服务器端 RPC 通常使用 REST API 或仪表板小部件发送。事实上,仪表板小部件使用相同的 REST API。一旦平台收到 RPC,它就会验证有效负载并运行权限检查。然后,服务器端RPC命令被转换为规则引擎消息。规则引擎可以用附加参数来丰富命令,并最终将命令传送到设备。
我们来详细回顾一下如何发送命令:
客户端订阅服务端RPC命令必须SUBSCRIBE消息发送下面主题:
v1/devices/me/rpc/request/+
订阅后客户端会收到一条命令作为对相应主题的PUBLISH命令:
v1/devices/me/rpc/request/$request_id
$request_id表示请求的整型标识符。
客户端PUBLISH下面主题进行响应:
v1/devices/me/rpc/response/$request_id