
物联网后端数据可视化消息队列【免费下载链接】thingsboardAll-in-one IoT Platform - Device management, data collection, processing and visualization.项目地址https://gitcode.com/GitHub_Trending/th/thingsboard点击查看免费下载本篇指南围绕 ThingsBoard 集成Integration数据转换器中的Decoder 解码函数展开以simple-metadata官方示例为核心讲解如何在 JavaScript 解码函数中读取payload与metadata参数将设备上行消息转换为平台通用的设备/遥测 JSON 结构。读完本文你将掌握 Decoder 函数的参数语义、返回格式规范以及如何在配置了自定义 metadata如deviceType、customerName、deviceModel的前提下写出一段可复用的解码脚本。示例速览一个使用 metadata 的解码函数关联文档给出的完整示例位于 decoder_fn.md其核心思路是payload 只承载设备上报的原始数据而设备的类型、归属客户、型号等元信息从metadata参数中读取。// 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, } } }; /** Helper function to decode raw payload bytes to string**/ function decodeToString(payload) { return String.fromCharCode.apply(String, payload); } /** Helper function to decode raw payload bytes to JSON object**/ function decodeToJson(payload) { return JSON.parse(decodeToString(payload)); } return result;配套的三份输入/输出文档Payload输入数据见 payload.md{ serialNumber: SN-111, ts: 2021-11-21 14:27:39 UTC, t: 36.6, h: 70 }Metadata配置的元数据见 metadata.mdKeyValuecustomerNameCustomer CdeviceTypeThermostatdeviceModelModel AOutput解码输出见 output.md{ deviceName: SN-111, deviceType: Thermostat, customerName: Customer C, attributes: { model: Model A }, telemetry: { ts: 1637504859000, values: { temperature: 36.6, humidity: 70 } } }可以看到deviceType、customerName和deviceModel三个值并非来自设备报文而是直接取自metadata对象——这正是本示例区别于simple-json示例在 simple-json/decoder_fn.md 中deviceType是硬编码字符串Thermostat的关键所在。Decoder 函数签名与参数语义在 decoder_fn.mdDecoder 函数总规范文档中定义了统一的签名function Decoder(payload, metadata): object | object[]payload字节数组形式的原始报文payload类型为any实际是字节数组包含对应 Integration如 HTTP、MQTT、CoAP、SigFox、ChirpStack、The Things Stack 等产出的上行消息。Integration 产出的 payload 内容类型可能是JSON、TEXT、BINARY(Base64)三种之一。内容类型主要用于调试事件debug events的存储提示并不影响解码函数的执行方式。多数集成SigFox、LORIOT、ChirpStack、The Things Stack产出的 JSON payload 中会包装二进制设备报文及 RSSI、SNR 等信号质量元数据HTTP、CoAP 类集成根据请求头判断内容类型MQTT 集成由于 MQTT 3.x 发布消息中没有 content-type其 payload 一律按 BINARY 处理。因此解码函数通常先用两个内置辅助函数将字节数组还原为可用数据function decodeToString(payload) { return String.fromCharCode.apply(String, payload); } function decodeToJson(payload) { return JSON.parse(decodeToString(payload)); }metadata键值对形式的元数据映射metadata类型为{[key: string]: string}是携带集成特定字段的键值映射可在**集成详情页integration details**中为每个集成额外配置。在上面的示例中用户在集成中配置了customerName、deviceType、deviceModel三个键解码函数据此决定设备归属客户、设备类型和写入attributes的属性值。Decoder 返回值规范平台识别的最小契约Decoder 的返回值必须是一个合法 JSON 文档官方规范明确了几项要求见 decoder_fn.md必须包含deviceNamedeviceType或assetNameassetType任一组合用于标识设备/资产租户范围内唯一。平台会根据这两个字段查找已有实体若不存在且集成开启了 Allow to create devices or assets 设置则会自动创建新实体。实践中常把 DevEUI、MAC 地址等唯一标识作为 deviceName。可选attributes对象一组服务端属性server-side attributes写入设备/资产。可选telemetry对象/数组设备/资产的时间序列数据。可选customerName平台会在设备/资产由当前集成创建的过程中自动将其分配给该客户若客户不存在则自动创建。注意若设备/资产已存在该字段会被忽略。可选groupName自动将设备分配至某个实体分组默认在租户范围内创建分组若同时存在customerName则在客户范围内创建同样仅在实体创建时生效。可选deviceLabel/assetLabel非唯一的用户友好标签便于在仪表盘上展示同样仅在实体创建时生效。仓库还提供了多种返回结构样例用于对照简单 JSON 输出 simple_json_output.md含attributes.serialNumber与无ts的遥测此时使用服务器时间带deviceLabel、customerName、groupName的输出 label_json_output.md带自定义时间戳的输出 simple_json_output_with_ts.md——时间戳必须为Unix epoch 毫秒值否则回退为服务器时间数组形式的输出 json_array_output.md一个解码函数可同时返回多个设备/资产每个对象还可包含多条不同ts的遥测点。本示例返回结构中ts由Date.parse(json.ts)将字符串日期如2021-11-21 14:27:39 UTC解析为毫秒级 epoch 时间戳输出中即为1637504859000。在 UI 中测试解码函数metadata 从哪里来ThingsBoard 的转换器编辑界面内置了测试对话框其前端实现位于 converter-test-dialog.component.ts从中可以看出 metadata 在测试流程中的真实处理逻辑若测试提供了debugIn.inMetadata前端会以JSON.parse解析为一个Recordstring, string并将值为对象的键通过JSON.stringify序列化为字符串因为 metadata 约定是 string 类型对于 DecoderisDecoder为 true若未提供 metadata则会填充默认值{ integrationName: Test integration }对于 Encoder非 Decoder默认 metadata 为{ deviceName: sensorA, deviceType: temp-sensor, ss_serialNumber: SN111 }。也就是说在 UI 测试对话框中你可以在 metadata 输入区直接粘贴simple-metadata/metadata.md中那样的键值对如customerNameCustomer C、deviceTypeThermostat、deviceModelModel A再配合示例 payload 运行即可复现本文开头的输出结果。与 TBEL 解码函数的区别仓库中同一示例还存在 TBELThingsBoard Expression Language版本见 tbel/examples/decoder/simple-metadata/decoder_fn.md。TBEL 版本省去了手写的decodeToString/decodeToJson辅助函数TBEL 内置了decodeToJson等能力其余逻辑读取metadata.deviceType、metadata.customerName、metadata.deviceModel组装result与 JavaScript 版本完全一致。TBEL 还提供了内置decodeToString等实用函数详见 tbel/decoder_fn.md。若集成配置中选择 TBEL 脚本语言可直接参照该版本。进阶从通用模板到多场景解码仓库内置了通用解码模板 js-decoder.raw它展示了比示例更完整的工程化写法可作为自定义解码脚本的起点设备名与类型兜底deviceName ! null ? deviceName : Unknown DevicedeviceType ! null ? deviceType : default时间戳多来源解析依次尝试data.ts、data.timestamp经new Date(...).getTime()最后回退到Date.now()属性和遥测字段拆分通过attributeKeyList指定哪些键写入attributes通过excludeFromTelemetryList排除非遥测字段再用递归的toFlatMap将嵌套对象展开为扁平遥测键设备/资产二选一注释中保留了使用assetName/assetType自动创建资产的写法。结合该模板与 simple-metadata 示例可以总结出实践中常见的 metadata 使用模式静态元数据注入把设备型号、客户、分组等不随报文变化的字段在集成中配置好解码函数中直接引用避免在 payload 中重复传输设备标识兜底deviceName优先取报文中的唯一标识序列号、MAC缺失时回退到 metadata 或默认值多类型设备共用集成同一集成接收多种设备时通过 metadata 中的deviceType区分类型保持解码函数整洁完整输出组装始终保证返回对象包含设备标识对、可选attributes/telemetry/customerName/groupName/deviceLabel并按 decoder_fn.md 的规范校验结构避免实体创建失败。小结本文以simple-metadata官方示例为主线完整覆盖了 ThingsBoard Decoder 函数的三个要素payload字节数组的解码、metadata键值对的读取以及返回值 JSON 的结构规范。示例证明了一种高效的数据流设计——设备侧只上报精简的时序数据型号、类型、客户归属等配置性信息全部收敛到集成 metadata从而让解码函数更稳定、可复用也便于在 UI 测试对话框中直接验证相关测试实现见 converter-test-dialog.component.ts。在此基础上可进一步参考 js-decoder.raw 通用模板与 decoder_fn.md 总规范编写面向生产环境的健壮解码脚本。赞分享物联网后端数据可视化消息队列【免费下载链接】thingsboardAll-in-one IoT Platform - Device management, data collection, processing and visualization.项目地址https://gitcode.com/GitHub_Trending/th/thingsboard点击查看免费下载相关推荐ThingsBoard 上行数据转换器实战用 JavaScript Decoder 函数解析 CSV 文本负载ThingsBoard 上行数据转换器实战用 JavaScript Decoder 函数解析 CSV 文本负载 在 ThingsBoard 的集成Integ物联网后端数据可视化消息队列ThingsBoard 计算字段 TBEL map() 函数实战指南聚合前的逐实体值转换与数据新鲜度控制ThingsBoard 计算字段 TBEL map 函数实战指南聚合前的逐实体值转换与数据新鲜度控制 导读 本指南讲解 ThingsBoard 计算字段Ca物联网后端数据可视化消息队列ThingsBoard 计算字段Calculated Field中 merge / mergeAll 时间序列合并函数实战详解ThingsBoard 计算字段Calculated Field中 merge / mergeAll 时间序列合并函数实战详解 导读 在 ThingsBoa物联网后端数据可视化消息队列创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考