ThingsBoard远程RPC调用设备

使用 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","params": {}
}

RPC 响应可以是任何数字、字符串或 JSON。例如:

1631881236974
从设备发送客户端 RPC

ThingsBoard 提供了一个 API 来从设备发送 RPC 命令。该 API 特定于每个受支持的网络协议。您可以在相应的参考页面查看 API 和示例:​​​​​​

LwM2M 和 SNMP 协议尚不支持客户端 RPC。

平台处理客户端RPC

客户端 RPC 命令转换为消息类型为“TO_SERVER_RPC_REQUEST”的规则引擎消息。该消息包含基于唯一 UUID 的标识符,该标识符存储在“requestId”元数据字段中。您可以设计规则链以使用转换、丰富或任何其他规则节点类型 来处理传入消息。一旦传入消息转换为响应消息,就应该使用RPC Call Reply节点向设备发送回复。

例如,让我们修改根规则链以处理“getCurrentTime”客户端 RPC 并回复当前时间(以毫秒为单位)。我们将使用“Script”转换节点和以下 JS 代码:

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};

将RPC命令发送到服务端必须PUBLISH消息发送到下面主题:

v1/devices/me/rpc/request/$request_id

$request_id表示请求的整型标识符服务端必须发布到下面主题:

v1/devices/me/rpc/response/$request_id
  • 将请求发送到服务器

  • 收到服务器的响应

服务器端 RPC

服务器端 RPC 功能允许您将请求从平台发送到设备,并可选择将响应返回到平台。

服务器端 RPC 调用的典型用例是各种远程控制:重新启动、打开/关闭引擎、更改 GPIO/执行器的状态、更改配置参数等。

服务器端RPC分为单向和双向:

  • 单向 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 请求示例:

{"method": "setGPIO","params": {"pin": 4,"value": 1},"timeout": 30000
}

发送服务器端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
  • 使用RPC debug terminal在仪表板调试

  • 订阅服务器RPC命令

  • 请求”connect”发送到设备

  • 收到设备的响

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/829509.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python 数组控件的使用

当一个UI窗口界面内有多个相同类型的控件,且这多个控件的功能都类似时,使用数组控件是一个非常不错的选择,可以大大减少代码的编写 且 代码易读性强,可惜的是Python好象是没有数组控件这个东东。 我们来看看以下一个界面&#xff…

Linux:服务器硬件及RAID配置

文章目录 Linux:服务器硬件及RAID配置服务器服务器是什么服务器的结构 RAID硬RAID与软RAID对比RAID级别介绍RAID 0RAID 1RAID 5RAID 6RAID 10 RAID级别对比 配置RAID硬RAID软RAID Linux:服务器硬件及RAID配置 服务器 服务器是什么 服务器的英文名称为…

Linux进程概念(六):进程控制

目录 进程创建 fork函数 进程终止 终止时干了什么 进程终止的三种情况 main函数的返回值 打印默认退出码 自定义退出码 总结 进程终止 exit函数 _exit函数 exit和_exit的区别 进程等待 什么是进程等待 为什么要有进程等待 wait函数 waitpid函数 阻塞等待与…

环形链表——java

给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(…

Axure实现tab页面切换功能

1. 实现效果 2. 实现原理 创建两个标签,并实现点击时选中状态点击时,设置面板状态 3. 实现步骤 3.1 实现可切换的标签 在页面上拖拽两个矩形作为两个tab标签,并命名 tab1 和 tab2 设置每个矩形的边框显示,只显示下边框即可 …

C#反射应用

1.根据类名名称生成类实例 CreateInstance后面的参数部分一定要和所构造的类参数数量对应,即使设置参数默认值,也不可省略。 2.只知道类名,需要将该类作为参数调用泛型接口。 3.只知道类名,需要将该类的数组作为参数调用泛型接口…

顺序查找和折半查找

顺序查找: 对于无序的情况: 什么是顺序查找:顺序查找的实现方式(存储),是含有两种的方式进行存储的,一种是顺序表的形式进行存储,还有一种是使用链表的形式进行存储的。采用顺序查…

架构师系列- 消息中间件(15)-kafka业务实战

7.1 顺序性场景 7.1.1 场景概述 假设我们要传输一批订单到另一个系统,那么订单对应状态的演变是有顺序性要求的。 已下单 → 已支付 → 已确认 不允许错乱! 7.1.2 顺序级别 1)全局有序: 串行化。每条经过kafka的消息必须严格…

