ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

ThingsBoard TBEL 解码函数实战:decodeToJson + hexToBytes + parseBytesToInt 解析多设备 JSON 上行报文

ThingsBoard TBEL 解码函数实战:decodeToJson + hexToBytes + parseBytesToInt 解析多设备 JSON 上行报文 物联网后端数据可视化消息队列【免费下载链接】thingsboardAll-in-one IoT Platform - Device management, data collection, processing and visualization.项目地址https://gitcode.com/GitHub_Trending/th/thingsboard点击查看免费下载本篇指南围绕 ThingsBoard 数据转换器Data Converter中一个完整的TBEL 解码函数示例展开——它以 JSON 数组作为上行报文将每个元素中的十六进制value字段还原为电量、温度等遥测数据并借助 metadata 注入设备类型与型号最终返回包含多个设备结果对象的数组。读完本文你将掌握decodeToJson、hexToBytes、parseBytesToInt等 TBEL 内置函数的组合用法以及解码函数返回值必须满足的格式契约可直接照搬到真实集成Integration配置中。一、示例场景一份携带多条记录的 JSON 报文示例所在的example1目录由三份文件组成分别描述输入、解码函数与元数据输入报文payload.md解码函数decoder_fn.md元数据metadata.md假设某类设备网关把多条设备记录打包在一个 JSON 数组里上报每条记录包含设备序列号、事件时间戳和一个十六进制编码的原始数据值[ { serialNumber: SN-111, timestamp: 1527863043000, value: 018f0a91 }, { serialNumber: SN-333, timestamp: 1527863041000, value: 018f0a91 } ]value字段的十六进制字符串按大端Big-Endian语义拆分前 2 个字节01 8f表示电池电压后 2 个字节0a 91表示温度原始值除以 100 即为实际小数0x018f 399→3.990x0a91 2705→27.05。这正是许多 NB-IoT / LoRaWAN 传感器上报数据时常见的“整型定标”做法。同目录的 metadata.md 展示了与本次上行关联的集成元数据KeyValueintegrationNameTest integrationdeviceTypethermostatmodelModel A这些键值对来自集成配置或上行报文上下文解码函数可以通过metadata.deviceType、metadata.model直接读取实现“设备类型与型号由平台侧统一下发、报文只携带原始数据”的解耦设计。二、解码函数逐行拆解这是示例的核心解码函数完整内容见 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;1.decodeToJson(payload)把字节数组载荷还原为 JSONpayload在 TBEL 解码函数中永远是字节数组byte[]的等价类型与上行报文的内容类型声明JSON、TEXT 或 BINARY无关。decodeToJson负责把字节数组按 UTF-8 解析并转换为 JSON 对象/数组因此这里得到的就是上文那份含两条记录的数组。在底层实现中该函数由 TbUtils.java 的decodeToJson静态方法注册给 TBEL 解析器同时支持字节数组与字符串两种入参见register(ParserConfiguration)中parserConfig.addImport(decodeToJson, ...)的重载注册。注意如果 JSON 载荷本身是字符串格式如 CSV 文本则应改用decodeToString(payload)再配合JSON.parse或字符串处理函数。2. 循环遍历 设备命名从每条记录构造一台设备TBEL 允许使用类似 Java 的for (int i 0; i data.length; i)循环语法这是它与纯 JavaScript 的典型区别之一。循环内deviceName report.serialNumber直接用序列号作为设备名。由于设备名在租户范围内唯一ThingsBoard 会用该值查找已有设备若不存在且集成开启了“允许创建设备/资产”则会自动创建新设备。文档同时建议若还需要面向界面的友好显示名可补充deviceLabel字段。deviceType metadata.deviceType从元数据取值thermostat作为设备类型。3.hexToBytes(raw)十六进制字符串 → 字节数组value字段是字符串018f0a91无法直接做整数解析必须先经hexToBytes转成[0x01, 0x8f, 0x0a, 0x91]这样的字节列表。该函数在 TbUtils.java 中对应hexToBytes(ExecutionContext, String)返回 TBEL 的字节列表类型ExecutionArrayListByte同时源码还提供了hexToBytesArray用于需要原生字节数组的场景。TBEL 还配套了base64ToHex、hexToBase64、bytesToBase64等互转工具方便处理 Base64 编码的二进制载荷。4.parseBytesToInt(decoded, offset, length)按偏移截取定标整数parseBytesToInt是 TBEL 最常用的二进制拆包函数签名与行为可从 TbUtils.java 确认parseBytesToInt(data)从字节 0 开始取到int允许的最大长度BYTES_LEN_INT_MAX即 4 字节parseBytesToInt(data, offset)指定起始偏移parseBytesToInt(data, offset, length)同时指定偏移与长度默认大端序bigEndian trueparseBytesToInt(data, offset, length, bigEndian)可显式指定大小端。本例中battery: parseBytesToInt(decoded, 0, 2) / 100.0, // 取 01 8f → 399 → 3.99 temperature: parseBytesToInt(decoded, 2, 2) / 100.0, // 取 0a 91 → 2705 → 27.05实现上通过ByteBuffer完成位拼接TbUtils.java#L900-L910并对偏移与长度做越界校验validationNumberByLength。对应的单元测试覆盖了不同偏移、长度与大小端组合见 TbUtilsTest.java 中的parseBytesToInt_checkPrimitives与parseBytesToInt_checkLists。如果数据是无符号且可能超过 4 字节可改用parseBytesToUnsignedInt或parseBytesToLong浮点场景则使用parseBytesToFloat/parseBytesIntToFloat。5. 组装结果对象attributes 与 telemetry每个结果对象包含deviceName/deviceType定位或创建设备attributes服务器端属性这里写入model取自metadata.modeltelemetry时序数据对象由ts事件时间戳Unix 毫秒与values键值对组成rawData: JSON.stringify(report)把整条原始记录序列化后也存入遥测方便后续规则引擎做数据审计或回放。由于报文数组含两条记录函数返回result数组平台会为数组中的每个对象分别处理——这对应了解码函数文档中“输出可以是包含多台设备的对象数组”的要求。整个返回值契约的权威说明见解码函数总览 decoder_fn.md。三、解码函数的返回值契约必读无论业务多复杂TBEL 解码函数最终必须返回符合以下约定的 JSON详见 decoder_fn.md必须包含deviceNamedeviceType或assetNameassetType。平台据此在租户范围内查找设备/资产未找到且集成允许自动创建时新建实体可选attributes对象作为服务器端属性写入实体可选telemetry对象/数组实体的时序数据。若指定ts需为Unix 毫秒时间戳否则使用服务器时间可选customerName/groupName自动分配客户与实体分组仅在本次创建实体时生效实体已存在则忽略可选deviceLabel/assetLabel非唯一的友好显示名可替代设备名展示在仪表盘。同目录的参考输出文件 json_array_output.md、simple_json_output.md、label_json_output.md 与 simple_json_output_with_ts.md 分别展示了单设备、带 label/客户/分组、以及携带自定义时间戳的输出形态写解码函数时可直接对照。四、同主题示例横向对照decoder_fn.md 末尾的示例表将常见解码场景整理为五类本文示例属于其中“带多个十六进制值的 JSON”与“使用 metadata 字段”的组合其余示例可作为变体参考场景内容类型技术要点Simple JSON with dateJSONdecodeToJsonDate.parse(ts)解析字符串时间戳见 simple-json/decoder_fn.mdSimple CSVTEXTdecodeToString处理文本逐行解析后返回设备结果Simple binary dataBINARY直接对payload字节列表用parseBytesToInt按字节偏移拆字段见 simple-binary/decoder_fn.mdJSON with multiple hex encoded valuesJSON与本文同思路遍历数组 hexToBytesparseBytesToInt见 complex-json-hex/decoder_fn.mdUse metadata fieldsJSON用metadata决定设备类型、型号与客户见 simple-metadata/decoder_fn.md对比可以发现BINARY 报文的解码函数直接对payload本身做偏移拆包而 JSON/TEXT 报文需要先还原结构再对字符串字段做二次二进制解析——本例正是后一种组合的完整示范。五、实战要点小结把 JSON 数组批量解码为多设备结果数组时务必保证每个元素都携带deviceName与deviceType否则该条记录无法被正确路由十六进制定标数据如018f0a91统一走hexToBytesparseBytesToInt(decoded, offset, len) / divisor三步先转字节、再按偏移取整、最后还原小数注意parseBytesToInt单次最多 4 字节默认大端序metadata是集成侧注入的键值地图可在集成详情中额外配置适合下发deviceType、model等与业务报文无关的上下文信息让解码函数更通用时间戳请统一为毫秒级 Unix epoch否则平台回退使用服务器时间可能造成数据时序偏差若需要把原始报文留存用于排障JSON.stringify(report)写入rawData遥测是低成本且实用的做法。如需进一步了解编解码对侧逻辑可参考编码器示例 encoder/example1/encoder_fn.md以及解码函数 v2 变体 decoder_fn_v2.mdTBEL 内置函数的完整实现均可在 TbUtils.java 中查阅测试行为则可由 TbUtilsTest.java 验证。赞分享物联网后端数据可视化消息队列【免费下载链接】thingsboardAll-in-one IoT Platform - Device management, data collection, processing and visualization.项目地址https://gitcode.com/GitHub_Trending/th/thingsboard点击查看免费下载相关推荐ThingsBoard TBEL 解码器实战用 parseBytesToInt 解析二进制设备报文简单二进制解码示例详解ThingsBoard TBEL 解码器实战用 parseBytesToInt 解析二进制设备报文简单二进制解码示例详解 导读 本文基于 ThingsBo物联网后端数据可视化消息队列ThingsBoard TBEL 上行数据转换器解码函数payloadDecoder完全指南从二进制/JSON 报文到设备属性与遥测ThingsBoard TBEL 上行数据转换器解码函数payloadDecoder完全指南从二进制/JSON 报文到设备属性与遥测 导读 在 Thing物联网后端数据可视化消息队列在 Flame 中开启 3D 游戏开发flame_3d 环境配置、场景搭建与自定义着色器完全指南在 Flame 中开启 3D 游戏开发flame_3d 环境配置、场景搭建与自定义着色器完全指南 本文以 packages/flame_3d/README.m物联网后端数据可视化消息队列上一篇如何利用ToonCrafter轻松制作专业卡通动画从静态图片到流畅视频的完整指南下一篇混合内容安全指南如何在 HTTPS 页面上彻底清除 HTTP 资源Front-End-Checklist 实战创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表