新闻详情

新闻详情

首页 / 资讯中心 / 详情

ThingsBoard 下行数据编码器(Encoder)函数实战指南:将规则引擎消息转换为外部集成负载

发布时间:2026/10/1 16:57:46来源:尧图网络
ThingsBoard 下行数据编码器(Encoder)函数实战指南:将规则引擎消息转换为外部集成负载
物联网后端数据可视化消息队列【免费下载链接】thingsboardAll-in-one IoT Platform - Device management, data collection, processing and visualization.项目地址https://gitcode.com/GitHub_Trending/th/thingsboard点击查看免费下载导读本文聚焦 ThingsBoard Integration集成框架中的下行数据转换器编码函数Downlink Data Converter Encoder Function讲解如何用 JavaScript 把规则引擎Rule Engine产生的下行消息msg及其metadata转换为外部 MQTT、HTTP、CoAP 等集成所要求的具体负载格式。读完本文你将掌握 Encoder 函数的四参数签名、返回值 JSON 结构contentType/data/metadata并能照示例编写一个把设备属性更新推送到外部 MQTT Broker 的完整编码器。本文同时结合仓库源码 AbstractDownlinkDataConverter.java 说明平台底层如何解析编码器输出帮助你在调试时做到心中有数。一、Encoder 函数在下行链路中的角色ThingsBoard 的数据转换器Converter分为两类上行解码器Decoder负责把设备上报的原始负载解析为平台统一格式下行编码器Encoder则处理相反方向——当规则引擎向外发送下行消息例如属性更新、RPC 请求时Encoder 函数负责把规则引擎消息变换为对应 Integration 能发送的格式。核心函数签名完整定义见 encoder_fn.mdfunction Encoder(msg, metadata, msgType, integrationMetadata): {msg: object, metadata: object, msgType: string}该 JavaScript 函数用于将传入的规则引擎消息及其元数据转换为对应 Integration 使用的格式。它面向的是集成框架的下行链路与处理设备上行的 Decoder 函数在方向与职责上正好相反。二、四个输入参数逐一解析参数类型说明msg{[key: string]: any}规则引擎消息的 JSON 负载是下行消息的核心数据体metadata{[key: string]: string}键值对列表携带规则引擎为消息附加的额外数据如deviceName、deviceType等msgTypestring规则引擎消息类型例如ATTRIBUTES_UPDATED、POST_TELEMETRY_REQUEST等预定义消息类型integrationMetadata{[key: string]: string}集成专属字段的键值映射你可以在每个集成的详情页中为其额外配置元数据其中msgType取值来自规则引擎的预定义消息类型集合。integrationMetadata是区别于metadata的独立维度前者由规则引擎在下行消息上生成后者则属于 Integration 自身的配置同一集成下所有下行消息都能拿到这份固定附加信息。三、返回值结构编码后的下行负载Encoder 函数应返回一个合法 JSON 文档结构如下完整字段说明见 json_output.md{ contentType: JSON, data: {\tempFreq\:60,\firmwareVersion\:\1.2.3\}, metadata: { topic: temp-sensor/sensorA/upload } }字段语义contentTypestringJSON、TEXT或BINARYBase64 字符串具体取值与你的 Integration 类型相关。例如 MQTT 集成发送原始字节使用JSON或TEXT时平台按 UTF-8 编码字节使用BINARY时平台按 Base64 解码。datastring与内容类型对应的数据字符串。JSON类型通常为JSON.stringify之后的字符串BINARY类型为 Base64 编码的原始字节串。metadata{[key: string]: string}关于消息的附加键值对例如 MQTT 集成所需的topic发布主题等。底层是如何解析这三个字段的平台侧对 Encoder 返回值的解析逻辑集中在 AbstractDownlinkDataConverter.java 的parseDownlinkData方法中这决定了你的返回值必须遵守的硬性约束返回值必须是一个 JSON 对象且contentType与data字段缺一不可否则抛出Downlink content type is not set!/Downlink data is not set!异常contentType只接受JSON、TEXT、BINARY三种取值其他值会抛出Unknown downlink content type异常JSON与TEXT按 UTF-8 转字节BINARY走 Base64 解码metadata字段可选但若存在必须为对象且其值必须是标量字符串/数字/布尔嵌套对象会触发Invalid downlink metadata format!异常每个键值会被放入MapString, String最终封装为DownlinkData。此外convertDownLink方法对 Encoder 的原始返回结果做了兼容处理允许返回对象或对象数组——数组中的每个元素都会被单独解析为一条下行负载见 AbstractDownlinkDataConverter.java。这意味着一个 Encoder 函数可以同时产出多条消息。在集成开启 Debug 模式时原始输入消息与编码器输出会以Downlink前缀持久化为调试事件方便排错。四、实战示例把属性更新推送到外部 MQTT Broker原文档给出了一个完整场景温度与湿度上传频率属性通过平台 REST API 更新你希望把这个更新推送到外部 MQTT BrokerTTN、Mosquitto、AWS IoT 等同时把很久以前配置且本次请求中不存在的firmwareVersion属性一并带上并且推送主题要包含设备名。4.1 输入参数msg规则引擎消息负载见 message.md{ temperatureUploadFrequency: 60 }metadata规则引擎附加元数据见 metadata.mdKeyValuedeviceNamesensorAdeviceTypetemp-sensorss_firmwareVersion1.3.2msgTypeATTRIBUTES_UPDATEDintegrationMetadata集成专属元数据见 integration_metadata.mdKeyValueintegrationNameTest integration可以看到metadata中携带了设备名、设备类型以及一个ss_前缀的历史属性键ss_firmwareVersion这正是我们在编码函数里补充firmwareVersion的数据来源——它不在本次msg负载里但可以从metadata中取回。4.2 Encoder 函数完整实现完整的 JavaScript 编码函数见 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.temperatureUploadFrequency取出本次更新值赋给新键tempFreq从metadata[ss_firmwareVersion]取出历史属性补齐firmwareVersion——即“本次请求缺失的数据可以从元数据补全”。动态构造发送参数利用metadata[deviceType]与metadata[deviceName]拼接 MQTT 发布主题temp-sensor/sensorA/upload使主题天然包含设备名实现按设备路由。4.3 函数返回结果{ contentType: JSON, data: {\tempFreq\:60,\firmwareVersion\:\1.2.3\}, metadata: { topic: temp-sensor/sensorA/upload } }五、contentType 三种取值与适配场景contentTypedata内容典型适配集成场景JSONJSON 字符串一般经JSON.stringify生成MQTT、HTTP、CoAP 等以结构化数据为主的集成TEXT纯文本字符串文本协议、CSV 负载、某些 TCP/UDP 场景BINARYBase64 编码的字节串二进制协议负载、非文本字节流平台侧对三种类型的处理同样可溯源到源码在 AbstractIntegration.java 中上行方向会根据集成返回的contentType将数据解析为 JSON 节点或 Base64 文本节点下行方向的字节还原则由parseDownlinkData按上文规则完成JSON/TEXT走 UTF-8BINARY走 Base64 解码见 AbstractDownlinkDataConverter.java。因此编写 Encoder 时务必让contentType与data的真实编码保持一致否则集成在解码阶段会得到错误字节。六、TBEL 版本的 Encoder 函数除了 JavaScript 版本ThingsBoard 还提供了 TBELThingsBoard Expression Language版本的 Encoder 函数其文档位于 tbel/encoder_fn.md。TBEL 是 ThingsBoard 为数据转换场景提供的表达式语言语法与 JavaScript 高度相似但运行于平台自有的受限沙箱环境中。TBEL 版本在函数签名、四个参数语义、返回值结构上与 JavaScript 版完全一致同样支持msg、metadata、msgType、integrationMetadata四个入参以及contentType/data/metadata三字段返回值示例函数体见 TBEL 编码器示例与 JavaScript 版逐行等价。你可以根据转换器配置中选择的语言引擎来选用对应版本。七、编写与调试建议结合上述文档与源码给出几条可直接落地的实践建议严格保证返回对象含contentType和data缺失任一字段即转换失败并产生异常可用 Debug 模式下的 Downlink 调试事件定位。data字段必须是字符串JSON类型记得用JSON.stringifyBINARY类型记得先用 Base64 编码不要直接把对象赋给data。善用metadata补全上下文msg中缺失但确需发送的历史属性如示例中的firmwareVersion、设备名、设备类型等信息通常已在规则引擎消息的metadata中按 key 直接读取即可。metadata返回值只放标量键值嵌套对象会触发平台解析异常MQTT 集成所需的topic、HTTP 集成所需的自定义头信息等应作为扁平键值放置。一次转换可产多条消息Encoder 返回对象数组即可一次下发多条独立负载适合需要拆分或广播的场景。integrationMetadata用于传递集成级配置需要在所有下行消息中固定携带的信息如集成名称、租户标识应配置在集成详情中与逐条消息的metadata分开管理。八、相关资源编码器函数主文档encoder_fn.md返回值 JSON 结构说明json_output.md实战示例输入msg/metadata/integrationMetadata与完整函数examples/encoder/example1TBEL 版本编码器函数tbel/encoder_fn.md平台侧解析实现AbstractDownlinkDataConverter.java集成侧负载处理AbstractIntegration.java赞分享物联网后端数据可视化消息队列【免费下载链接】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物联网后端数据可视化消息队列EMQX Cassandra 数据桥接指南将 IoT 消息经规则引擎写入 Apache CassandraEMQX Cassandra 数据桥接指南将 IoT 消息经规则引擎写入 Apache Cassandra Apache Cassandra 是一款开源、分布后端物联网消息队列通信self-llm 教程DeepSeek-MoE-16B-Chat 基于 FastAPI 的 API 服务部署与调用实践self llm 教程DeepSeek MoE 16B Chat 基于 FastAPI 的 API 服务部署与调用实践 DeepSeek MoE 16B Ch物联网后端数据可视化消息队列上一篇WarcraftHelper技术实现魔兽争霸III现代化兼容解决方案下一篇WarcraftHelper魔兽争霸III终极优化工具完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