ElasticSearch教程入门到精通——第二部分(基于ELK技术栈elasticsearch 7.x+8.x新特性)

ElasticSearch教程入门到精通——第二部分(基于ELK技术栈elasticsearch 7.x8.x新特性) 1. JavaAPI-环境准备1.1 新建Maven工程——添加依赖1.2 HelloElasticsearch 2. 索引2.1 索引——创建2.2 索引——查询2.3 索引——删除 3. 文档3.1 文档——重构3.2…

react,Chart

一、基础图:https://ant-design-charts.antgroup.com/ Ant Design Charts 1. 首先要下载ant-design/charts,然后在页面中添加如下柱状图代码: import React from react; import { Column } from ant-design/chartsconst DemoColumn: React.FC () …

百度智能云千帆 ModelBuilder 技术实践系列:通过 SDK 快速构建并发布垂域模型

​百度智能云千帆大模型平台(百度智能云千帆大模型平台 ModelBuilder)作为面向企业开发者的一站式大模型开发平台,自上线以来受到了广大开发者、企业的关注。至今已经上线收纳了超过 70 种预置模型服务,用户可以快速的调用&#x…

深入理解冯诺依曼体系结构

文章目录 冯诺依曼体系结构概念冯诺依曼体系结构的优势冯诺依曼体系结构的现实体现 冯诺依曼体系结构概念 冯诺依曼体系结构也称普林斯顿结构,是现代计算机发展的基础。它的主要特点是“程序存储,共享数据,顺序执行”,即程序指令和…

代码随想录算法训练营Day10 | 232.用栈实现队列、225. 用队列实现栈

232.用栈实现队列 题目:请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty): 实现 MyQueue 类: void push(int x) 将元素 x 推到队列的末尾int pop() 从队列的开头移除…

【leetcode面试经典150题】75. 二叉树展开为链表(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主,题解使用C语言。(若有使用其他语言的同学也可了解题解思路,本质上语法内容一致&…

修改Docker容器内文件的三种方式

说明:本文介绍修改Docker容器内文件的三种方式 方式一:直接修改 敲下面的命令,进入Docker容器,如mysql docker exec -it mysql /bin/bash修改mysql的配置文件,/etc/my.cnf vim /etc/my.cnf如下,如果vim…

【Hadoop】-Apache Hive使用语法与概念原理[15]

一、数据库操作 创建数据库 create database if not exists myhive; 使用数据库 use myhive; 查看数据库详细信息 desc database myhive; 数据库本质上就是在HDFS之上的文件夹。 默认数据库的存放路径是HDFS的:/user/hive/warehouse内 创建数据库并指定hdfs…

attempt to compare nil with number -- 黑马点评出现问题

问题情况 : 主要问题 : 调用lua执行redis时,有一个值会接受nil(因为redis中没有该数据)或者数值,当该值为nil时执行报错,因为会用到将该值与其他数字比较,故报错attempt to compare nil with number 当然…

生成完美口型同步的 AI 代言人视频(及其实现原理详解)

目录 什么是Heygen? Heygen注册 Video Translation(视频翻译 完美口型同步) 实现原理详解 视频翻译部分 完美口型同步部分 什么是Heygen? Heygen是一款在线工具,可帮助您生成具有完美口型同步的 AI 代言人视频。 Heygen注册 https:…

关于springboot内置tomcat最大请求数配置的一些问题

前言 springboot内置了tomcat。那么一个springboot web应用,最大的请求链接数是多少呢?很早以前就知道这个是有个配置,需要的时候,百度一下即可。但,事实并非如此,有几个问题我想大多数人还真不知道。比如…

前端学习<四>JavaScript——54-原型链

常见概念 构造函数 构造函数-扩展 原型规则和示例 原型链 instanceof 构造函数 任何一个函数都可以被 new,new 了之后,就成了构造方法。 如下: function Foo(name, age) {this.name name;this.age age;//retrun this; //默认有这…