在 mqttjs 中发布多个缓冲区

Publishing multiple buffers in mqttjs

所以我想通过 mqtt 从 NodeJs 脚本向我的 mosquitto 服务器发送一些字节。为此,我正在使用客户端库 MQTT.js。要发送原始数据,该库支持缓冲区(也支持字符串)。

在我尝试连续发布多个字节(缓冲区)之前,所有这些都工作得很好。这将始终导致只发布最后一个缓冲区但多次。当我将相同的缓冲区记录到控制台而不是使用 mqttjs 时,我得到了预期的结果(从 0xfa 增加到 0xff)。但是,连续发布普通字符串没有问题。这种行为对我来说是莫名其妙的。

不太确定这是 mqttjs 的问题,还是我太笨了。由于我没有发现任何相关问题,希望对我做错的事情进行简短的解释。

var buf = Buffer.from([0xfa]);

client.on('connect', function () {
  client.subscribe('LED', function (err) {
    if (!err) {
      for (; buf[0] < 0xff; buf[0]++) {
        client.publish('LED', buf);
      }
    }
  })
})

预期消息(记录到控制台 而不是 发布的结果):

<Buffer fa>
<Buffer fb>
<Buffer fc>
<Buffer fd>
<Buffer fe>

蚊子收到的消息:

<Buffer ff>
<Buffer ff>
<Buffer ff>
<Buffer ff>
<Buffer ff>

我的一个有趣发现。如果将发布放在循环之前 (buf[0] = 0xfa):

client.publish('LED', buf)
for (; buf[0] < 0xff; buf[0]++) {;}

输出仍然是:

<Buffer ff>

NodeJS 是一种通过引用传递的语言,这意味着发布方法始终在缓冲区对象的同一个实例上工作。您只是将对同一结构的引用传递给发布方法。

在这种情况下,for 循环 运行 比客户端发送消息的速度更快,因此当它真正将缓冲区的内容打包到消息中时,它已经更新为 0xff

您需要为要发送的每条消息创建新的缓冲区对象(或克隆现有值)。