新闻详情

新闻详情

首页 / 资讯中心 / 详情

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

发布时间:2026/10/2 7:56:41来源:尧图网络
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),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

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

较早相关资讯

最新相关资讯

从零训练一个8600万参数GPT模型:全链路工程实践 2026/10/2 8:39:05

从零训练一个8600万参数GPT模型:全链路工程实践

1. 从零开始前,先把成本账算清楚先说结论:所谓 "ai-engineering-from-scratch",在大多数人的预期里不应该是"复现ChatGPT",而是亲手把一条管线的每一个环节都踩一遍——数据怎么洗、token怎么分、模型怎么搭、…

阅读更多 →
把OneDrive搬到外置硬盘:官方迁移、Junction方案与排障全指南 2026/10/2 8:38:58

把OneDrive搬到外置硬盘:官方迁移、Junction方案与排障全指南

把 OneDrive 的 Location 改到 external drive(外置硬盘),听起来就是“设置里改个路径”,但实际操作起来坑不少。我帮同事和朋友处理过不下十几台机器,有的是 C 盘空间告急,有的是设计素材库几百个 G 塞不下…

阅读更多 →
创业摸爬滚打生存指南:从资金链到团队内耗的避坑实录 2026/10/2 8:38:58

创业摸爬滚打生存指南:从资金链到团队内耗的避坑实录

创业这事儿,围城效应特别明显。外面的人看着别人融资、开发布会、晒工位,觉得风光无限;里面的人才知道什么叫真正的摸爬滚打。我前后折腾过三个项目,第一个死在产品上线前夜,第二个死在自己手里——被所谓的完美主义活…

阅读更多 →
Everything 1.4.1.1032精简单文件版:原理、精简与实操指南 2026/10/2 8:38:58

Everything 1.4.1.1032精简单文件版:原理、精简与实操指南

Windows 上用过自带搜索的都知道那滋味:明明文件名就在眼皮底下,搜索框里敲进去,它给你转十分钟圈,最后还甩一句“搜索可能较慢”。后来我从一个装机维护的老前辈手里拿到 Everything 1.4.1.1032 精简单文件版,一个 ex…

阅读更多 →
Power Pivot数据建模全解析:DAX度量值、表关系与时间智能实战 2026/10/2 8:38:45

Power Pivot数据建模全解析:DAX度量值、表关系与时间智能实战

在使用 Excel 做报表分析时,很多同学会遇到一个尴尬的痛点:数据量一旦超过几十万行,普通透视表要么打开慢,要么多表关联无从下手;而想计算“同比环比”“各区域累计占比”“客户排名”这类稍微复杂一点的分析&#xff…

阅读更多 →
Power Pivot数据建模实战:多表关联与DAX度量值自动化分析 2026/10/2 8:38:45

Power Pivot数据建模实战:多表关联与DAX度量值自动化分析

很多时候,Excel 里分析数据的瓶颈不在公式本身,而在数据的组织方式。单表几万行用 SUMIFS、VLOOKUP 还能硬扛,可一旦面对多表关联、明细几十万行、还要按时间或门店灵活汇总,普通函数和透视表就会显得吃力。这次我们要讲的 Power …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

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

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