
物联网后端数据可视化消息队列【免费下载链接】thingsboardAll-in-one IoT Platform - Device management, data collection, processing and visualization.项目地址https://gitcode.com/GitHub_Trending/th/thingsboard点击查看免费下载本文围绕 ThingsBoard 官方帮助文档中Simple CSV 解码器示例含 payload 输入、Decoder 函数 与 Output 输出 三个组成部分展开完整讲解如何在 Uplink Data Converter 中将最原始的文本TEXT报文逐字节解码、按分隔符切分、构造平台统一数据格式的完整链路。读完本文你将掌握decodeToString辅助函数的原理、CSV 字段到deviceName/telemetry的映射写法以及 ThingsBoard 对解码器返回值输出契约的硬性要求可以直接复制到自己的集成Integration中进行改造与复用。一、示例全景一个 CSV 解码器由三部分组成在 ThingsBoard 的集成配置中Uplink Data Converter 的 JS 编辑器里可以查看官方内置示例。每个示例由三个文档共同组成一个闭环组成部分文档路径作用输入报文Payloadsimple-csv/payload.md模拟设备上报的原始 CSV 文本解码函数Decodersimple-csv/decoder_fn.md负责解析的 JavaScript 函数期望输出Outputsimple-csv/output.md解码后平台统一认识的 JSON 结果本示例对应的内容类型Content type为 TEXT在官方示例总表见 converter/decoder_fn.md 中的 Examples 表格中被标注为 Simple CSV – Parse CSV data与 Simple JSON、Simple binary data、JSON with multiple hex encoded values、Use metadata fields 并列是入门数据转换最典型的用例之一。二、输入报文最朴素的 CSV 文本官方给出的原始报文只有一行、三个字段以英文逗号分隔SN-111,36.6,70 {:copy-code}三个字段的含义在解码函数中一目了然SN-111设备序列号本示例中直接用作deviceName36.6温度temperature浮点数70湿度humidity整数。要点在于集成收到的 payload 永远是 byte array字节数组无论它是 JSON、TEXT 还是 Binary(Base64)Content type 只是存储调试事件时的提示并不影响解码函数的执行参见 converter/decoder_fn.md 对payload参数的说明。因此拿到 CSV 文本后第一步永远是把字节数组还原成字符串。三、解码函数逐步拆解官方解码函数全文如下我们将逐行分析// decode payload to string. See helper function below var str decodeToString(payload); // split the string to an array of strings using , delimiter var csv str.split(,); // Construct result object with time-series data var result { deviceName: csv[0], deviceType: Thermostat, deviceLabel: Kitchen Thermostat, telemetry: { temperature: parseFloat(csv[1]), humidity: parseFloat(csv[2]), } }; /** Helper function to decode raw payload bytes to string**/ function decodeToString(payload) { return String.fromCharCode.apply(String, payload); } return result; {:copy-code}3.1 第一步把字节数组还原为字符串payload是一个 byte array示例中通过自带的辅助函数完成还原function decodeToString(payload) { return String.fromCharCode.apply(String, payload); }String.fromCharCode.apply(String, payload)将字节数组中的每一个数值映射为对应的 ASCII 字符并拼接成字符串于是[83, 78, 45, ...]就变回了SN-111,36.6,70。在通用解码模板 js-decoder.raw 中同样保留了decodeToString与基于它实现的decodeToJsonJSON.parse(str)这组辅助函数是官方推荐的基础设施。3.2 第二步按逗号切分字段var csv str.split(,);split(,)把SN-111,36.6,70切成[SN-111, 36.6, 70]此时所有字段仍是字符串。3.3 第三步构造结果对象var result { deviceName: csv[0], deviceType: Thermostat, deviceLabel: Kitchen Thermostat, telemetry: { temperature: parseFloat(csv[1]), humidity: parseFloat(csv[2]), } };deviceName取csv[0]即序列号SN-111。平台会按该名称在租户范围内查找设备找不到且集成开启了 Allow to create devices or assets 时自动创建设备deviceType写死为Thermostat这是设备类型示例中由解码器静态指定deviceLabel提供非唯一的、面向仪表盘展示的友好名称Kitchen Thermostattelemetry中使用parseFloat将字符串36.6、70转成数值型时间序列数据。3.4 第四步返回结果最后return result;将对象交给平台进一步处理。解码器签名约定为function Decoder(payload, metadata): object | object[]即既可以返回单个对象也可以返回对象数组用于一次处理多台设备/多个数据点。四、解码器输出契约平台对返回值的硬性要求官方 converter/decoder_fn.md 对返回值有明确约束Simple CSV 示例正是对该契约的完整实践必须包含deviceNamedeviceType或assetNameassetType二者取一即可用于在租户范围内定位或按需创建设备/资产可选attributes对象服务器端属性如序列号这类标识性字段可选telemetry对象/数组设备的时间序列数据可选customerName自动将新创建的设备分配给客户已存在设备时忽略可选groupName自动将新创建的设备加入实体组默认租户范围若同时给出customerName则在该客户范围内可选deviceLabel/assetLabel非唯一友好标签仅在新实体创建时生效。本示例的输出为{ deviceName: SN-111, deviceType: Thermostat, deviceLabel: Kitchen Thermostat, telemetry: { temperature: 36.6, humidity: 70 } } {:copy-code}可见它完整满足了 deviceName deviceType 必须成对出现 的最低要求并额外提供了deviceLabel与telemetry结构清晰、可直接套用。五、应用场景哪些集成会用到 TEXT/CSV 解码从 converter/decoder_fn.md 对payload的说明可以推断本示例的适用边界HTTP 集成与 CoAP 集成会根据请求头判断内容是 JSON、TEXT 还是 BINARY因此接收 CSV 文本报文时 Content type 会命中 TEXT正好与本示例对应MQTT 集成在 MQTT 3.x 之前发布消息没有 content-type 概念payload 一律视为 BINARY此时decodeToString同样能把字节还原成 CSV 文本再走split(,)流程而 SigFox、LORIOT、ChirpStack、The Things Stack 等集成通常直接产出 JSON包装了 RSSI、SNR 等元数据CSV 场景下并不会出现这种包装。六、实战扩展从单行到多字段理解了三步走还原字符串 → 切分 → 构造结果之后可以按需扩展。例如设备上报了带时间戳的多行 CSV可将解码函数改造为数组输出var str decodeToString(payload); var lines str.split(\n); var result []; for (var i 0; i lines.length; i) { var csv lines[i].split(,); result.push({ deviceName: csv[0], deviceType: Thermostat, telemetry: { ts: parseInt(csv[1]), // 毫秒级 Unix 时间戳 values: { temperature: parseFloat(csv[2]), humidity: parseFloat(csv[3]) } } }); } return result;需要注意平台期望时间戳为毫秒级 Unix 时间戳否则将使用服务器时间参见 converter/decoder_fn.md 对 Output with custom timestamp 的说明。该写法与官方json_array_output示例中 输出可以是多个设备/资产的数组 的约定保持一致。若要进一步把字段分派为属性而非遥测可参考通用模板 js-decoder.raw 中attributeKeyListtoFlatMap的写法它对嵌套对象做扁平化并支持排除键列表是从示例走向生产环境的常用升级路径。七、可验证依据与延伸阅读输入/函数/输出三个文档simple-csv/payload.md、simple-csv/decoder_fn.md、simple-csv/output.md解码器完整契约与示例总表converter/decoder_fn.md通用解码模板含decodeToString/decodeToJson/toFlatMapjs-decoder.rawTBELThingsBoard Expression Language版本的对应示例位于 converter/tbel/examples/decoder/simple-csv/decoder_fn.md底层工具函数定义见 tbel-utils.models.ts。八、常见踩坑提醒忘记还原字节数组直接对payload调用split会得到非预期结果任何内容类型都必须先经decodeToString或decodeToJson转换数值仍为字符串telemetry中建议使用parseFloat/parseInt避免平台侧类型推断偏差缺少deviceType仅返回deviceName而不给deviceType或 asset 对不满足输出契约设备可能无法按预期创建CSV 字段含逗号本示例假设字段不含分隔符或引号生产环境遇到带引号的 CSV 需要自行增强解析如逐字符扫描引号状态示例本身以简单为设计目标。综上Simple CSV 示例是理解 ThingsBoard 解码器输入字节流 → 统一 JSON这一核心抽象的最佳入门材料。将它与通用模板、官方契约说明结合阅读即可快速上手绝大多数基于文本协议设备的数据接入工作。赞分享物联网后端数据可视化消息队列【免费下载链接】thingsboardAll-in-one IoT Platform - Device management, data collection, processing and visualization.项目地址https://gitcode.com/GitHub_Trending/th/thingsboard点击查看免费下载相关推荐深入解析oneTBB示例代码并行编程实战指南深入解析oneTBB示例代码并行编程实战指南 前言 Intel oneAPI Threading Building Blocks oneTBB 是一个广受欢迎并发编程高性能计算深入理解ldapjs项目从入门到实战示例解析深入理解ldapjs项目从入门到实战示例解析 前言 LDAP轻量级目录访问协议是企业级应用中常用的目录服务协议而ldapjs则是Node.js环境下实现后端网络与通信oauth4cj授权码模式完全教程以Gitee为例详解OAuth2.0标准工作流oauth4cj授权码模式完全教程以Gitee为例详解OAuth2.0标准工作流 oauth4cj 是一款基于Cangjie语言开发的开源OAuth开放授权协认证鉴权上一篇WeKnora Docker 部署实战10 分钟上线一个私有 RAG 知识库下一篇IDENTITY and PURPOSE创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考