ARTICLE DETAIL

资讯详情

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

ThingsBoard TBEL 解码器实战:从 Simple JSON 负载到设备遥测数据转换

ThingsBoard TBEL 解码器实战:从 Simple JSON 负载到设备遥测数据转换 物联网后端数据可视化消息队列【免费下载链接】thingsboardAll-in-one IoT Platform - Device management, data collection, processing and visualization.项目地址https://gitcode.com/GitHub_Trending/th/thingsboard点击查看免费下载导读本文以 ThingsBoard 开源仓库中的 Simple JSON 解码器示例 为骨架完整讲解 TBELThingsBoard Expression Language上行数据转换解码器的编写方法如何把集成收到的原始 JSON 负载解析为平台通用的设备数据格式如何将字符串时间戳转换为 Unix 毫秒时间戳以及解码器返回值必须满足的结构规范。读完本文你将掌握 TBEL 解码器的入参约定、返回格式要求并能够独立编写可复制的解码函数把任意 JSON 格式的接入消息映射为设备名、设备类型与遥测数据。什么是 TBEL 解码器在 ThingsBoard 的集成Integration体系中上行链路Uplink数据转换解码器负责将集成收到的消息解析并转换为平台通用的数据格式。它是集成与平台实体之间的翻译层MQTT、HTTP、CoAP、SigFox、ChirpStack、The Things Stack 等各种接入协议的原始报文都要经过解码器才能成为设备遥测数据。TBELThingsBoard Expression Language是平台内置的脚本语言其解码器函数签名固定为function Decoder(payload, metadata): object | object[]这个函数定义在仓库的解码器通用文档中是 UI 内置帮助系统为 TBEL 解码器统一提供的签名。Simple JSON 示例正是这一签名的典型落地。两个入参payload 与 metadata参数类型说明payloadany字节数组集成产生的原始消息。集成可能按 JSON、TEXT、Binary(Base64) 三种内容类型产出负载内容类型只是调试事件的存储提示不影响解码函数本身的工作方式metadata{[key: string]: string}集成相关的元数据键值映射可在集成详情中为每个集成配置额外的元数据字段关于payload的类型细节官方文档有明确说明大多数集成如 SigFox、LORIOT、ChirpStack、The Things Stack始终产出 JSON 负载且会用有用的元数据RSSI、SNR 等包装二进制设备负载基于 HTTP 的集成和 CoAP 集成根据请求头确定负载的内容类型同一个集成可能因请求不同而产出 JSON、TEXT 或 BINARYMQTT 集成MQTT 3.x 之前的发布消息没有 content-type的负载始终是 BINARY 类型。解码器内部可以使用decodeToString和decodeToJson工具函数将字节数组转换为字符串或 JSON 对象——这正是 Simple JSON 示例的核心动作。逐行解读 Simple JSON 解码器仓库中的示例解码函数代码如下// 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: Thermostat, deviceLabel: Kitchen Thermostat, telemetry: { ts: timestamp, values: { temperature: json.t, humidity: json.h, } } }; return result;这段代码只有 4 个逻辑步骤却是 TBEL 解码器最常见、最典型的写作范式第 1 步解码负载。decodeToJson(payload)将原始字节数组负载解析为 JSON 对象。解析成功后json.serialNumber、json.ts、json.t、json.h即可按字段名直接访问。第 2 步转换时间戳。Date.parse(json.ts)把负载中的人类可读时间字符串解析为 Unix 毫秒级时间戳。原始负载中的ts: 2021-11-21 14:27:39 UTC经过转换变成1637504859000这正是平台遥测数据所要求的时间表示。第 3 步构造结果对象。结果对象包含设备标识deviceName、deviceType、deviceLabel与遥测数据telemetry。注意telemetry采用了{ts, values}结构ts承载该数据点的时间戳values承载具体遥测键值对。第 4 步返回结果。return result;把结果交给平台后续处理。一个值得注意的版本差异在仓库中还保留着同一示例的 JavaScript 早期版本位于 converter/examples/decoder/simple-json/decoder_fn.md它的不同之处在于在脚本内部手写了两个辅助函数/** 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)); }而在 TBEL 版本中decodeToJson、decodeToString是语言内置的导入函数无需自行实现。这一点可以从 TBEL 运行时的源码得到印证在 TbUtils.java 中decodeToString与decodeToJson通过parserConfig.addImport(...)注册为脚本可直接调用的内置函数见 TbUtils.java其重载实现同时支持字节列表入参与字符串入参两种形式public static Object decodeToJson(ExecutionContext ctx, ListByte bytesList) throws IOException public static Object decodeToJson(ExecutionContext ctx, String jsonStr) throws IOException见 TbUtils.java也就是说decodeToJson既能直接解析字符串也能先把字节列表转成字符串再解析与 Simple JSON 示例中的调用方式完全一致。编辑器自动补全中的函数定义前端为 TBEL 编辑器提供了完整的函数自动补全与语法高亮定义保存在 tbel-utils.models.ts。其中decodeToJson的定义为decodeToJson: { meta: function, description: Parses a JSON string or converts a list of bytes to a string and parses it as JSON., args: [{ name: data, description: The JSON string or list of bytes to parse into JSON object, type: string | list }], return: { description: The parsed JSON object, type: object } }同文件还定义了decodeToString、bytesToString、parseInt、parseLong、parseFloat、各类十六进制/字节解析函数、isBinary等几十个 TBEL 内置工具函数。这意味着在 UI 编辑器中输入这些函数名即可获得参数提示是编写解码器时的一手参考资料。输入负载与输出结果对照Simple JSON 示例对应的输入负载保存在 payload.md{ serialNumber: SN-111, ts: 2021-11-21 14:27:39 UTC, t: 36.6, h: 70 }解码后得到的输出保存在 output.md{ deviceName: SN-111, deviceType: Thermostat, deviceLabel: Kitchen Thermostat, telemetry: { ts: 1637504859000, values: { temperature: 36.6, humidity: 70 } } }对照可见数据流非常清晰原始字段解码器动作输出字段serialNumber: SN-111直接引用deviceName: SN-111—硬编码常量deviceType: Thermostat—硬编码常量deviceLabel: Kitchen Thermostatts: 2021-11-21 14:27:39 UTCDate.parse()转为毫秒telemetry.ts: 1637504859000t: 36.6直接引用telemetry.values.temperature: 36.6h: 70直接引用telemetry.values.humidity: 70这一示例在解码器通用文档的示例表格中被命名为Simple JSON with date其技术要点正是Parse specific JSON format with string representation of the timestamp即解析带字符串时间戳的特定 JSON 格式——这恰好概括了本文讲解的解码器模式。解码器返回值的格式规范Simple JSON 示例只是输出格式的一个子集。根据解码器通用文档解码器必须返回满足以下要求的合法 JSON 文档必须满足must必须包含deviceNamedeviceType或者assetNameassetType这样的键值对。这些属性标识设备或资产设备名与资产名在租户范围内唯一平台会据此查找已存在的设备/资产若未找到且集成开启了允许创建设备或资产设置平台将自动创建新实体。DevEUI、MAC 地址或其他唯一标识符常被用作设备名。可以包含mayattributes对象表示分配给设备/资产的服务器端属性集合telemetry对象或数组表示设备/资产的时间序列数据customerName属性平台据此自动将设备分配给客户若同名的客户不存在则创建。注意该分配只发生在当前集成创建设备或资产的过程中设备已存在时此参数会被忽略groupName属性平台据此自动将设备分配到实体组若同名分组不存在则创建默认在租户范围内创建若同时带有customerName则在客户范围内创建。同样只在创建实体时生效deviceLabel或assetLabel属性用于创建非唯一的用户友好标签便于在仪表盘上替代设备名展示。也只在实体创建时生效。四种典型的输出形态仓库在 converter/tbel/examples/decoder/ 目录下存放了多种输出示例文件分别演示了不同复杂度1. 最简输出simple_json_output.md——设备名 设备类型 属性 无时间戳的遥测{ deviceName: 001B638446E7, deviceType: thermostat, attributes: { serialNumber: SN-111 }, telemetry: { temperature: 42, humidity: 80 } }2. 带标签、客户与分组的输出label_json_output.md{ deviceName: 001B638446E7, deviceType: thermostat, deviceLabel: Room A thermostat, customerName: Company Name, groupName: Thermostats, attributes: { model: Model A, serialNumber: SN-111, integrationName: Test integration }, telemetry: { temperature: 42, humidity: 80 } }3. 带自定义时间戳的输出simple_json_output_with_ts.md——平台期望时间戳是 Unix 毫秒级否则使用服务器时间{ deviceName: 001B638446E7, deviceType: thermostat, attributes: { serialNumber: SN-111 }, telemetry: { ts: 1527863043000, values: { temperature: 42, humidity: 80 } } }4. 对象数组输出json_array_output.md——数据转换输出也可以是包含多个设备/资产的对象数组其中每个对象还可携带多个不同时间戳的时间序列数据点[ { deviceName: 001B638446E7, deviceType: thermostat, deviceLabel: Room A thermostat, attributes: { model: Model A }, telemetry: [ { ts: 1527863043000, values: { battery: 3.99, temperature: 27.05 } }, { ts: 1527863044000, values: { battery: 3.98, temperature: 27.06 } } ] }, { assetName: OF-123, assetType: office, attributes: { model: Model A }, telemetry: { ts: 1527863041000, values: { battery: 3.99, temperature: 27.05 } } } ]这个数组示例同时展示了设备deviceName/deviceType与资产assetName/assetType两种实体类型可以在一次转换中混用。更多解码器示例从 JSON 走向 CSV、二进制与元数据Simple JSON 不是 TBEL 解码器的唯一形态。在 decoder 示例目录 下仓库还提供了多组覆盖不同内容类型与复杂度的对照示例每组都包含输入payload、解码函数decoder_fn与预期输出output非常适合作为进阶练习示例名称内容类型技术要点Simple CSVTEXT用decodeToString解析 CSV 文本Simple binary dataBINARY解析含设备序列号、电池电量、温度与饱和度的二进制负载JSON with multiple hex encoded valuesJSON转换多个含十六进制value字段及时间戳的 JSON 对象Use metadata fieldsJSON利用metadata字段确定设备类型、型号与客户名example1—综合基础示例这些示例在解码器通用文档末尾的示例表格中有统一索引每个示例都给出了可点击的 payload / Decoder / Output 帮助弹窗。对于二进制负载的解析可重点参考 TBEL 内置的字节与十六进制工具函数如parseBytesToInt、parseHexToLong、hexToBytes等它们的完整参数说明同样收录在 tbel-utils.models.ts 中。实战要点总结解码入口固定TBEL 解码器签名必须是function Decoder(payload, metadata)返回object或object[]先解码再取字段面对字节数组负载优先调用内置decodeToJson(payload)获得 JSON 对象再用字段名访问时间戳必须毫秒级若负载提供事件时间需用Date.parse()或parseDateToTimestampOrNow等函数转换为 Unix 毫秒时间戳否则平台将使用服务器时间设备标识是硬性要求返回对象必须包含deviceName/deviceType或assetName/assetTypedeviceLabel提供非唯一的友好展示名善用可选字段attributes、customerName、groupName、telemetry数组等字段可让一次解码同时完成属性写入、客户/分组分配与多数据点上报多实体一次返回当一条上行消息包含多个设备/资产时返回对象数组即可每个元素可携带各自的时间序列数据点。理解并复用 Simple JSON 示例 之后配合仓库中同目录下的 CSV、二进制、十六进制、元数据示例逐级进阶即可应对绝大多数 IoT 接入协议的负载解析场景。赞分享物联网后端数据可视化消息队列【免费下载链接】thingsboardAll-in-one IoT Platform - Device management, data collection, processing and visualization.项目地址https://gitcode.com/GitHub_Trending/th/thingsboard点击查看免费下载相关推荐ThingsBoard TBEL 解码器实战simple-metadata 示例如何将 JSON 载荷与设备元数据组合为遥测数据ThingsBoard TBEL 解码器实战simple metadata 示例如何将 JSON 载荷与设备元数据组合为遥测数据 本篇文章以 ThingsBo物联网后端数据可视化消息队列Grok Build 终端支持与故障排查从 /doctor 诊断到 tmux、SSH、剪贴板与 RTL 实战指南Grok Build 终端支持与故障排查从 /doctor 诊断到 tmux、SSH、剪贴板与 RTL 实战指南 Grok Build 以全屏 TUI 形式运物联网后端数据可视化消息队列ThingsBoard TBEL 解码器函数实战以 simple-json 示例拆解 Uplink 数据转换ThingsBoard TBEL 解码器函数实战以 simple json 示例拆解 Uplink 数据转换 导读 本文围绕 ThingsBoard 集成框架物联网后端数据可视化消息队列上一篇抖音无水印下载保姆级指南douyin-downloader 从安装配置到批量下载一次讲透下一篇忘记 Apple ID 怎么办用 applera1n 轻松绕过 iOS 激活锁创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表