news 2026/10/5 4:38:36

ThingsBoard MQTT 网关 JSONPath 表达式解析:从消息体与主题中提取设备数据

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ThingsBoard MQTT 网关 JSONPath 表达式解析:从消息体与主题中提取设备数据
  • 物联网
  • 后端
  • 数据可视化
  • 消息队列

【免费下载链接】thingsboard

All-in-one IoT Platform - Device management, data collection, processing and visualization.

项目地址:https://gitcode.com/GitHub_Trending/th/thingsboard
点击查看免费下载

导读

本文聚焦 ThingsBoard MQTT 网关(Gateway)配置中“表达式(Expression)”字段的完整用法,讲解如何通过 JSONPath 从 MQTT 消息体中提取设备名称、遥测数据,通过正则表达式从主题中解析设备名称与设备配置(Device Profile),以及字节转换器中切片(Slices)语法的边界规则。读完本文,你将能够为 ThingsBoard MQTT 网关正确编写可复用的数据提取表达式,并在网关配置界面中落地验证。本文以 mqtt-json-key-expression_fn.md 为骨架,并结合仓库源码佐证底层实现。

表达式字段概述:一条消息、三种提取手段

在 ThingsBoard MQTT 网关的配置中,表达式(Expression)字段用于从 MQTT 消息中提取数据。网关收到的每一条 MQTT 消息都由两个部分组成:消息体(message body)与到达主题(topic)。针对不同的数据来源,ThingsBoard 提供了不同格式的表达式:

  • JSONPath 格式:用于从消息体中提取数据,适合 JSON 结构化的载荷;
  • 正则表达式格式:用于从消息到达的主题中提取数据,适合把设备标识编码进主题层级的情况;
  • 切片(Slices)格式:仅在**字节转换器(Bytes Converter)**的表达式字段中可用,用于按字节/字符位置截取数据。

从源码结构看,网关的这类转换能力在 MQTT 传输模块中由 AbstractGatewaySessionHandler.java 承载,它通过JsonConverter(位于 JsonConverter.java)将提取后的数据转换为 ThingsBoard 标准的遥测、属性上报消息;而在新版转换器(Converter)链路中,AbstractUplinkDataConverter.java 则负责把转换结果解析为带deviceName、telemetry、attributes等字段的上行数据。理解这些底层链路,有助于你判断表达式写错时数据会在哪个环节丢失。

JSONPath 表达式基础:定位 JSON 结构中的元素

JSONPath 表达式用于指定 JSON 结构中希望访问的元素——这个结构可以是对象、数组,或二者任意嵌套的组合。表达式依据特定条件从 JSON 数据中选取元素,其基本语法结构如下:

语法名称/作用示例
$JSON 文档的根元素$表示整个 JSON 文档
.子元素操作符,用于选取子元素$.store.book表示根下store对象的book字段
[]子元素操作符,用于选取子元素$['store']['book']与$.store.book等价,访问store对象中的book数组

其中.与[]两种子元素操作符可以混用或互换:$.store.book与$['store']['book']访问的是同一路径。实际编写时,[]写法还常用于键名含特殊字符(如空格、-、.)的场景,此时点号写法无法表达,必须用括号下标形式。

实战示例:从 JSON 消息体中提取设备名与遥测

假设某个传感器设备通过 MQTT 向网关发送如下消息:

{ "sensorModelInfo": { "sensorName": "AM-123", "sensorType": "myDeviceType" }, "data": { "temp": 12.2, "hum": 56, "status": "ok" } }

场景一:提取设备名称

如果我们需要将sensorModelInfo中的sensorName作为设备名称,使用如下表达式:

${sensorModelInfo.sensorName}

转换后的输出数据为:

AM-123

这里的${...}是表达式占位符,内部即 JSONPath 路径;sensorModelInfo省略了根元素$前缀,等价于$.sensorModelInfo.sensorName。网关会把这个提取结果作为deviceName字段,用于设备映射与自动注册。

场景二:提取整段 data 对象

如果我们需要提取上述消息中的全部数据,可以使用:

${data}

转换后的输出为整个data子对象:

{"temp": 12.2, "hum": 56, "status": "ok"}

