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

📅 发布时间:2026/10/5 4:38:43
ThingsBoard MQTT 网关 JSONPath 表达式解析:从消息体与主题中提取设备数据
物联网后端数据可视化消息队列【免费下载链接】thingsboardAll-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 开始计数因此序列的第一个元素位于索引 0stop结束索引切片不包含该索引处的元素即切片会结束在该索引的前一个位置省略时切片一直延伸到序列末尾。字节解析示例消息体切片输出数据描述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 个字符索引 020[:5]取索引 04 即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 网关的表达式体系可按“数据位置”快速选型JSON 消息体→ JSONPath${sensorModelInfo.sensorName}、${data}、${data.temp}支持$、.、[]三种基本语法MQTT 主题→ 正则表达式/devices/([^/])/mytype/data用捕获组输出设备名或设备配置字节载荷→ 切片[:5]、[13:17]仅限字节转换器使用遵循含头不含尾的索引语义。配套的关联帮助文档还包括 mqtt-json-expression_fn.md 与 mqtt-expression_fn.md二者对该主题的 JSONPath、主题正则与字节切片示例做了并列呈现可作为交叉参考。掌握了这三种表达式格式的选择边界与书写规则你就能为任何结构化 MQTT 报文快速写出正确的网关映射配置。赞分享物联网后端数据可视化消息队列【免费下载链接】thingsboardAll-in-one IoT Platform - Device management, data collection, processing and visualization.项目地址https://gitcode.com/GitHub_Trending/th/thingsboard点击查看免费下载相关推荐ThingsBoard MQTT 网关集成中的表达式解析指南JSONPath 与 Topic 正则表达式的实战用法ThingsBoard MQTT 网关集成中的表达式解析指南JSONPath 与 Topic 正则表达式的实战用法 导读 本指南以 ThingsBoard M物联网后端数据可视化消息队列ThingsBoard MQTT 网关 Topic Filter 实战指南通配符、共享订阅与设备名称提取ThingsBoard MQTT 网关 Topic Filter 实战指南通配符、共享订阅与设备名称提取 本篇技术指南围绕 ThingsBoard MQTT物联网后端数据可视化消息队列ThingsBoard MQTT 网关 Bytes 转换器表达式Slice 切片语法完整指南ThingsBoard MQTT 网关 Bytes 转换器表达式Slice 切片语法完整指南 本文档讲解 ThingsBoard 中 MQTT 网关转换器C物联网后端数据可视化消息队列创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考