新闻详情

新闻详情

首页 / 资讯中心 / 详情

ThingsBoard TBEL 解码器实战:利用集成元数据(Metadata)批量解码 JSON 与 Hex 编码遥测数据

发布时间:2026/10/2 2:10:19来源:尧图网络
ThingsBoard TBEL 解码器实战:利用集成元数据(Metadata)批量解码 JSON 与 Hex 编码遥测数据
物联网后端数据可视化消息队列【免费下载链接】thingsboardAll-in-one IoT Platform - Device management, data collection, processing and visualization.项目地址https://gitcode.com/GitHub_Trending/th/thingsboard点击查看免费下载本文以 ThingsBoard 仓库中 TBEL 解码器示例converter/tbel/examples/decoder/example1为骨架系统讲解集成数据转换器Integration Uplink Data Converter中**解码器函数Decoder与集成元数据metadata**的配合使用方式。你将学会如何为集成配置自定义 metadata 键值、如何在解码函数中通过metadata.deviceType、metadata.model等字段驱动设备/资产识别与属性下发以及如何使用decodeToJson、hexToBytes、parseBytesToInt等 TBEL 内置工具函数处理含十六进制编码字段的批量 JSON 负载最终输出符合平台规范的多设备遥测结果。一、示例背景一个批量上报 Hex 编码的真实场景ThingsBoard 的 TBELThingsBoard Expression Language解码器负责把集成Integration收到的上行消息解析、转换为平台通用的数据格式。example1示例模拟的是这样一类典型物联网接入场景网关/平台一次上报多个设备的采集数据JSON 数组每个数据点中的value字段是十六进制编码的二进制载荷例如电池电压、温度需要先转成字节数组再按偏移量解析为数值设备型号、设备类型等通用信息不重复出现在每条上报数据里而是通过集成元数据统一配置。因此该示例由三个文件构成恰好对应解码器的三个输入/配置要素文件作用payload.md模拟集成上报的原始 JSON 负载decoder_fn.md解码器函数本体TBEL / JavaScript 语法metadata.md集成级元数据配置即本文核心二、集成元数据metadata解码器的静态参数区在 ThingsBoard 集成详情中可以为每条集成额外配置一组 key/value 元数据。example1示例的元数据内容如下KeyValueintegrationNameTest integrationdeviceTypethermostatmodelModel A这三个键值在解码器中承担不同职责integrationName标识集成名称主要用于排查该条元数据属于哪条集成示例值为Test integrationdeviceType作为解码结果的设备类型deviceType平台据此对设备分类model作为设备属性attributemodel的值写入设备属性表。从 ThingsBoard 的 TBEL 解码器规范文档 可知metadata是传入解码器的第二个参数类型为{[key: string]: string}即字符串键值对映射其中除集成自带字段外还可以在集成详情中任意追加自定义键。因此metadata.deviceType、metadata.model属于用户自定义配置项解码函数运行时可直接按 key 读取。提示与simple-metadata示例metadata.md对比可见元数据键完全可以自定义——那里使用的是customerName、deviceType、deviceModel其中customerName还被用于把设备自动分配到指定客户。命名不影响语义只要在解码函数中引用同一 key 即可。三、解码器函数逐行拆解example1的解码器函数decoder_fn.md完整代码如下// decode payload to JSON var data decodeToJson(payload); var result []; for (int i 0; i data.length; i) { var report data[i]; var deviceName report.serialNumber; var deviceType metadata.deviceType; var raw report.value; var decoded hexToBytes(raw); // Result object with device attributes/telemetry data result.push({ deviceName: deviceName, deviceType: deviceType, attributes: {model: metadata.model}, telemetry: { ts: report.timestamp, values: { battery: parseBytesToInt(decoded, 0, 2) / 100.0, temperature: parseBytesToInt(decoded, 2, 2) / 100.0, rawData: JSON.stringify(report) } } }); } return result;3.1 解析负载decodeToJson(payload)payload是集成产生的字节数组。TBEL 内置函数decodeToJson会把字节数组先转字符串再按 JSON 解析返回对象或数组。此处负载为 JSON 数组因此返回一个数组data随后用data.length遍历。3.2 元数据驱动的设备识别var deviceName report.serialNumber; var deviceType metadata.deviceType;设备名deviceName取自每条上报记录中的serialNumber序列号这是设备维度各不相同的信息适合做唯一标识设备类型deviceType直接取自元数据metadata.deviceType所有设备共用同一配置值避免在每条上报中重复携带。3.3 Hex 载荷解析hexToBytesparseBytesToIntvar raw report.value; // 例如 018f0a91 var decoded hexToBytes(raw); // 转换为字节列表 [0x01, 0x8f, 0x0a, 0x91] battery: parseBytesToInt(decoded, 0, 2) / 100.0, // 取第 0~1 字节 temperature: parseBytesToInt(decoded, 2, 2) / 100.0, // 取第 2~3 字节hexToBytes(hex)把十六进制字符串转为字节列表parseBytesToInt(data, offset, length)从字节列表中按起始偏移与字节长度解析出整数。两者配合即可实现设备固件自定义二进制协议的解码先切出对应字节段再除以 100 还原出带两位小数的真实值。依据仓库前端源码 tbel-utils.models.ts该文件为 TBEL 编辑器提供函数签名与自动补全元数据hexToBytes(hex)把十六进制字符串转换为字节列表listparseBytesToInt(data, offset, length, bigEndian)offset为字节起始下标默认 0length为参与解析的字节数最多 4 字节bigEndian默认true大端序。3.4 组装输出单设备对象压入数组每个设备生成一个标准结果对象deviceName/deviceType必填的设备标识对attributes: {model: metadata.model}把元数据中的model写成设备服务端属性telemetry时间序列数据ts直接采用上报中的 Unix 毫秒时间戳values内含电池、温度与原始数据副本。多个设备对象通过result.push(...)聚合最后return result返回对象数组。这正符合 TBEL 解码器规范中输出可以是多个设备/资产对象构成的数组的要求。四、输入负载分析example1的模拟负载payload.md如下[ { serialNumber: SN-111, timestamp: 1527863043000, value: 018f0a91 }, { serialNumber: SN-333, timestamp: 1527863041000, value: 018f0a91 } ]每个元素三个字段字段类型说明serialNumberstring设备序列号作为 deviceName 唯一标识timestampnumberUnix 毫秒时间戳直接用作遥测tsvaluestring十六进制编码的二进制载荷018f0a91以第一条记录018f0a91为例推演解码结果hexToBytes(018f0a91)→[0x01, 0x8f, 0x0a, 0x91]parseBytesToInt(decoded, 0, 2)0x018f 399除以 100 →battery 3.99parseBytesToInt(decoded, 2, 2)0x0a91 2705除以 100 →temperature 27.05。解码后平台将创建/匹配设备SN-111、SN-333类型均为thermostat写入属性modelModel A并为每台设备各产生一条包含battery、temperature、rawData三条遥测的时间序列数据。五、TBEL 解码器输出规范返回结果必须满足的约束为了让解码结果真正被平台消费返回的 JSON 必须符合 TBEL 解码器规范 中的如下要求必须包含deviceNamedeviceType或assetNameassetType之一设备/资产名在租户内唯一平台据此查找已有实体若不存在且集成开启了允许创建设备/资产将自动创建。生产实践常使用 DevEUI、MAC 地址等唯一标识作为设备名可选attributes设备/资产的服务端属性集合可选telemetry时间序列数据可为对象或数组可携带自定义tsUnix 毫秒不携带ts时平台使用服务器当前时间可选customerName用于在创建设备/资产时自动归属客户客户不存在则自动创建仅创建阶段生效已存在的设备/资产会忽略该参数可选groupName用于在创建设备/资产时自动加入实体分组按租户或按客户创建同样仅创建阶段生效可选deviceLabel/assetLabel非唯一的友好显示标签用于仪表盘展示仅创建阶段生效。example1使用的正是deviceName/deviceType 必填对 attributes telemetry这一最常用组合如需把设备挂到客户与分组下可参考 simple-metadata 输出示例其解码函数decoder_fn.md展示了同时返回customerName、deviceLabel与按字符串时间解析ts的写法。六、源码级佐证TBEL 工具函数与编辑器补全本文用到的三个核心工具函数均有前端源码定义可查。在 tbel-utils.models.ts 中decodeToJson(data)Parses a JSON string or converts a list of bytes to a string and parses it as JSON.把 JSON 字符串或字节列表解析为 JSON 对象入参类型string | list返回objecthexToBytes(hex)Converts a hexadecimal string to a list of bytes.十六进制字符串 → 字节列表返回listparseBytesToInt(data, offset, length, bigEndian)Parses a list or array of bytes to an integer.其中length最大为 4、bigEndian默认true返回整数。这份模型文件同时驱动 ThingsBoard Web 界面ui-ngx中 TBEL 编辑器的代码补全与函数提示说明这些函数是官方内置能力可直接在解码器中使用。此外仓库还提供parseBytesToLong最多 8 字节、parseBytesToFloatIEEE 754、bytesToHex、base64ToHex、intToHex等一批配套工具足以覆盖常见二进制协议解析场景。七、同类示例横向对照仓库 converter/tbel/examples/decoder/ 目录下还收录了其他可组合使用的示例示例数据类型关注点simple-jsonJSON基础 JSON 解码与字符串时间戳处理simple-csvTEXT文本/CSV 格式解析simple-binaryBINARY二进制载荷直接解析含序列号、电量、温度等complex-json-hexJSON多个含 Hexvalue字段的 JSON 对象 时间戳转换simple-metadataJSON元数据驱动设备类型、型号与客户分配其中 complex-json-hex 解码函数 与本例几乎同构同样批量遍历、Hex 转字节后按偏移解析区别是deviceType采用硬编码Thermometer而example1改为从metadata.deviceType读取——这正是集成元数据复用的价值所在同一份解码逻辑可复制到多条集成只需修改元数据即可适配不同设备型号无需改动脚本。八、实践要点总结元数据是解码器的第二参数function Decoder(payload, metadata)metadata为字符串键值对可在集成详情中自由配置命名约定deviceType、model、customerName等键名均为用户自定义解码函数中按相同 key 引用即可官方示例倾向于用语义化命名批量上报输入为数组时解码器应遍历并返回对象数组每个对象对应一台设备/资产Hex 载荷解码三件套hexToBytes转字节 →parseBytesToInt按偏移/长度取值 → 除以精度系数还原真实值输出约束deviceName/deviceType或assetName/assetType必选attributes、telemetry、customerName、groupName、deviceLabel按需携带校验工具将以上函数签名与编辑器补全定义对照 tbel-utils.models.ts可确保解码函数在 TBEL 运行时环境中可用。通过example1这套输入负载 解码函数 元数据三位一体的示例即可快速搭建起一条支持多设备、二进制协议、元数据驱动识别的上行数据转换链路。赞分享物联网后端数据可视化消息队列【免费下载链接】thingsboardAll-in-one IoT Platform - Device management, data collection, processing and visualization.项目地址https://gitcode.com/GitHub_Trending/th/thingsboard点击查看免费下载相关推荐Grok Build 终端支持与故障排查从 /doctor 诊断到 tmux、SSH、剪贴板与 RTL 实战指南Grok Build 终端支持与故障排查从 /doctor 诊断到 tmux、SSH、剪贴板与 RTL 实战指南 Grok Build 以全屏 TUI 形式运物联网后端数据可视化消息队列chezmoi target-path 命令详解从源路径反推目标路径的原理与实战chezmoi target path 命令详解从源路径反推目标路径的原理与实战 target path 是 chezmoi 提供的一个内部辅助命令用于把一物联网后端数据可视化消息队列在 Flame 中开启 3D 游戏开发flame_3d 环境配置、场景搭建与自定义着色器完全指南在 Flame 中开启 3D 游戏开发flame_3d 环境配置、场景搭建与自定义着色器完全指南 本文以 packages/flame_3d/README.m物联网后端数据可视化消息队列上一篇Mac Mouse Fix终极指南让普通鼠标在macOS上超越苹果触控板体验下一篇Roc 编译器快照测试深度解析从 expr_tag 看 Tag 表达式与开放标签联合的编译管线创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Spring Boot集成Redis缓存实战:从配置到高可用的避坑指南 2026/10/2 3:06:01