这一用法适合将整块 JSON 作为键值型遥测批量上报:data下的每个键(temp、hum、status)都会在后续转换中展开为独立的遥测键值。

场景三:提取单个温度字段

如果只需要提取“温度”这一个字段,使用:

${data.temp}

转换后的输出为:

12.2

注意输出保留了原始 JSON 数值类型(12.2为浮点数而非字符串),这在后续JsonConverter.convertToTelemetryProto等解析过程中(见 JsonConverter.java)会被正确映射为DOUBLE_V类型的时间序列值。

场景四:提取设备类型

与设备名称同理,将表达式写成:

${sensorModelInfo.sensorType}

即可得到myDeviceType,用于在网关映射中指定设备配置文件(Device Profile)。在 AbstractUplinkDataConverter.java 的解析逻辑中,当输出 JSON 缺少deviceType字段时会回退为默认值default(源码第 49 行的DEFAULT_DEVICE_TYPE),因此显式提取sensorType能保证设备类型正确归位。

基于主题的正则表达式:从 Topic 解析设备身份

当设备名称或设备配置文件信息没有出现在消息体,而是被编码在 MQTT 主题中时,可以使用正则表达式(Regular Expression,简称 regex/regexp)从主题中解析。正则表达式是由一组字符构成、用于字符串匹配与操作的搜索模式,在网关表达式中它会被编译并应用到消息主题字符串上。

主题正则表达式示例

Topic正则表达式输出数据描述
/devices/AM123/mytype/data/devices/([^/]+)/mytype/dataAM123从主题中获取设备名称
/devices/AM123/mytype/data/devices/[A-Z0-9]+/([^/]+)/datamytype从主题中获取设备配置文件

第一条正则中,([^/]+)是一个捕获组,匹配任意非/字符的连续串,对应主题第三段AM123;捕获组提取的内容即设备名称。第二条正则用[A-Z0-9]+先消费掉设备编号段,再用([^/]+)捕获随后的mytype,作为设备配置文件名称。

编写此类表达式时需要注意:

  • 主题中的/分隔符需原样保留,因为正则对主题做整串匹配;
  • 需要提取哪一段,就把哪一段包进捕获组(...),否则匹配成功但拿不到输出;
  • 使用[^/]+这类否定字符类可以避免捕获组跨段贪婪匹配;
  • 正则默认是贪婪匹配,涉及相邻同类字符段时可用+与字符类精确界定边界(如第二条示例中先限定[A-Z0-9]+再捕获)。

字节转换器中的切片语法(边界约束)

需要特别强调的是:切片只能用于字节转换器(Bytes Converter)的表达式字段,JSONPath 与正则表达式不适用于字节载荷,反之亦然。切片用于指定如何对一段序列进行切分,确定起始点与结束点,其两个组成要素如下:

  • start(起始索引):切片包含该索引处的元素;省略时从序列开头开始切片。索引从 0 开始计数,因此序列的第一个元素位于索引 0;
  • stop(结束索引):切片不包含该索引处的元素,即切片会结束在该索引的前一个位置;省略时切片一直延伸到序列末尾。

字节解析示例

消息体切片输出数据描述
AM123,mytype,12.2,45[:5]AM123提取设备名称
AM123,mytype,12.2,45[:]AM123,mytype,12.2,45提取全部数据
AM123,mytype,12.2,45[18:]45提取湿度值
AM123,mytype,12.2,45[13:17]12.2提取温度值

以AM123,mytype,12.2,45为例(含 4 个英文逗号,共 21 个字符,索引 0~20):[:5]取索引 0~4 即AM123;[13:17]从索引 13 开始、在索引 17 前结束,恰好截出12.2;[18:]从索引 18 到末尾,得到45。切片边界遵循“含头不含尾”的 Python 式语义,规划字段宽度时要逐字符核对偏移量。

表达式在实际转换链路中的作用

