ARTICLE DETAIL

资讯详情

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

ThingsBoard TBEL 下行数据编码器(Encoder)实战:将属性更新推送至外部 MQTT Broker

ThingsBoard TBEL 下行数据编码器(Encoder)实战:将属性更新推送至外部 MQTT Broker 物联网后端数据可视化消息队列【免费下载链接】thingsboardAll-in-one IoT Platform - Device management, data collection, processing and visualization.项目地址https://gitcode.com/GitHub_Trending/th/thingsboard点击查看免费下载本指南围绕 ThingsBoard 集成Integration体系中 TBEL 下行数据转换器Encoder展开以仓库内encoder/example1示例为线索完整讲解 Encoder 函数Encoder(msg, metadata, msgType, integrationMetadata)的四个入参、返回值契约与典型应用场景。读完本文你将掌握如何编写一个把规则引擎消息如设备属性更新编码为外部系统可消费的下行负载并学会结合 ThingsBoard TBEL 脚本引擎的实现机制定位问题。一、Encoder 在 TBEL 数据转换体系中的角色ThingsBoard 的 TBELThingsBoard Expression Language是一套基于 Java 实现的脚本表达式语言被广泛用于规则引擎节点与数据转换器Converter中。在集成Integration场景下数据转换分为两条链路Decoder上行解码将设备上报的原始负载MQTT 消息、HTTP 请求体、二进制数据等解码为规则引擎可处理的 JSON 消息Encoder下行编码将规则引擎下发的消息编码为外部系统MQTT Broker、HTTP 端点等可以消费的负载并携带发送所需的元数据如 topic。example1示例演示的正是 Encoder 的典型场景当温度传感器的上传频率temperatureUploadFrequency属性通过平台 REST API 被更新时需要把这次属性变更连同历史存储的固件版本属性一起推送给外部 MQTT Broker且推送 topic 中要包含设备名。该示例的完整上下文可在仓库中查看Encoder 函数定义文档 与配套示例目录 encoder/example1。二、Encoder 函数签名与四个入参顶层规范文档 encoder_fn.md 定义了 Encoder 函数的完整签名function Encoder(msg, metadata, msgType, integrationMetadata): {msg: object, metadata: object, msgType: string}该函数将规则引擎消息及其元数据转换为对应 Integration 所使用的格式。四个入参含义如下参数类型说明msg{[key: string]: any}规则引擎消息的 JSON 负载metadata{[key: string]: string}由规则引擎产生的、关于消息的键值对附加信息msgTypestring规则引擎消息类型例如ATTRIBUTES_UPDATED、POST_TELEMETRY_REQUEST等预定义消息类型integrationMetadata{[key: string]: string}在集成详情中配置的、与该 Integration 相关的附加键值对其中msgType对应 ThingsBoard 规则引擎的预定义消息类型如属性更新、遥测上报、RPC 请求等它在很大程度上决定了 Encoder 的编码逻辑分支。integrationMetadata与metadata的区别在于前者来自集成Integration的全局配置后者来自产生该消息的规则引擎链路。三、Encoder 返回值契约Encoder 必须返回一个合法 JSON 文档结构如下{ contentType: JSON, data: {\tempFreq\:60,\firmwareVersion\:\1.2.3\}, metadata: { topic: temp-sensor/sensorA/upload } }各字段的语义依据 json_output.mdcontentTypestringJSON、TEXT或BINARYBase64 字符串具体取决于你的 Integration 类型datastring按照内容类型组织的负载数据字符串metadata{[key: string]: string}关于该消息的附加键值对例如 MQTT 集成要使用的 topic 等。注意data必须是字符串而非对象——即使contentType是JSON也需要先通过JSON.stringify()序列化为字符串这一点与 Decoder 侧的返回结构不同。四、example1 示例逐步拆解4.1 输入消息msg示例的输入消息定义在 message.md 中即一次通过 REST API 触发的属性更新负载{ temperatureUploadFrequency: 60 }{:copy-code}是 ThingsBoard 帮助弹窗使用的标记表示该代码块可在 UI 中一键复制。4.2 规则引擎元数据metadata来自规则引擎的附加信息定义在 metadata.mdKeyValuedeviceNamesensorAdeviceTypetemp-sensorss_firmwareVersion1.3.2可以看到metadata中除了设备名与设备类型外还包含了ss_firmwareVersion——这正是示例场景中很久以前配置、本次请求中并未携带的固件版本属性Encoder 需要从metadata中把它取出来一并下发。4.3 集成元数据integrationMetadata集成级别的附加元数据定义在 integration_metadata.mdKeyValueintegrationNameTest integration该字段来自集成详情的配置可在每个集成上单独配置。4.4 消息类型msgType本示例的msgType为ATTRIBUTES_UPDATED对应属性被更新这一规则引擎预定义消息类型。这意味着该 Encoder 通常挂在属性更新类的规则引擎节点之后每当设备属性发生变化即触发下行推送。4.5 编码函数逐行解读完整的示例函数定义在 encoder_fn.md// Encode downlink data from incoming Rule Engine message // msg - JSON message payload downlink message json // msgType - type of message, for ex. ATTRIBUTES_UPDATED, POST_TELEMETRY_REQUEST, etc. // metadata - list of key-value pairs with additional data about the message // integrationMetadata - list of key-value pairs with additional data defined in Integration executing this converter /** Encoder **/ var data {}; // Process data from incoming message and metadata data.tempFreq msg.temperatureUploadFrequency; data.firmwareVersion metadata[ss_firmwareVersion]; // Result object with encoded downlink payload var result { // downlink data content type: JSON, TEXT or BINARY (base64 format) contentType: JSON, // downlink data data: JSON.stringify(data), // Optional metadata object presented in key/value format metadata: {topic: metadata[deviceType] / metadata[deviceName] /upload} }; return result;关键编码逻辑从 msg 中取值data.tempFreq msg.temperatureUploadFrequency;——把入站消息中的temperatureUploadFrequency: 60重命名为目标格式中的tempFreq。这也展示了 Encoder 的一个重要作用字段映射与重命名设备侧与平台侧、平台侧与外部系统之间的字段名往往不一致。从 metadata 中取值data.firmwareVersion metadata[ss_firmwareVersion];——通过metadata[key]的方式访问元数据取回本次请求中不存在的固件版本。构造返回对象contentType: JSON声明下行负载为 JSON 格式data: JSON.stringify(data)将组装好的对象序列化为字符串metadata中通过字符串拼接动态构造 MQTT topicmetadata[deviceType] / metadata[deviceName] /upload代入示例数据即temp-sensor/sensorA/upload。4.6 编码结果推演综合 4.14.5 的输入在 TBEL 引擎中执行后Encoder 返回的下行消息为{ contentType: JSON, data: {\tempFreq\:60,\firmwareVersion\:\1.3.2\}, metadata: { topic: temp-sensor/sensorA/upload } }之后 MQTT 类集成会据此把data字符串发布到temp-sensor/sensorA/upload这个 topic从而完成平台属性更新 → 外部 MQTT Broker的链路。需要说明仓库示例中的 json_output.md 给出的输出示例里firmwareVersion写作1.2.3而本示例metadata表格中的值为1.3.2这是帮助文档中两处示例版本号的细微出入实际运行时编码结果取决于真实传入的metadata[ss_firmwareVersion]值。五、源码级原理TBEL 引擎如何执行 EncoderTBEL 脚本并非在浏览器或外部 JS 运行时中执行而是由 ThingsBoard 服务端内置的 Java 实现的 TBEL 引擎负责解析与求值。从仓库源码结构看核心实现集中在common/script/script-api/src/main/java/org/thingsboard/script/api/tbel该目录下的关键类包括TbelInvokeService与DefaultTbelInvokeService脚本调用的统一入口与默认实现负责接收脚本内容、上下文参数并返回执行结果TbelScriptTBEL 脚本的封装类型TbelScriptExecutionTask脚本执行任务承载一次具体的执行请求TbUtils、TbJson、TbDate等工具类为 TBEL 脚本提供decodeToJson、时间与 JSON 处理等内置函数支持。因此当你编写 Encoder 函数时本质上是向该引擎提交一段符合其语法的表达式代码引擎会按函数签名注入msg、metadata、msgType、integrationMetadata四个变量并在函数返回后校验返回值是否符合本文第三节描述的{contentType, data, metadata}契约。这也解释了为什么 Encoder 代码中可以直接使用JSON.stringify()等能力——它们由引擎的内置对象与方法提供。六、实战要点与常见误区基于示例与源码结构编写 Encoder 时有几个要点值得注意data必须是字符串返回对象中的data字段需要JSON.stringify()序列化即使内容是 JSON 结构。常见的报错场景是直接返回对象而忘记序列化。区分三类元数据来源msg取消息负载、metadata取规则引擎附加信息、integrationMetadata取集成级配置三者的生命周期与配置位置不同不要混用。topic 动态构造外部 MQTT 场景下通常需要在返回的metadata.topic中动态拼入设备名/类型示例中的metadata[deviceType] / metadata[deviceName] /upload即标准写法。msgType分支处理同一个 Encoder 可能被多种消息类型触发如ATTRIBUTES_UPDATED与POST_TELEMETRY_REQUEST建议按msgType编写分支逻辑避免把遥测上报误编码为属性更新负载。contentType与集成类型匹配JSON、TEXT、BINARYBase64三种内容类型需要与所配置的 Integration 类型兼容例如面向 MQTT 集成通常使用JSON或TEXT。七、进一步阅读本文所有内容均可在当前仓库中直接查阅与验证Encoder 函数顶层规范ui-ngx/src/assets/help/en_US/converter/tbel/encoder_fn.md示例输入消息message.md示例编码函数encoder_fn.md示例元数据与集成元数据metadata.md、integration_metadata.md返回结构字段说明json_output.mdTBEL 引擎源码common/script/script-api/src/main/java/org/thingsboard/script/api/tbel如需对照理解上行方向可继续阅读 decoder 示例目录 与 decoder_fn.md从而构建对 TBEL 数据转换体系的完整认知。赞分享物联网后端数据可视化消息队列【免费下载链接】thingsboardAll-in-one IoT Platform - Device management, data collection, processing and visualization.项目地址https://gitcode.com/GitHub_Trending/th/thingsboard点击查看免费下载相关推荐ThingsBoard 集成 Downlink 数据 Encoder 转换器实战把规则引擎下行消息编码为外部 MQTT 负载ThingsBoard 集成 Downlink 数据 Encoder 转换器实战把规则引擎下行消息编码为外部 MQTT 负载 本文以 ThingsBoard物联网后端数据可视化消息队列ThingsBoard 集成 TBEL Encoder 函数实战从 Rule Engine 消息到下行链路编码ThingsBoard 集成 TBEL Encoder 函数实战从 Rule Engine 消息到下行链路编码 本文档基于 encoder_fn.md htt物联网后端数据可视化消息队列ThingsBoard 下行数据编码器Encoder函数实战指南将规则引擎消息转换为外部集成负载ThingsBoard 下行数据编码器Encoder函数实战指南将规则引擎消息转换为外部集成负载 导读 本文聚焦 ThingsBoard Integrat物联网后端数据可视化消息队列创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表