ThingsBoard TBEL 解码器中使用 metadata 字段的完整实战:simple-metadata 示例深入解析

发布时间:2026/10/2 13:43:34

ThingsBoard TBEL 解码器中使用 metadata 字段的完整实战:simple-metadata 示例深入解析 物联网后端数据可视化消息队列【免费下载链接】thingsboardAll-in-one IoT Platform - Device management, data collection, processing and visualization.项目地址https://gitcode.com/GitHub_Trending/th/thingsboard点击查看免费下载导读本文以 ThingsBoard 开源 IoT 平台仓库中 simple-metadata 示例 为核心完整讲解 TBELThingsBoard Expression Language上行数据解码器如何通过metadata参数引用集成Integration中配置的额外元数据从而在解码函数中动态决定设备类型、客户归属与服务端属性而无需把这些信息硬编码在解码脚本里。读完本文你将掌握metadata的结构与注入方式、解码函数中读取 metadata 字段的写法、以及它与payload、解码器输出结构deviceName/deviceType/attributes/telemetry之间的配合关系并能直接复用本仓库提供的完整可运行示例。示例概览一个由 metadata 驱动的解码器在 ThingsBoard 的 TBEL 解码器体系里每一个完整示例通常由四部分组成输入 payload、输入 metadata、解码函数decoder function与期望输出。simple-metadata 示例 位于解码器示例表 Use metadata fields 一栏中官方对其定位是Use metadata fields to determine device type, model and customer name 使用 metadata 字段来确定设备类型、型号和客户名称也就是说本示例的核心教学价值不在于复杂的二进制解析而在于演示如何在解码函数中读取 integration 注入的 metadata并把它映射到输出 JSON 的各个字段上。整个示例的输入/输出对如下输入 payloadpayload.md一个包含设备序列号、时间戳字符串、温度与湿度数据的 JSON输入 metadatametadata.md由 integration 配置或上游系统注入的键值对包含customerName、deviceType、deviceModel三个自定义键解码函数decoder_fn.md读取metadata中的三个字段结合 payload 拼装标准解码输出期望输出output.md解码后的标准 JSON设备类型为Thermostat、客户为Customer C、属性里带model: Model A。metadata 的结构与三种键值示例中的 metadata 表本示例的 metadata 是最简洁的形式——三对自定义键值KeyValuecustomerNameCustomer CdeviceTypeThermostatdeviceModelModel A从结构上看metadata 是一个{[key: string]: string}的键值映射见 decoder_fn.md 文档说明。解码函数可以直接通过点号语法metadata.deviceType读取其中的任意字段无需任何声明或导入。三类 metadata 来源结合仓库文档integration 自带的字段不同类型的 Integration 会注入不同的默认 metadata。例如在 decoder_v2 版本的 metadata 示例 中可以看到 LORIOT 集成注入的eui、fPort、rssi、snr、frequency、dr、toa、battery、seqno、fCnt、cmd、ts等字段——这些是典型的 LoRa 网络服务器元数据常被用于设备命名如用eui做deviceName或信号质量上报。integration 详情中手动配置的额外 metadata官方文档明确说明 You can configure additional metadata for each integration in the integration details可以在每个 Integration 的详情中配置附加 metadata。本示例中的customerName、deviceType、deviceModel就属于这类自定义键。HTTP 请求头 / 上游平台字段基于 HTTP 的集成会根据请求头确定 content type这类集成同样可以把请求中的信息注入 metadata。为什么把 deviceType 放进 metadata 而不是硬编码对照同目录下的 simple-json 解码器示例那里是把deviceType: Thermostat和deviceLabel: Kitchen Thermostat硬编码在解码脚本中。而本示例则把deviceType、deviceModel、customerName全部放进 metadata解码脚本只负责数据转换不关心业务分类同一份解码函数可以服务多个客户/多种设备型号只需在 Integration 层配置不同的 metadata客户归属、设备类型等字段来自集成配置运维人员无需修改代码即可调整。这正是 ThingsBoard 推荐把解码逻辑与业务元数据解耦的典型写法。解码函数逐行拆解完整的解码函数源码见 simple-metadata/decoder_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;第 1 步decodeToJson(payload)把字节数组转为 JSON 对象根据 decoder_fn.md 的函数签名说明TBEL 解码函数的签名是function Decoder(payload, metadata): object | object[]其中payload: any是一个字节数组byte array其内容类型可能是 JSON、TEXT 或 Binary(Base64)。content type 主要作为调试事件的提示并不影响解码函数的实际行为——解码器需要通过decodeToString或decodeToJson这类内置 helper 把字节数组转换为字符串或 JSON 对象。这里对来自 MQTTMQTT 3.x 发布消息中没有 content-type因此 MQTT 集成的 payload 恒为 BINARY或 HTTP/CoAP 集成的原始负载decodeToJson(payload)是最常用的一步。第 2 步Date.parse(json.ts)把时间字符串转成毫秒级 epochpayload 中的ts: 2021-11-21 14:27:39 UTC是字符串形式的时间。Date.parse()会将其解析为 Unix 时间戳毫秒供telemetry.ts使用。平台对时间戳的约定是必须是 Unix epoch 毫秒数否则将使用服务器时间参见 decoder_fn.md 中的 timestamp 说明 与 simple_json_output_with_ts 示例。在示例期望输出中2021-11-21 14:27:39 UTC被正确转换为1637504859000。第 3 步构造标准解码输出对象本示例的返回值同时使用了官方 decoder_fn.md 输出要求 中的多类字段deviceName/deviceType必填输出必须包含deviceNamedeviceType或assetNameassetType二选一。这里deviceName取自 payload 中的serialNumberSN-111deviceType取自 metadata 中的Thermostat。设备名在租户范围内唯一平台会依据这两项去查找已有设备若不存在且集成开启了 Allow to create devices or assets则会自动创建设备。实践中常使用 DevEUI、MAC 地址等唯一标识作为deviceName。customerName可选平台会用它自动将设备分配给名为Customer C的客户若该客户不存在则自动创建。需要注意的是此分配仅在当前集成创建设备/资产的过程中生效如果设备已经存在该参数会被忽略参见 decoder_fn.md 中 customerName 说明。attributes可选服务端属性对象。这里把 metadata 中的deviceModelModel A写入attributes.model作为设备的一个静态服务端属性保存。telemetry可选时序数据对象包含ts毫秒时间戳与values温度/湿度键值对。temperature: json.t、humidity: json.h分别来自 payload 中的t和h。输入与输出对照输入 payloadpayload.md{ serialNumber: SN-111, ts: 2021-11-21 14:27:39 UTC, t: 36.6, h: 70 }期望输出output.md{ deviceName: SN-111, deviceType: Thermostat, customerName: Customer C, attributes: { model: Model A }, telemetry: { ts: 1637504859000, values: { temperature: 36.6, humidity: 70 } } }可以清晰地看到三条映射关系payload 的serialNumber→ 输出deviceNamemetadata 的deviceType→ 输出deviceTypemetadata 的customerName→ 输出customerNamemetadata 的deviceModel→ 输出attributes.model。解码函数本身没有写死任何一个分类值。解码器输出的其他合法形态深化参考simple-metadata 示例只展示了telemetry为单个对象、输出为单个对象的情况。官方 decoder_fn.md 还说明了其他几种同样合法、且经常与 metadata 组合使用的输出形态便于你在实际集成中扩展带 deviceLabel 的输出可额外返回deviceLabel非唯一、用户友好的设备标签用于仪表盘展示以及groupName用于把设备自动归入实体组。参见 label_json_output 示例。带自定义时间戳的输出telemetry.ts支持每个数据点指定不同的毫秒时间戳参见 simple_json_output_with_ts 示例。输出为对象数组解码函数可以返回object[]一次处理多台设备/资产且每个对象可携带多个不同时间戳的 telemetry 数据点参见 json_array_output 示例。复杂 JSON Hex 解码当 payload 中包含多个 hex 编码字段时可结合hexToBytes、parseBytesToInt等内置 helper 进行逐字段解析参见 complex-json-hex 示例。metadata 在 LORIOT 等真实集成中的形态为了让你理解自定义 metadata 与集成自带 metadata共存的实际场景仓库中的 decoder_v2/simple-metadata/metadata.md 给出了一个 LORIOT 集成注入的完整 metadata 示例KeyValueintegrationNameTest LORIOTincludeGatewayInfofalserssi-21seqno3040fPort85data01ed03335f0e4c63toa206ackfalsebattery94drSF9 BW125 4/5frequency867500000offlinefalsesnr10eui1000000000000001cmdrxfCnt2ts1684478801936这类由 LoRa 网络服务器LORIOT、ChirpStack、The Things Stack 等注入的 metadata 在实践中非常有用例如可以用metadata.eui作为deviceName设备唯一标识把rssi/snr作为属性或遥测上报用battery监测设备电量。它同样遵循{[key: string]: string}的键值结构与你自定义的customerName/deviceType/deviceModel在解码函数中的读取方式完全一致。最佳实践小结保持解码脚本与业务分类解耦凡是与这台设备属于谁、是什么类型、什么型号相关的字段优先通过 Integration 详情的额外 metadata 注入而不是写死在解码脚本里这样同一份脚本可以复用给多台设备。利用集成自带的 metadataLoRa 类集成会注入eui、rssi、snr、fPort等字段可直接用于deviceName或属性/遥测上报无需自行解析。严格遵守输出结构要求至少返回deviceNamedeviceType或assetNameassetTypecustomerName、groupName、deviceLabel、attributes、telemetry均为可选但需注意其只在设备创建阶段生效的语义。时间戳统一使用毫秒 epoch字符串时间先用Date.parse()或等效方法转换否则平台使用服务器时间。从示例出发快速上手仓库中完整的 payload / metadata / decoder / output 四件套示例位于 ui-ngx/src/assets/help/en_US/converter/tbel/examples/decoder同一目录下还有 JSON、CSV、Binary、Hex 等不同 content type 的对照用例decoder_fn.md 示例表适合作为你编写解码器时的参考蓝本。赞分享物联网后端数据可视化消息队列【免费下载链接】thingsboardAll-in-one IoT Platform - Device management, data collection, processing and visualization.项目地址https://gitcode.com/GitHub_Trending/th/thingsboard点击查看免费下载相关推荐ThingsBoard TBEL 解码器实战结合 Integration Metadata 解析含十六进制编码字段的复杂 JSON 报文ThingsBoard TBEL 解码器实战结合 Integration Metadata 解析含十六进制编码字段的复杂 JSON 报文 本文以 Things物联网后端数据可视化消息队列ThingsBoard TBEL 解码器实战simple-metadata 示例如何将 JSON 载荷与设备元数据组合为遥测数据ThingsBoard TBEL 解码器实战simple metadata 示例如何将 JSON 载荷与设备元数据组合为遥测数据 本篇文章以 ThingsBo物联网后端数据可视化消息队列ThingsBoard JSON Payload 解码实战TBEL Uplink Converter 解析 simple-json 示例ThingsBoard JSON Payload 解码实战TBEL Uplink Converter 解析 simple json 示例 导读 本文以 Thi物联网后端数据可视化消息队列上一篇终极OBS多平台直播解决方案obs-multi-rtmp插件快速上手指南下一篇显卡驱动清理革命DDU如何为你的电脑做深度SPA创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/10/2 13:43:34