Spring Boot集成Redis缓存实战:从配置到高可用的避坑指南

缓存这个东西,我一开始以为是"加个注解就完事"的简单活,直到在线上被教育过好几次才明白,Spring Boot集成Redis缓存的门道远比想象中多。配置层面的坑、序列化的坑、数据一致性的坑、热key的坑,每一个都可能让系统在流量…

阅读更多 →
德卡D8读卡器开发包实战:从环境配置到APDU收发与避坑指南 2026/10/2 3:06:01

德卡D8读卡器开发包实战:从环境配置到APDU收发与避坑指南

简介:德卡D8读卡器开发包面向需要开发德卡D8/T8射频卡读写器应用程序的C开发者,无论是刚接触射频识别的初学者,还是希望优化高级功能的资深工程师,都能从中获得完整的工具与参考。包内共320个文件,约30.75MB&#xff0…

阅读更多 →
德卡D8读卡器开发包实战:从驱动安装到APDU稳定读卡 2026/10/2 3:06:01

德卡D8读卡器开发包实战:从驱动安装到APDU稳定读卡

简介:德卡D8读卡器开发包面向需要开发德卡D8/T8射频卡读写器应用程序的C开发者,无论是刚接触射频识别的初学者,还是希望优化高级功能的资深工程师,都能从中找到可用的工具与参考。压缩包共320个文件,约30.75MB&#xf…

