ARTICLE DETAIL

资讯详情

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

ThingsBoard 数据转换器(Converter)解码器 JSON 输出格式详解:从基础结构到多设备批量上报

ThingsBoard 数据转换器(Converter)解码器 JSON 输出格式详解:从基础结构到多设备批量上报 物联网后端数据可视化消息队列【免费下载链接】thingsboardAll-in-one IoT Platform - Device management, data collection, processing and visualization.项目地址https://gitcode.com/GitHub_Trending/th/thingsboard点击查看免费下载导读本文围绕 ThingsBoard 集成Integration数据转换器中解码器Decoder函数的 JSON 输出格式展开核心示例取自仓库中的 simple_json_output.md。你将掌握解码器返回对象的完整字段契约deviceName/deviceType/attributes/telemetry、带时间戳ts的时序数据写法、deviceLabel/customerName/groupName等扩展字段的用法以及如何返回 JSON 数组实现一条消息批量创建设备或资产同时结合后端解析源码理解这些字段在被 AbstractUplinkDataConverter 解析时的校验规则与默认值行为从而写出可稳定落库、可调试排错的解码器脚本。一、解码器输出格式在数据转换链路中的位置在 ThingsBoard 的 Integration 模块中上行数据Uplink从外部设备进入平台后需要经过数据转换器Converter中的解码器Decoder脚本把原始 payload可能是二进制、CSV、HEX 或 JSON翻译成平台统一的数据模型。解码器脚本的执行入口位于 ScriptUplinkDataConverterString decoderField ScriptLanguage.JS.equals(scriptInvokeService.getLanguage()) ? decoder : tbelDecoder; String decoder configuration.getConfiguration().get(decoderField).asText();即解码器支持 JavaScript 与 TBEL 两种语言分别读取配置中的decoder与tbelDecoder字段。脚本执行的原始结果是一段字符串随后在 AbstractUplinkDataConverter#convert 中被JsonParser.parseString(rawResult)解析为JsonElementJsonElement element JsonParser.parseString(rawResult); ListUplinkData resultList new ArrayList(); if (element.isJsonArray()) { for (JsonElement uplinkJson : element.getAsJsonArray()) { resultList.add(parseUplinkData(uplinkJson.getAsJsonObject(), finalMetadata)); } } else if (element.isJsonObject()) { resultList.add(parseUplinkData(element.getAsJsonObject(), finalMetadata)); }这段源码揭示了两条关键事实解码器返回的字符串必须是合法的 JSON且必须是一个 JSON 对象或 JSON 数组对象会被逐条解析数组中的每个元素视为一条独立的 UplinkData因此数组可以用于一次转换多条设备/资产数据。提示以上调试与解析逻辑还支持 Debug 模式下将转换前后的原始数据与结果持久化见同文件中的persistUplinkDebug调用便于排查解码器输出是否正确。二、基础输出结构最简单的 JSON 对象仓库中的 simple_json_output.md 给出了解码器输出对象的最小骨架{ deviceName: 001B638446E7, deviceType: thermostat, attributes: { serialNumber: SN-111 }, telemetry: { temperature: 42, humidity: 80 } }这个对象由四个顶层字段组成字段是否必填说明deviceName必填设备场景平台中设备的名称若不存在会被自动创建deviceType可选设备类型缺省时后端使用默认类型DEFAULT_DEVICE_TYPEattributes可选客户端属性Client-Side Attributes键值对会写入平台属性存储telemetry可选时序遥测数据键值对作为当前时刻的遥测写入上述解析逻辑与 AbstractUplinkDataConverter#parseUplinkData 完全对应。例如设备名与类型的读取entityName src.get(deviceName).getAsString(); builder.deviceName(entityName); if (src.has(deviceType)) { builder.deviceType(src.get(deviceType).getAsString()); } else { builder.deviceType(DEFAULT_DEVICE_TYPE); }而telemetry与attributes则分别经由parseTelemetry、parseAttributesUpdate转换为平台内部的PostTelemetryMsg与PostAttributeMsg底层基于 Transport 层 Protobuf 消息。也就是说解码器返回 JSON 后平台会自动完成从 JSON 到内部传输协议的转换开发者无需关心序列化细节。2.1 关键校验规则从 getIsAssetAndVerify 的实现可以看到两条硬性校验解码器脚本必须遵守deviceName与assetName至少出现其一否则抛出JsonParseException(Either deviceName or assetName should be present in the converter output!)二者不能同时出现否则抛出JsonParseException(Both deviceName and assetName cant be present in the converter output!)若选择资产场景只提供assetName则必须同时提供assetType否则抛出JsonParseException(Asset type is not set!)。因此在编写解码器时务必根据原始数据只填充设备字段或资产字段之一避免输出对象同时携带两个名称字段。三、带时间戳的遥测输出ts values 结构基础示例中的telemetry是一个扁平键值对象表示当前时刻的遥测。若原始数据携带了时间信息则需要使用 simple_json_output_with_ts.md 展示的ts values结构{ deviceName: 001B638446E7, deviceType: thermostat, attributes: { serialNumber: SN-111 }, telemetry: { ts: 1527863043000, values: { temperature: 42, humidity: 80 } } }此时telemetry对象包含两个字段tsUnix 毫秒时间戳epoch milliseconds指示这条遥测数据对应的时间点values实际的遥测键值对。在 simple-json 完整示例 中可以看到典型的解码器写法——把人类可读的时间字符串换算成 epoch 毫秒// 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 } } };配合仓库中的 payload.md输入{serialNumber: SN-111, ts: 2021-11-21 14:27:39 UTC, t: 36.6, h: 70}与 output.md输出ts: 1637504859000可以看到一条完整的原始 payload → 解码函数 → 标准输出链路。需要说明的是这里Date.parse是否支持非标准日期格式取决于运行环境JavaScript 执行器生产环境中建议先对时间字符串做规范化解析后再转换。四、扩展字段deviceLabel、customerName、groupName、integrationName除了最小骨架解码器输出还支持若干可选扩展字段用于在转换阶段直接完成实体的业务归属配置。见 label_json_output.md 与 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 } }各扩展字段的语义如下字段说明deviceLabel设备的显示标签与deviceName分离更友好地展示设备customerName该设备所属客户Customer的名称平台会按名称查找或创建客户并完成归属groupName设备分组名称转换后设备会被加入指定分组attributes.integrationName属性中的integrationName仅是一个普通属性键示例并非特殊字段integrationName这类业务属性同样通过attributes写入平台对应后端解析见上文parseUplinkDataif (src.has(deviceLabel)) { builder.deviceLabel(src.get(deviceLabel).getAsString()); } if (src.has(customerName)) { builder.customerName(src.get(customerName).getAsString()); } if (src.has(groupName)) { builder.groupName(src.get(groupName).getAsString()); }从源码可见deviceLabel仅在设备场景生效位于isAsset为 false 的分支中而customerName与groupName对设备和资产均适用。这些字段的完整语义如 customerName 是按名称自动查找/创建还是必须已存在取决于转换器的后续 Uplink 处理逻辑编写脚本时建议在测试环境中先验证实际行为。五、JSON 数组输出一次上报多设备/资产当一条外部消息包含多条设备数据例如网关批量转发、多传感器聚合报文时解码器可以返回 JSON 数组。仓库中的 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 } } } ]这个示例同时展示了三种进阶能力数组逐条解析数组中的每个对象被独立解析成一条UplinkData对应前文element.isJsonArray()分支单实体多时间点遥测设备001B638446E7的telemetry本身是数组携带了两个不同ts的时间点实现一条转换结果回填多段历史时序数据资产混合输出第二个对象改用assetNameassetType必填平台据此创建/更新名为OF-123、类型为office的资产。混合输出时要注意同一对象内deviceName与assetName不能并存见 2.1 节校验规则。类似的数组输出同样出现在 complex-json-hex/output.md 中其values内还嵌入了rawData对象说明遥测值除了标量数字、字符串、布尔外也支持嵌套 JSON 对象——平台会把嵌套对象按 JSON 类型键值JSON_V写入时序数据。这与 filterKeyValueAndUpdateMap 中对JSON_V类型的显式支持相印证。六、编写解码器输出时的实践建议综合仓库中的示例文档与后端解析源码可以总结出以下可直接落地的经验统一使用标准 JSON 返回解码器return的对象会被JSON.stringify成字符串后再被后端JsonParser解析务必保证输出是合法的 JSON 对象或数组例如使用JSON.parse而非手工拼串参考 decoder_fn.md 中decodeToJson的写法。名称字段的完备性每个输出对象要么包含deviceName可选deviceType、deviceLabel要么包含assetNameassetType两者互斥。时间字段统一毫秒需要回填历史遥测时使用telemetry.tsepoch 毫秒telemetry.values不带ts则数据落为当前时刻。合理利用数组网关批量上报场景返回数组每个元素对应一个实体单实体多时间点可把telemetry写成ts/values对象数组。利用 Debug 模式验证转换器支持 Debug 输出可将转换前后的原始 payload 与 JSON 结果持久化查看用于核对字段是否被正确解析。七、相关资源索引输出格式官方示例本文主文档simple_json_output.md带时间戳输出simple_json_output_with_ts.md扩展字段label/customer/grouplabel_json_output.md、json_output.md数组输出json_array_output.md完整链路示例payload 解码函数 输出simple-json 目录、complex-json-hex 目录后端解析实现AbstractUplinkDataConverter、ScriptUplinkDataConverter掌握了解码器 JSON 输出契约你就能在 ThingsBoard 的各类集成MQTT、HTTP、CoAP、TCP 等中编写出结构正确、语义清晰的数据转换脚本让任意原始格式的报文都能稳定地映射为平台统一的设备、属性与时序数据模型。赞分享物联网后端数据可视化消息队列【免费下载链接】thingsboardAll-in-one IoT Platform - Device management, data collection, processing and visualization.项目地址https://gitcode.com/GitHub_Trending/th/thingsboard点击查看免费下载相关推荐ThingsBoard 上行转换器解码器 JSON 数组输出指南一次上报多设备与多条遥测数据ThingsBoard 上行转换器解码器 JSON 数组输出指南一次上报多设备与多条遥测数据 导读 ThingsBoard 的 Integration集成物联网后端数据可视化消息队列ThingsBoard 数据转换器 Decoder 输出格式详解simple-json 示例与源码级剖析ThingsBoard 数据转换器 Decoder 输出格式详解simple json 示例与源码级剖析 本文以 ThingsBoard 开源 IoT 平台内物联网后端数据可视化消息队列ThingsBoard 上行数据解码器DecoderJSON 输出格式全解从 deviceName 到 telemetry 的标准结果契约ThingsBoard 上行数据解码器DecoderJSON 输出格式全解从 deviceName 到 telemetry 的标准结果契约 导读 在 Th物联网后端数据可视化消息队列创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表