ThingsBoard TBEL 上行数据转换器 Converter Output 详解:从 Simple JSON 示例看解码输出的完整结构
物联网后端数据可视化消息队列【免费下载链接】thingsboardAll-in-one IoT Platform - Device management, data collection, processing and visualization.项目地址https://gitcode.com/GitHub_Trending/th/thingsboard点击查看免费下载导读在 ThingsBoard 的集成Integration体系中上行Uplink数据转换器Converter负责把来自各类设备接入协议MQTT、HTTP、ChirpStack/LoRaWAN 等的原始报文转换为平台统一识别的实体与遥测数据。本文以仓库中 TBEL 解码器示例 simple-json 的converter_output.md文档为核心完整拆解 Converter Output 的 JSON 结构、与 Decoder Output 的区别、各字段的语义与覆盖机制并结合仓库源码decodeToJson工具函数、AbstractUplinkDataConverter解析逻辑说明该输出如何被平台消费。读完本文你将能准确编写和调试 TBEL 上行解码函数理解解码函数返回结果与转换器最终输出之间的关系。一、示例全景一次 LoRaWAN 上行报文的数据流转Simple JSON 示例演示了一条来自 LoRaWANChirpStack网关的上行消息从原始 JSON payload 到 Converter Output 的完整转换过程。仓库中该示例由四个配套文档组成构成一条完整的可复现链路文件作用payload.md解码函数的输入报文JSON 格式decoder_fn.md编写的 TBEL 解码函数decoder_output.md解码函数直接返回的结果converter_output.md本文主体转换器最终提交给平台的完整输出转换器输出Converter Output是把预配置的实体信息与解码函数动态产出的数据融合后的最终 JSON解码函数可以覆盖预配置的键值从而保证静态配置与动态数据无缝集成此语义在 decoder_fn_v2.md 中有明确说明。二、Converter Output 完整结构simple-json 示例仓库文档 converter_output.md 给出的最终输出如下{ entityType: DEVICE, name: Device 1000000000000001, profile: default, telemetry: { ts: 1684478801936, values: { battery: 95, temperature: 36.6, saturation: 99, rssi: -21, data: 01ed03335f0e4c63, snr: 10, fСnt: 2 } }, attributes: { sn: 32310067, fPort: 85, dr: SF9 BW125 4/5, frequency: 867500000, eui: 1000000000000001 } }从结构上可将其划分为三层实体定位层entityType、name、profile——决定数据落到哪个设备/资产上遥测层telemetry带时间戳ts的时序数据values属性层attributes设备/资产的服务端属性server-side attributes。2.1 实体定位字段entityType / name / profile字段示例值语义entityTypeDEVICE实体类型取值必须为Asset或Device决定平台数据模型中的分类见 decoder_fn_v2.md 中 type 属性的说明nameDevice 1000000000000001实体名称在租户范围内唯一标识设备/资产。平台用其定位已存在的实体若不存在且集成允许创建实体则新建常使用 eui、MAC 等硬件唯一值此例中即Device eui拼接而来profiledefault实体关联的设备/资产配置档案Profile。若在预配置和解码函数中都未设置则自动应用默认值defaultname、profile均为**可覆盖overridable**属性转换器的初始配置定义了默认键值解码函数可以写入新值覆盖之。2.2 遥测层telemetrytelemetry: { ts: 1684478801936, values: { battery: 95, temperature: 36.6, saturation: 99, ... } }ts为毫秒级 Unix 时间戳本例1684478801936来自集成元数据metadata.ts见下文第四节的 metadata 表values为时序数据键值对。对比解码函数的直接输出可以发现转换器输出中的遥测键比解码函数产出多出了rssi、data、snr、fCnt等网关级字段这些键由转换器预配置或由集成附加信息补充而来——这正是预配置键 函数结果融合机制的体现。2.3 属性层attributesattributes: { sn: 32310067, fPort: 85, dr: SF9 BW125 4/5, frequency: 867500000, eui: 1000000000000001 }属性既包含解码函数产出的业务属性sn即设备序列号也包含 LoRaWAN 网关上报的射频参数fPort端口、dr数据速率、frequency频率、eui设备标识。这些值大多能在集成元数据中找到原始来源见第四节。三、完整链路还原payload → 解码函数 → Decoder Output → Converter Output该示例的输入、函数与中间输出同样保存在仓库中还原整条链路有助于理解 Converter Output 中每个字段的来源。3.1 输入 payloadpayload.md 定义的原始报文{ sn: 32310067, battery: 95, temperature: 36.6, saturation: 99 }这是解码函数的第一个参数payload。按 decoder_fn_v2.md 的说明payload 默认以二进制Base64编码但也可能直接携带已解码的 JSON 数据本例即属于后者。3.2 TBEL 解码函数decoder_fn.md 给出了核心解码逻辑function decodePayload(input) { var result { attributes: {}, telemetry: {}}; var data decodeToJson(input); var timestamp metadata.ts; result.attributes.sn data.sn; var values {}; values.battery data.battery; values.temperature data.temperature; values.saturation data.saturation; result.telemetry { ts: timestamp, values: values }; return result; } var result decodePayload(payload); return result;关键点decodeToJson(input)是 TBEL 运行时提供的工具函数。其底层实现位于 TbUtils.java提供了decodeToJson(ExecutionContext, ListByte)与decodeToJson(ExecutionContext, String)两个重载分别处理二进制字节数组与 JSON 字符串输入metadata.ts直接读取集成附带的元数据时间戳函数签名中metadata为{[key: string]: object}键值数据见 decoder_fn_v2.md函数返回值构造成{ attributes, telemetry }结构sn进入属性、三个传感器读数进入遥测。3.3 Decoder Output解码函数的直接结果decoder_output.md 给出的中间结果{ attributes: { sn: 32310067 }, telemetry: { ts: 1684478801936, values: { battery: 95, temperature: 36.6, saturation: 99 } } }Decoder Output 是解码函数的直接返回不附加任何额外配置或处理必须是合法的 JSON 对象且须满足依据 decoder_fn_v2.md必须包含attributes对象至少含一个键值对不得为空必须包含telemetry对象或数组至少含一条数据点可选的name、type、profile、customer、group、label等属性可由解码函数覆盖返回见第五节扩展示例。3.4 两者对比Converter Output 预配置 Decoder Output 融合将 Decoder Output 与 Converter Output 对比即可看出融合逻辑部分Decoder OutputConverter Output差异来源entityType/name/profile无DEVICE/Device 1000000000000001/default转换器预配置可被函数覆盖attributes仅snsnfPort/dr/frequency/eui集成元数据/预配置注入telemetry.valuesbattery/temperature/saturation上述三项 rssi/data/snr/fCnt网关附加信息注入这与文档中对两种输出的定义完全一致Converter Output 合并预配置默认键值与解码函数结果且函数可覆盖预配置键Decoder Output 则是函数裸输出。四、元数据metadata在转换中的角色metadata是解码函数的第二个参数携带集成消息的键值信息可在集成详情中追加自定义配置。simple-json 示例配套的 metadata.md 给出了典型的 LoRaWAN 元数据表KeyValueintegrationNameTest LORIOTincludeGatewayInfofalserssi-21seqno3040fPort85data01ed03335f0e4c63toa206ackfalsebattery94drSF9 BW125 4/5frequency867500000offlinefalsesnr10eui1000000000000001cmdrxfCnt2ts1684478801936对照第三节的 Converter Output 可以清晰追溯字段来源ts来自metadata.ts函数内var timestamp metadata.ts显式引用fPort、dr、frequency、eui、rssi、snr、fCnt、data等遥测/属性键均能在元数据中找到原始值。这说明解码函数并非字段唯一来源——集成网关的元数据同样会以预配置映射的形式进入最终输出。五、扩展 Converter Outputlabel / customer / group 可选字段simple-json 是一个聚焦实体定位与数据分流的简洁示例。仓库中 extended_converter_output.md 展示了带更多可选属性的扩展输出{ entityType: DEVICE, name: Device 1000000000000001, profile: default, label: Device name, customer: MyCustomer, group: SensorsGroup, telemetry: [{ ts: 1742770246830, values: { temperature: 50 } }, { fCnt: 4, rssi: -35 }], attributes: { fPort: 85, tenantName: ChirpStack, applicationName: Chirpstack application, tenantId: 52f14cd4-c6f1-4fbd-8f87-4025e1d49242, eui: 1000000000000001, applicationId: ca739e26-7b67-4f14-b69e-d568c22a5a75 } }各可选字段的语义依据 decoder_fn_v2.mdcustomer将设备/资产自动归属到指定客户客户不存在则创建仅在当前集成创建实体时生效实体已存在则忽略group将实体自动加入指定实体分组分组不存在则创建默认在租户范围创建若同时提供了customer则创建在客户下同样仅在建实体时生效label非唯一、面向展示的友好名称可用于仪表盘展示仅建实体时生效。此外注意telemetry既可以是单对象如 simple-json 示例的{ts: ..., values: {...}}也可以是数组如上例的两个数据点平台对两种形态均支持。六、源码视角Converter Output 如何被平台消费Converter Output 的解析与校验逻辑集中在 AbstractUplinkDataConverter.java从源码可以确认以下实现事实实体类型判定L269-L291输出必须携带deviceName或assetName对应本文示例的nameentityType二者不能同时出现否则抛出JsonParseException——这是输出的硬性校验遥测解析L181-L187输出 JSON 中的telemetry字段经parseTelemetry→JsonConverter.convertToTelemetryProto转为平台内部的PostTelemetryMsg属性解析L188-L194attributes字段经parseAttributesUpdate→JsonConverter.convertToAttributesProto转为PostAttributeMsg按需更新过滤L208-L250若转换器配置了仅值变化才上报update-only键遥测与属性还会经过filterKeyValueAndUpdateMap去重过滤避免重复值反复入库。也就是说本文示例中的entityType/name/profile telemetry attributes最终会被拆解为实体定位信息用于查找或创建设备、PostTelemetryMsg时序数据与PostAttributeMsg属性数据分别进入平台的消息队列与存储链路。七、编写 Converter 输出的实操建议结合本示例与源码校验逻辑编写上行转换器时建议遵循以下要点保证 Decoder Output 合法返回对象必须包含非空的attributes与非空的telemetry对象或数组否则平台无法消费善用 name 的实体定位语义使用eui、MAC 等硬件唯一值拼装name保证同一设备重复上报时能被正确定位本示例的Device 1000000000000001即源于 eui明确 entityType 二选一DEVICE/ASSET与name必须唯一对应不能同时出现deviceName与assetName区分两类字段来源业务传感器数据由解码函数从 payload 提取如battery/temperature/saturation网关射频与集成信息如fPort/rssi/snr/eui可从metadata读取或依赖预配置注入可选字段按需使用仅当需要自动归属客户、加入分组或展示友好名称时才使用customer、group、label调试对照三份文档payload → decoder_output → converter_output 三份文件一一对应任何一步字段缺失都可逐级排查decodeToJson工具函数见 TbUtils.java。结语Converter Output 是 ThingsBoard 集成体系最后一公里的关键数据结构。以 simple-json 示例为镜我们完整还原了从原始 JSON payload、TBEL 解码函数到 Decoder Output、再到最终 Converter Output 的字段流转并借助TbUtils.decodeToJson与AbstractUplinkDataConverter源码确认了实体定位校验、遥测/属性解析等平台侧消费逻辑。掌握这一结构你就能为任何接入协议编写可靠、可复用的 TBEL 上行解码器。赞分享物联网后端数据可视化消息队列【免费下载链接】thingsboardAll-in-one IoT Platform - Device management, data collection, processing and visualization.项目地址https://gitcode.com/GitHub_Trending/th/thingsboard点击查看免费下载相关推荐ThingsBoard 数据转换器 Decoder 输出格式详解simple-json 示例与源码级剖析ThingsBoard 数据转换器 Decoder 输出格式详解simple json 示例与源码级剖析 本文以 ThingsBoard 开源 IoT 平台内物联网后端数据可视化消息队列Grok Build 终端支持与故障排查从 /doctor 诊断到 tmux、SSH、剪贴板与 RTL 实战指南Grok Build 终端支持与故障排查从 /doctor 诊断到 tmux、SSH、剪贴板与 RTL 实战指南 Grok Build 以全屏 TUI 形式运物联网后端数据可视化消息队列ThingsBoard 上行数据解码实战simple-binary 二进制报文解码与输出示例深度解析ThingsBoard 上行数据解码实战simple binary 二进制报文解码与输出示例深度解析 本文基于 ThingsBoard 官方帮助文档中 sim物联网后端数据可视化消息队列上一篇SpringBlade项目文档自动化Asciidoctor与GitBook使用下一篇革命性多语言语音合成MeloTTS语音清晰度突破方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