阅读更多 →
Kubuntu 22.04 从安装到配置:KDE Plasma 桌面全流程 2026/10/2 3:06:01

Kubuntu 22.04 从安装到配置:KDE Plasma 桌面全流程

跑了几年 Ubuntu 的 GNOME 桌面之后,我一度以为自己已经习惯了那套操作逻辑——直到某次在一台闲置的老笔记本上重装系统,顺手换成了 Kubuntu 22.04,才发现 KDE Plasma 在资源占用和可定制性上真的比 GNOME 舒服不少。开机能压到 500MB 内存出…

阅读更多 →
前端接口模拟与 Mock 实践:Apifox 打通前后端联调 2026/10/2 3:06:01

前端接口模拟与 Mock 实践:Apifox 打通前后端联调

上周三下午,产品经理在群里甩过来一张原型图,说这个页面下周一要给客户演示。我看了眼接口文档,后端同事那边表结构还在改,接口最快也得下周三才能出第一版。这种场景做前端的应该都不陌生——布局、交互、样式、动画全都能自己搞…

阅读更多 →
SpringBoot日志文件配置实战:滚动策略、磁盘清理与traceId全解析 2026/10/2 3:05:42

SpringBoot日志文件配置实战:滚动策略、磁盘清理与traceId全解析

上周五临下班,我把一个 SpringBoot 服务部署到测试环境,第二天早上一看磁盘告警:/data/logs/app.log 已经占了 28GB。检查之后发现不是什么业务 bug——是我的日志配置太粗放,一个线程池满的 WARN 日志每秒钟刷几百条,…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