ARTICLE DETAIL

资讯详情

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

ThingsBoard TBEL 解码器实战:simple-metadata 示例如何将 JSON 载荷与设备元数据组合为遥测数据

ThingsBoard TBEL 解码器实战:simple-metadata 示例如何将 JSON 载荷与设备元数据组合为遥测数据 物联网后端数据可视化消息队列【免费下载链接】thingsboardAll-in-one IoT Platform - Device management, data collection, processing and visualization.项目地址https://gitcode.com/GitHub_Trending/th/thingsboard点击查看免费下载本篇文章以 ThingsBoard 仓库内置的 TBELThingsBoard Expression Language解码器示例simple-metadata为主线完整讲解设备原始 JSON 载荷、解码器可用元数据、TBEL 解码函数与最终输出结果四要素的协作方式并落到源码层解释decodeToJson等内置函数的实现。读完本文你将能够独立编写“载荷解析 元数据回填 遥测构造”的 TBEL 解码器并理解其结果对象的结构约定。1. 示例定位一个四文件联动的解码器教学单元在 ThingsBoard 前端仓库中解码器示例以一组帮助文档的形式存放于ui-ngx/src/assets/help/en_US/converter/tbel/examples/decoder/simple-metadata/目录下共四个文件分别对应解码链路中的一个环节文件角色payload.md设备上报的原始 JSON 载荷metadata.md解码器执行时可访问的元数据键值对decoder_fn.mdTBEL 解码函数JavaScript 语法output.md解码函数返回的最终结果这套“载荷 → 元数据 → 函数 → 输出”的四文件结构也被同一目录下的其他解码器示例复用如simple-json、simple-csv、simple-binary、complex-json-hex是仓库内置教学资料的标准编排方式。此外文档中的{:copy-code}是ui-ngx前端渲染帮助面板时注入的复制按钮标记并非代码内容本身阅读与复制的实际代码以代码块中 JSON/JavaScript 内容为准。2. 原始载荷设备上报的 JSONpayload.mdpayload.md 展示了一个典型的温湿度传感器 JSON 载荷{ serialNumber: SN-111, ts: 2021-11-21 14:27:39 UTC, t: 36.6, h: 70 }各字段含义与后续解码的对应关系如下字段类型示例值在解码器中的用途serialNumberstringSN-111用作设备名称deviceNametsstring带时区的时间文本2021-11-21 14:27:39 UTC经Date.parse转为遥测时间戳tstnumber浮点36.6映射为遥测temperaturehnumber整数70映射为遥测humidity值得注意的两点ts采用YYYY-MM-DD HH:mm:ss UTC的文本格式而非 Unix 毫秒时间戳因此解码函数必须显式调用时间解析逻辑见第 4 节。serialNumber是设备标识信息示例刻意将设备命名交由载荷字段决定与设备类型、客户、型号等静态信息放在元数据中分离体现“动态数据来自载荷、静态配置来自元数据”的解耦思想。3. 元数据解码器运行时的静态上下文metadata.mdmetadata.md 给出了本示例解码时可用的元数据表KeyValuecustomerNameCustomer CdeviceTypeThermostatdeviceModelModel A在 TBEL 解码函数中这些键值对通过metadata对象访问例如metadata.deviceType、metadata.customerName、metadata.deviceModel。元数据与载荷的本质区别在于载荷payload设备每次上报都会变化的数据如温度、湿度、时间元数据metadata与设备绑定、相对固定的上下文信息如设备类型、所属客户、设备型号。通过元数据驱动解码逻辑可以将“设备是恒温器、属于客户 C、型号为 Model A”这类静态事实从解码函数中抽离出来使同一份解码脚本可被不同设备复用——设备只需在转换配置中维护自己的元数据即可无需修改脚本本体。4. 解码函数逐行拆解 TBEL 脚本decoder_fn.mddecoder_fn.md 提供的完整解码函数如下// decode payload to JSON. See helper function below var json decodeToJson(payload); // convert date to epoch in milliseconds var timestamp Date.parse(json.ts); // Construct result object with time-series data var result { deviceName: json.serialNumber, deviceType: metadata.deviceType, customerName: metadata.customerName, attributes: { model: metadata.deviceModel }, telemetry: { ts: timestamp, values: { temperature: json.t, humidity: json.h, } } }; return result;逐行解读如下decodeToJson(payload)将设备上报的原始载荷解析为 JSON 对象。decodeToJson是 TBEL 引擎内置注册的辅助函数源码见common/script/script-api/src/main/java/org/thingsboard/script/api/tbel/TbUtils.java同时提供接收字节列表与接收字符串的两个重载版本底层通过TbJson.parse完成解析TbUtils.java#L399-L405对应源码注释中的 “See helper function below” 所指的正是这类内置工具函数。Date.parse(json.ts)把文本时间2021-11-21 14:27:39 UTC解析为 Unix 毫秒时间戳。按该时间换算得到1637504859000毫秒这正是第 5 节输出结果中的telemetry.ts值。此处复用 JavaScript 标准的Date.parse能力要求设备时间文本可被其识别若设备上报的是其他时间格式则需要先做格式规整。结果对象组装解码函数返回值是一个统一结构的对象包含deviceName取自载荷字段json.serialNumber设备名称动态来源于上报数据deviceType、customerName取自元数据metadata.deviceType、metadata.customerNameattributes将元数据中的deviceModel以键model写入设备属性telemetry包含ts时间戳与values遥测键值对temperature与humidity分别取自json.t与json.h。从仓库中多个解码器示例如simple-json可以推断该结果对象是 TBEL 解码器通用的返回契约deviceName/deviceType用于设备创建与分类attributes写入设备属性telemetry以{ ts, values }结构写入时序数据customerName等字段用于归属关联。5. 输出结果验证解码正确性的基准output.mdoutput.md 展示了上述函数对载荷与元数据的最终输出{ deviceName: SN-111, deviceType: Thermostat, customerName: Customer C, attributes: { model: Model A }, telemetry: { ts: 1637504859000, values: { temperature: 36.6, humidity: 70 } } }从“输入 → 输出”的映射关系可以清晰看到每一环的数据流输出字段来源输入示例值deviceName载荷serialNumberSN-111deviceType元数据deviceTypeThermostatcustomerName元数据customerNameCustomer Cattributes.model元数据deviceModelModel Atelemetry.ts载荷ts经Date.parse1637504859000telemetry.values.temperature载荷t36.6telemetry.values.humidity载荷h70这一输出既可作为 UI 数据转换器测试面板中的预期结果对照也可作为回归验证基准只要输入载荷与元数据不变解码函数应稳定产出上述结构任何字段缺失或类型偏差都意味着脚本需要修正。6. 源码级原理TBEL 引擎与内置函数实现TBEL 是 ThingsBoard 在数据转换器中使用的脚本语言其运行时位于common/script/script-api/src/main/java/org/thingsboard/script/api/tbel/。示例解码脚本用到的能力在源码中均有对应实现decodeToJson的注册TbUtils.java在初始化解析器配置时通过parserConfig.addImport(decodeToJson, new MethodStub(TbUtils.class.getMethod(decodeToJson, ...)))将该函数注册为脚本可见的内置导入约 TbUtils.java#L98-L100这正是脚本中无需声明即可直接调用decodeToJson(payload)的原因。decodeToJson的实现提供两个重载——decodeToJson(ExecutionContext ctx, ListByte bytesList)与decodeToJson(ExecutionContext ctx, String jsonStr)前者先将字节列表转为字符串最终都由TbJson.parse解析为可操作的 JSON 对象TbUtils.java#L399-L405。字节列表重载意味着即使设备上报的是字节流decodeToJson也能直接处理这也解释了其他示例如simple-binary中同样的调用方式。测试覆盖common/script/script-api/src/test/java/org/thingsboard/script/api/tbel/TbUtilsTest.java中存在对decodeToJson等工具函数的测试用例可作为内置函数行为正确性的依据。从源码结构看payload、metadata与msg等上下文变量由 TBEL 执行上下文ExecutionContext在调用解码函数时注入脚本中直接引用即可这与第 3、4 节中的使用方式一致。7. 横向对比与实战建议将simple-metadata与同目录的simple-json示例对比可以直观看出元数据化改造的价值simple-jsondeviceType与deviceLabel直接硬编码在解码函数中如deviceType: Thermostat、deviceLabel: Kitchen Thermostat脚本与具体设备绑定simple-metadatadeviceType、customerName、deviceModel全部取自metadata脚本保持通用同一函数可为不同客户、不同型号的设备服务。在项目实践中编写此类解码器时有几点建议键名大小写与拼写保持一致载荷字段如t、h与元数据键如deviceType在脚本中逐字引用任何不一致都会导致解析结果为空或报错为元数据缺失预留兜底示例直接使用metadata.xxx若某设备未配置对应元数据键可在脚本中先判断再取默认值增强健壮性时间戳统一为毫秒Date.parse输出毫秒时间戳注意与设备端或平台侧要求的精度秒/毫秒保持一致参考同类示例扩充格式支持仓库ui-ngx/src/assets/help/en_US/converter/tbel/examples/decoder/下还提供了simple-csv、simple-binary、complex-json-hex等示例分别覆盖 CSV 文本、二进制字节流与十六进制嵌套 JSON处理非 JSON 载荷时可对照阅读。总结simple-metadata示例完整演示了 ThingsBoard TBEL 解码器的核心工作模式用decodeToJson解析设备原始 JSON 载荷用Date.parse规整时间戳将动态数据设备名、遥测值与静态元数据设备类型、客户、型号组装进统一的结果对象最终驱动设备创建、属性写入与遥测存储。借助仓库内置帮助文档ui-ngx/src/assets/help/en_US/converter/tbel/examples/decoder/与common/script/script-api/src/main/java/org/thingsboard/script/api/tbel/TbUtils.java中的实现与测试你可以快速验证、复用并扩展这一模式到自己的设备接入场景。赞分享物联网后端数据可视化消息队列【免费下载链接】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 形式运物联网后端数据可视化消息队列在 Flame 中开启 3D 游戏开发flame_3d 环境配置、场景搭建与自定义着色器完全指南在 Flame 中开启 3D 游戏开发flame_3d 环境配置、场景搭建与自定义着色器完全指南 本文以 packages/flame_3d/README.m物联网后端数据可视化消息队列ThingsBoard 二进制数据解码器实战用 JavaScript 将字节流解析为设备遥测simple-binary Decoder 完整指南ThingsBoard 二进制数据解码器实战用 JavaScript 将字节流解析为设备遥测simple binary Decoder 完整指南 本指南以物联网后端数据可视化消息队列上一篇UnityPsdImporter 深度解析5分钟掌握PSD到Unity的完美转换下一篇零基础读懂 Plex-Remote-TranscoderMaster 与 Slave 节点架构入门指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表