ARTICLE DETAIL

资讯详情

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

ThingsBoard TBEL 上行解码器扩展输出格式详解:Decoder Output 与 Converter Output 完整对比与实战

ThingsBoard TBEL 上行解码器扩展输出格式详解:Decoder Output 与 Converter Output 完整对比与实战 物联网后端数据可视化消息队列【免费下载链接】thingsboardAll-in-one IoT Platform - Device management, data collection, processing and visualization.项目地址https://gitcode.com/GitHub_Trending/th/thingsboard点击查看免费下载导读本文以 ThingsBoard 仓库中 extended_decoder_output.md 为核心深入解析 TBELThingsBoard Expression Language上行链路Uplink数据转换器解码函数的两类输出格式——Decoder Output 与 Converter Output。你将掌握扩展输出的完整 JSON 结构包含label、customer、group等可选字段、各字段的语义与平台处理规则并通过 simple-json、simple-binary 两个完整示例含 payload、metadata、解码函数、两种输出的对应关系学会自行编写与调试解码函数。一、两种输出类型Converter Output 与 Decoder Output依据 decoder_fn_v2.md 的定义上行解码函数的完整签名是function payloadDecoder(payload, metadata): object | object[]payloadany类型表示从集成Integration收到的编码数据字节数组。默认以二进制Base64编码但如果集成配置允许payload 也可能已是解码后的 JSON 数据。metadata{[key: string]: object}类型表示集成消息携带的键值对数据。每个集成都可在集成详情中额外配置 metadata。解码函数存在两种输出它们的用途完全不同输出类型含义特点Converter output将预配置pre-configured settings与解码函数结果合并后的最终 JSON预配置定义默认键与值解码函数可在需要时覆盖这些键Decoder output解码函数的直接返回结果纯粹由解码逻辑产生无任何附加配置或加工必须是合法 JSON 对象简单地说Converter Output 预配置 Decoder OutputDecoder Output 中的同名键可以覆盖预配置中的默认值。二、Decoder Output 的字段要求与完整示例2.1 必需字段Decoder Output 必须是一个合法 JSON 对象并满足以下两个硬性要求必需的attributes对象描述设备/资产device/asset的详情必须包含至少一个键值对非空。必需的telemetry对象或数组承载设备/资产的时间序列数据必须包含至少一条数据点非空。2.2 可选字段均可被预配置覆盖name可选可覆盖在租户范围内唯一标识设备/资产。通常使用 eui、MAC 地址等硬件唯一值。平台据此定位已有设备/资产若未找到且集成允许创建实体则会新建。type可选可覆盖必须是Asset或Device决定实体在平台数据模型中的归类。profile可选可覆盖指定关联的设备配置profile。若预配置与解码函数中均未设置则自动使用默认值default。customer可选可覆盖平台据此自动将设备/资产分配给客户若指定名称的客户不存在则自动创建。仅在当前集成创建设备/资产时生效若实体已存在此参数被忽略。group可选可覆盖平台据此自动将设备/资产归入特定实体组若组不存在则自动创建。默认在租户范围内创建若存在customer属性则在客户范围内创建。同样只在首次创建时生效。label可选可覆盖非唯一的友好标签可显示在仪表盘上。同样仅在当前集成创建实体时应用。2.3 扩展 Decoder Output 完整示例这是本关联文档的核心内容——扩展版 Decoder Output JSON同时包含 label、customer、group{ label: MyLabel, customer: MyCustomer, group: SensorsGroup, attributes: { sn: S567483 }, telemetry: [{ ts: 1742770610971, values: { temperature: 50, humidity: 45 } }] }对照同目录下的 simple_decoder_output.md简单版仅含必填的attributes与telemetry{ attributes: { sn: S567483 }, telemetry: [{ ts: 1742770610971, values: { temperature: 50, humidity: 45 } }] }扩展版与简单版的唯一区别就是多出label、customer、group三个可选键。ts为 Unix 毫秒时间戳values内的键即为遥测数据点名称如temperature、humidity。注意telemetry可以是对象或数组。对象形式为{ ts: 1684478801936, values: { ... } }数组形式则允许同一输出中携带多条时间序列数据如上述扩展示例。三、Converter Output 的完整示例与对照Converter Output 额外包含entityType、name、profile等实体管理字段。扩展版 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 } }而简单版 simple_converter_output.md 则只包含实体识别所需的最小字段{ entityType: DEVICE, name: Device 1000000000000001, profile: default, telemetry: [{ 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 } }可以看到两个 Converter Output 的差异与 Decoder Output 完全一致——扩展版在简单版基础上补充label、customer、group三个键。其中eui这种 LoRaWAN 设备标识会被用作name的组成部分Device 1000000000000001而tenantName、applicationName、applicationId等则作为设备属性attributes持久化。四、从 payload 到输出的完整实战链路decoder_fn_v2.md 的 Examples 表格提供了两组端到端示例。下面以simple-json为例逐步拆解。4.1 输入 payloadpayload.md{ sn: 32310067, battery: 95, temperature: 36.6, saturation: 99 }4.2 输入 metadatametadata.md 给出了集成如 LORIOT自动附带的键值对解码函数可任意读取例如ts时间戳、fPort、eui、rssi、frequency、dr等KeyValueintegrationNameTest LORIOTincludeGatewayInfofalserssi-21seqno3040fPort85data01ed03335f0e4c63toa206ackfalsebattery94drSF9 BW125 4/5frequency867500000offlinefalsesnr10eui1000000000000001cmdrxfCnt2ts16844788019364.3 解码函数decoder_fn.mdfunction 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;关键点先用 TBEL 内置函数decodeToJson(input)将 payload 转换为 JSON 对象payload 默认是 Base64 编码的二进制。metadata.ts直接读取元数据中的时间戳保证遥测点拥有正确时间。返回结构恰好满足 Decoder Output 的硬性要求非空的attributes 非空的telemetry。4.4 Decoder Output 与 Converter Output该函数产出的 Decoder Outputdecoder_output.md{ attributes: { sn: 32310067 }, telemetry: { ts: 1684478801936, values: { battery: 95, temperature: 36.6, saturation: 99 } } }而最终的 Converter Outputconverter_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 } }对比可见解码函数生成的attributes.sn与telemetry全部保留而rssi、data、snr、fCnt、fPort、dr、frequency、eui等由预配置或集成元数据自动合并进来——这正是预配置定义默认键和值解码函数可以覆盖机制的实际效果。五、二进制 payload 的解码变体对于非 JSON 的二进制上行数据可参考 simple-binary 示例function decodePayload(input) { var result { attributes: {}, telemetry: {}}; result.attributes.sn parseBytesToInt(input, 0, 4); var timestamp metadata.ts; var values {}; values.battery parseBytesToInt(input, 4, 1); values.temperature parseBytesToInt(input, 5, 2) / 100.0; values.saturation parseBytesToInt(input, 7, 1); result.telemetry { ts: timestamp, values: values }; return result; } var result decodePayload(payload); return result;这里改用 TBEL 内置函数parseBytesToInt(input, offset, length)按字节偏移解析二进制前 4 字节为序列号sn第 5 字节为电量battery第 6~7 字节为温度除以 100.0 得到小数第 8 字节为饱和度saturation。无论 payload 是二进制还是 JSON最终输出的结构约束完全一致保证集成层与平台数据模型解耦。六、编写与调试建议先保证 Decoder Output 合法输出必须是合法 JSONattributes与telemetry均不可为空必要时用decodeToJson、parseBytesToInt等内置函数处理 payload。善用 metadata时间戳、网络质量rssi、snr、LoRa 参数frequency、dr、fPort通常由集成自动注入直接在函数内引用metadata.xxx即可无需自行解析。区分两种输出的职责解码函数只负责从 payload 提取业务数据Decoder Output实体名称、类型、profile、客户、分组等平台侧信息尽量交由预配置Converter Output仅在需要动态生成时于函数中覆盖。可选字段只在创建时生效customer、group、label均只在当前集成创建实体时应用实体已存在时将被忽略避免为已接入设备重复设置归属。type字段取值受限只能为Asset或Deviceprofile未设置时平台自动套用default。上述所有示例文件均可在此目录中找到ui-ngx/src/assets/help/en_US/converter/tbel/examples/decoder_v2/可对照 decoder_fn_v2.md 阅读完整字段说明将其作为编写上行链路转换器时的权威参考。赞分享物联网后端数据可视化消息队列【免费下载链接】thingsboardAll-in-one IoT Platform - Device management, data collection, processing and visualization.项目地址https://gitcode.com/GitHub_Trending/th/thingsboard点击查看免费下载相关推荐ThingsBoard TBEL 解码器实战简单二进制 Payload 的逐字节解析与 Decoder Output 输出格式详解ThingsBoard TBEL 解码器实战简单二进制 Payload 的逐字节解析与 Decoder Output 输出格式详解 本指南以 ThingsBo物联网后端数据可视化消息队列Oumi 快速上手一条命令完成小模型训练、评估、推理与云端部署Oumi 快速上手一条命令完成小模型训练、评估、推理与云端部署 本指南以 Oumi 开源项目自带的 SmolLM 135M 快速启动配方recipe为主线物联网后端数据可视化消息队列ThingsBoard TBEL 解码器输出格式详解从 simple JSON Output 到多设备数组输出的完整实战指南ThingsBoard TBEL 解码器输出格式详解从 simple JSON Output 到多设备数组输出的完整实战指南 本篇指南聚焦 ThingsBoa物联网后端数据可视化消息队列创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表