自研音乐播放器:批量下载歌词的极致体验 2026/10/1 18:25:36

自研音乐播放器:批量下载歌词的极致体验

在日常生活中, 我是一个比较喜爱听音乐的人, 因为我的电脑本地存储了上千首音乐文件, 但是绝大多数歌曲都没有歌词信息。因此, 每当我想要跟唱的时候, 往往需要手动地在互联网上进行查找, 再逐一下载LRC格式的歌词文本, 这个过程通常会耗费两三个小时也难以完成。到了后来, 我经…

阅读更多 →
从零开发农业种子商城:Node.js+Vue全栈实践与踩坑复盘 2026/10/1 18:25:36

从零开发农业种子商城:Node.js+Vue全栈实践与踩坑复盘

做农业类电商系统,尤其是种子商城,和普通卖衣服、卖数码的站点完全是两码事。我前阵子用 Node.js 和 Vue 框架从零开发了一套农业种子商城系统,过程中边写边改,从数据库表设计到订单扣库存、再到部署上线,踩了不少坑。…

阅读更多 →
Windows老项目换肤:SkinMagic、Skin++、VCLSkins接入对比与避坑指南 2026/10/1 18:25:10

Windows老项目换肤:SkinMagic、Skin++、VCLSkins接入对比与避坑指南