数据摄取构建模块实战:用TaoToken统一Key打通预览版数据管道

数据摄取构建模块实战:用TaoToken统一Key打通预览版数据管道

/* 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 17:29:44 阅读更多 →
回形针的隐藏技能:从办公理线到应急维修的实用指南

回形针的隐藏技能:从办公理线到应急维修的实用指南

我从抽屉深处翻出一盒生了锈的paperclip(回形针)时,突然意识到一个很反直觉的事实:这枚看似只能夹文件的小钢丝,可能是办公室里最被低估的多面手。它能当临时螺丝刀、能理线、能开卡托、能弯成手机支架,甚至…

2026/10/2 17:29:44 阅读更多 →
如何使用Bark Sync Engine SDK开发通过网络通信进行同步的应用程序(一)

如何使用Bark Sync Engine SDK开发通过网络通信进行同步的应用程序(一)

文章目录前言一、SDK的下载和安装二、HelloWorld例程运行前的一些配置1.服务端配置2.客户端配置三、HelloWorld例程的运行1.运行同步服务端程序2.运行客户端程序四、BarkTank例程运行前的一些配置1.服务端配置2.客户端配置五、BarkTank例程的运行1.运行同步服务端程序2.运行登录…

2026/10/2 17:28:43 阅读更多 →

最新新闻

SAP PLM与西门子PLM选型:聚焦BOM与ECN的语义集成

SAP PLM与西门子PLM选型:聚焦BOM与ECN的语义集成

/* 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 17:55:57 阅读更多 →
Go 后端 UUID 生成与解析实战:基于 nakama 中 gofrs/uuid v5 的完整指南

Go 后端 UUID 生成与解析实战:基于 nakama 中 gofrs/uuid v5 的完整指南

后端即时通讯社交游戏开发 【免费下载链接】nakama Scalable open-source game backend server: multiplayer, matchmaking, leaderboards, chat, and social features for games. 项目地址: https://gitcode.com/GitHub_Trending/na/nakama 点击查看 免费下载 导读…

2026/10/2 17:55:57 阅读更多 →
tailcat 发布流程完全指南:从 SSH 签名 Tag 到 GoReleaser 自动构建发布

tailcat 发布流程完全指南:从 SSH 签名 Tag 到 GoReleaser 自动构建发布

【免费下载链接】tailcat like netcat, but over Tailscales data plane, without Tailscales control plane 项目地址: https://gitcode.com/GitHub_Trending/ta/tailcat 点击查看 免费下载 本文是 tailcat(基于 Tailscale 数据面、无需控制面的 netca…

2026/10/2 17:55:57 阅读更多 →
type-challenges 中等题 02257:用类型体操实现 MinusOne(正整数减一)

type-challenges 中等题 02257:用类型体操实现 MinusOne(正整数减一)

示例工程 【免费下载链接】type-challenges Collection of TypeScript type challenges with online judge 项目地址: https://gitcode.com/GitHub_Trending/ty/type-challenges 点击查看 免费下载 导读 MinusOne 是 type-challenges 仓库中一道 medium 难度、mat…

2026/10/2 17:55:57 阅读更多 →
Art Design Pro 快速上手:Vue 3 + Vite + TypeScript 后台管理模板的安装、精简与开发实战指南

Art Design Pro 快速上手:Vue 3 + Vite + TypeScript 后台管理模板的安装、精简与开发实战指南

前端企业应用UI组件 【免费下载链接】art-design-pro A Vue 3 admin dashboard template using Vite TypeScript Element Plus | vue3 admin | vue-admin — focused on user experience and visual design. 项目地址: https://gitcode.com/GitHub_Trending/ar/ar…

2026/10/2 17:55:57 阅读更多 →
递推最小二乘法RLS:公式推导、遗忘因子与工程实现要点

递推最小二乘法RLS:公式推导、遗忘因子与工程实现要点

/* 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 17:54:57 阅读更多 →

日新闻

从零搭建AI工程化:模型之外的完整闭环

从零搭建AI工程化:模型之外的完整闭环

先搞清楚一件事:从零开始做 AI 工程化,难的从来不是调模型、写提示词,而是把一套原型 Demo 变成长得像是“正经系统”的东西。你手里可能已经有了能跑通的代码,也可能刚读完一些概念,但真到了要把它变成可维护、可观测…

2026/10/2 0:00:20 阅读更多 →
大模型训练显存估计与混合精度训练实战指南

大模型训练显存估计与混合精度训练实战指南

1. 大模型训练显存估计与混合精度训练详解显存不够用,几乎是每个做大模型训练的人都会撞上的第一堵墙。你可能也经历过:模型代码写完了,数据管道跑通了,满心欢喜地按下训练启动脚本,结果几秒钟后终端弹出一行红字——C…

2026/10/2 0:00:20 阅读更多 →
小样本学习数据集选型指南:27个真正可用的高质量数据集

小样本学习数据集选型指南:27个真正可用的高质量数据集

1. 小样本学习的“弹药库”:为什么你总在找数据集,却总找不到真正能用的? 小样本、数据集——这两个词最近半年在我处理的200多个AI项目咨询里,出现频率排进前三。不是模型调不好,不是代码写不对,而是卡在…

2026/10/2 0:00:20 阅读更多 →

周新闻

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

如何划分训练/验证集: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 19:40:48 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

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

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

2026/10/1 19:41:40 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/10/1 20:05:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* 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 10:36:31 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* 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 5:26:06 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* 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 6:09:11 阅读更多 →