ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

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

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),仅供参考
返回列表