在 ThingsBoard MQTT 网关中,表达式提取出的值会进入设备会话处理与数据转换链路。以 AbstractGatewaySessionHandler.java 为例,网关收到子设备消息后按deviceName维护会话(devices映射),并调用JsonConverter把解析后的 JSON 转换为PostTelemetryMsg/PostAttributeMsgprotobuf 消息,最终交给传输服务上报平台。因此:

  • 表达式提取出的设备名直接决定了网关把消息归到哪个子设备会话(processOnConnect中按deviceName、deviceType建立会话);
  • 表达式提取出的数据字段决定上报的遥测键值与数值类型;
  • 表达式写错或路径不存在时,提取结果为空,可能导致设备名缺省或遥测缺失,应从网关调试日志与设备会话状态入手排查。

小结

ThingsBoard MQTT 网关的表达式体系可按“数据位置”快速选型:

  1. JSON 消息体→ JSONPath(${sensorModelInfo.sensorName}、${data}、${data.temp}),支持$、.、[]三种基本语法;
  2. MQTT 主题→ 正则表达式(/devices/([^/]+)/mytype/data),用捕获组输出设备名或设备配置;
  3. 字节载荷→ 切片([:5]、[13:17]),仅限字节转换器使用,遵循含头不含尾的索引语义。

配套的关联帮助文档还包括 mqtt-json-expression_fn.md 与 mqtt-expression_fn.md,二者对该主题的 JSONPath、主题正则与字节切片示例做了并列呈现,可作为交叉参考。掌握了这三种表达式格式的选择边界与书写规则,你就能为任何结构化 MQTT 报文快速写出正确的网关映射配置。

  • 物联网
  • 后端
  • 数据可视化
  • 消息队列

【免费下载链接】thingsboard

All-in-one IoT Platform - Device management, data collection, processing and visualization.

项目地址:https://gitcode.com/GitHub_Trending/th/thingsboard
点击查看免费下载

相关推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/5 4:37:54

基于uniapp和Python的校园自习室预约系统设计与实现

在校园里,自习室座位紧张是每个学期末的保留节目。占座、抢座、去了发现没位置,这套循环往复的糟心事,几乎所有学生都经历过。我前阵子给学校信息中心做了一个基于微信小程序的校园自习室预约系统,前端用 uniapp,后端用…

作者头像 李华
网站建设 2026/10/5 4:37:30

断网环境下的AI编程工具离线能力实测与工作流搭建

1. 断网场景下的工具选型逻辑1.1 为什么要在断网环境里做工具盘点断网这件事,平时大家不太当回事,真到了关键时刻——比如出差在高铁上、机房割接断外网、或者单纯想验证一下自己手头的工具链到底有多少是真本事——才会发现很多工具离了网络就是一堆图标…

作者头像 李华
网站建设 2026/10/5 4:37:29

Win7登录调试实战:用WinDbg深度追踪Lsass/Winlogon/LogonUI认证链

简介:本资源是一份面向Windows内核安全研究者与系统调试工程师的深度技术文档,聚焦Win7登录认证机制逆向分析与实战调试方法。内容详述Winlogon动态进程创建、Lsass密码验证流程、RPC调用链路(如SspiCli!LsaLogonUser→SspiSrv!SpirLogonUser…

作者头像 李华
网站建设 2026/10/5 4:37:20

OpenClaw 2026.3.1 安装全指南:从WSL2到Ollama的配置实战

开始前先说明一下,我这几台设备上的 OpenClaw 版本都固定在 2026.3.1,所以这篇安装指南里凡是出现语义分歧、命令报错、配置键名对不上的问题,都以这个版本的实际行为为准。如果你手头是最新 nightly,个别命令可能略有出入&#x…

作者头像 李华
网站建设 2026/10/5 4:36:52

网络安全应急响应计划与运维应急演练实战指南

简介:这份文档面向网络运维工程师、安全运维人员及应急响应团队负责人,围绕网络安全应急响应计划的落地,系统梳理运维应急演练的流程与策略,帮助组织在遭遇网络攻击或系统故障时快速响应、降低业务损失。内容涵盖事件识别与评估、…

作者头像 李华
网站建设 2026/10/5 4:36:51

基于FrFT与曲线锯变换的图像加密:原理、实现与安全性分析

图像加密这门手艺,做到后期拼的不是花哨的算法数量,而是“你到底用什么手段把像素能量打散”。我最近用Matlab实现了一套基于分数阶傅立叶变换和曲线锯变换的图像加密方案,跑完256256标准测试图之后,可以说这套组合在统计特性和密…

作者头像 李华