前阵子整理旧工程,翻出一堆后缀名五花八门的皮肤文件:.smf、.ssk、.skn、.msk,一下子把我拉回当年在 MFC 和 Delphi 里反复折腾 SkinMagic、Skin、VCLSkins 的日子。这三个皮肤库,分别对应我换肤路上的三个阶段:先是用…

阅读更多 →
常用的字符函数和字符串函数 2026/10/1 18:25:09

常用的字符函数和字符串函数

目录一.一个参数的字符函数1.字符分类函数2.字符转换函数二.两个参数 长度不受限的字符串函数1.strcpy函数2.strcat函数3.strcmp函数三.三个参数 长度受限的字符串函数1.strncpy函数2.strncat函数3.strncmp函数四.其他字符串函数1.strstr函数2.strlen函数3.strtok函数4.strerro…

阅读更多 →
类型安全异构容器:Effective Java第33条实战解析 2026/10/1 18:25:03

类型安全异构容器:Effective Java第33条实战解析

做Java时间久了&#xff0c;总会碰到这么一类需求&#xff1a;一个容器想存点“类型各不相同”的东西&#xff0c;取出来的时候又希望还是原来的类型&#xff0c;不要一堆强转&#xff0c;也不要写满instanceof分支。很多人的第一反应是Map<String, Object>&#xff0c;存…

阅读更多 →
PHP8.2接口响应慢怎么定位性能瓶颈 2026/10/1 18:25:02

PHP8.2接口响应慢怎么定位性能瓶颈

前言"某个接口变慢了"是运维反馈里最含糊的一句话。它可能意味着 PHP 代码里有个慢查询&#xff0c;也可能意味着 PHP-FPM 的进程池太小导致请求排队&#xff0c;还可能意味着这个接口调用了一个超时时间设成默认值的第三方服务&#xff0c;而对方今天恰好抖动了一下…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