游戏引擎从零到一:核心模块拆解与主流引擎选型指南

1. 游戏引擎到底是个什么东西先把话说直白点:游戏引擎就是一套“做游戏的工具箱加流水线”。你玩到的每一款游戏,画面怎么渲染出来、角色怎么动起来、物理碰撞怎么算、声音什么时候响、资源怎么加载,背后都靠这套东西在撑着。没有引擎&#x…

2026/10/2 14:38:38

Redis 接入 AI 能力全解析:向量检索、会话管理与多 Agent 协作实践

1. 从一条更新日志说起:Redis 接入 AI 到底意味着什么 前几天刷社区的时候看到一条消息,说 Redis 官方在最新版本里正式把 AI 相关的能力做进了核心链路。第一反应是"又一个蹭热点的营销词",但把更新说明和几个相关提案翻完之后&am…

2026/10/2 14:38:38

6DOF-GraspNet六自由度抓取:从点云到机械臂位姿估计实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 14:38:38

RK平台YTPHY驱动移植全流程:解压验包到设备树避坑指南

简介:面向RK3568平台的YT8521S以太网PHY驱动补丁包,主要服务于嵌入式Linux开发者和内核驱动适配工程师,解决YT8521S在RK3568平台上驱动缺失或无法正常识别的问题,省去从零移植和调试的重复工作。压缩包共11个文件,主要…

