Node-RED中如何将MQTT接收的字符串数组转为字节数组并发布到Kafka?
解决Node-RED中MQTT字符串数组转字节数组并发送到Kafka的问题
没问题,这个需求完全可以实现!我来给你详细说明两种常见的处理方式,你可以根据实际需求选择:
方式一:直接将字符串数组转换为原始字节数组(MsgPack编码的字节)并发送到Kafka
如果你的目标是把MQTT收到的字符串形式的字节数组,还原成发布端发送的原始MsgPack字节,再直接推送到Kafka,用一个Function节点就能搞定:
- 在Node-RED编辑器里添加一个
Function节点,连接到MQTT订阅节点的输出。 - 在Function节点中写入以下代码:
// 假设msg.payload是你收到的字符串数组(比如[148,147,2,...]) // 把数组里的每个字符串元素转成整数,再创建标准字节数组Uint8Array const rawBytes = new Uint8Array(msg.payload.map(strNum => parseInt(strNum, 10))); // 更新msg.payload为字节数组 msg.payload = rawBytes; // 输出处理后的消息 return msg;
- 把这个Function节点的输出连到Kafka发布节点,配置好目标Kafka主题就行。此时Kafka收到的就是和MQTT发布端完全一致的MsgPack编码字节。
方式二:先转字节数组,再反序列化MsgPack得到原始数据后发送到Kafka
如果你需要先解析MsgPack数据,拿到原始的业务数据(比如JSON对象)再发Kafka,可以在方式一的基础上增加反序列化步骤:
方法A:用现成的Node-RED节点(更省心)
- 打开Node-RED的“管理面板”→“安装”,搜索并安装
node-red-contrib-msgpack节点。 - 把这个
msgpack节点接到方式一中Function节点的输出,它会自动把Uint8Array反序列化为原始的MsgPack数据结构(比如对象、数组)。 - 再把msgpack节点的输出连到Kafka发布节点,此时发送到Kafka的就是解析后的原始业务数据。
方法B:手动在Function节点处理(无需额外节点)
要是不想装新节点,也可以手动引入MsgPack库来处理:
- 先在Node-RED的安装目录下执行命令安装依赖:
npm install msgpack-lite
- 找到Node-RED配置文件
settings.js,修改functionGlobalContext部分,添加允许引入的模块:
functionGlobalContext: { msgpack: require('msgpack-lite') }
- 重启Node-RED后,在Function节点里写入以下代码:
// 获取全局引入的msgpack库 const msgpack = global.get('msgpack'); // 先把字符串数组转成字节数组 const rawBytes = new Uint8Array(msg.payload.map(strNum => parseInt(strNum, 10))); // 反序列化MsgPack得到原始数据 const originalData = msgpack.decode(rawBytes); // 更新payload为原始数据 msg.payload = originalData; return msg;
- 连接到Kafka发布节点就完成发送了。
小提示
- 检查下MQTT节点的配置,别开启自动解析payload的选项(比如“输出解析为JSON”这类),避免后续处理出问题。
- 如果字符串数组里的元素不是纯数字字符串,最好加个格式校验,防止
parseInt转换失败。
内容的提问来源于stack exchange,提问作者user8363477
相关产品推荐
相关产品推荐