2026/10/2 14:38:38

RK平台YTPHY PHY驱动移植实战:从拆包、配置到验证

简介:面向RK3568平台的YT8521S以太网PHY驱动补丁,专为嵌入式驱动开发与系统移植工程师设计,重点是解决YT8521S在RK3568平台上的驱动适配与PHY芯片调试问题。资源按kernel4.19与kernel4.4两个内核版本分目录组织,各自包含PHY驱动源…

2026/10/2 14:38:38

舰船卫星图目标检测数据集:VOC格式解析与YOLOv8训练实操

简介:舰船卫星可见光目标检测数据集(第一批)正式发布,面向计算机视觉、遥感图像分析与目标检测算法研究者,可用于模型训练、算法验证与性能评估。数据集提供1000张10241024像素的RGB彩色卫星图像,覆盖舰船与…

2026/10/2 8:16:46

东莞市品牌网站建设报价常见报错与解决

东莞品牌网站建设报价单背后:一份保姆级建站教程避坑实录 网站做好了没人访问,这大概是很多老板最头疼的事。花了大几万做的品牌站,上线后流量惨淡,比路边摊还冷清。别急着骂外包公司,很多“东莞品牌网站建设报价”里藏着不少猫腻,比如用模板站冒充定制…

2026/10/1 17:09:46

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/10/1 10:48:55

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/10/2 0:02:57

PWN入门:从栈溢出原理到ROP链实战

1. 这不是“学PWN”,是重新理解你每天敲的每一行C代码我第一次在CTF赛场上写出能控制程序流的exp时,手抖得连gdb的c命令都输错三次。那道题只有23行C代码,一个gets()调用,一个printf(),一个return——它甚至没开NX&…

2026/10/2 0:02:57

Windows下cudaMallocHost显存占用之谜:WDDM与TCC模式差异及优化方案

1. 一个反直觉的显存占用现象第一次在 Windows 上看到cudaMallocHost把显存吃掉的时候,我的反应是打开任务管理器反复确认了三遍。明明调用的是主机端锁页内存分配,按 CUDA 文档的说法,这块内存应该落在系统 RAM 里,跟 GPU 的显存…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