通过 MQTT 将图像从 Arduino 发送到 MOSCA 主机

Send Image over MQTT from Arduino to MOSCA host

我想使用 MQTT 将 (jpeg) image-data 从 arduino 发送到 mosca-host。 在 arduino 上我使用 PubSubClient-library。 image-data 存储在 SPI-connected FIFO 中。

Arduino 草图:

size_t len = myMemory.read_fifo_length();
static const size_t bufferSize = 2048;
static uint8_t buffer[bufferSize] = {0xFF};

while (stuff) {
      size_t copy = (stuff < bufferSize) ? stuff : bufferSize;
      myMemory.transferBytes(&buffer[0], &buffer[0], copy);
      client.publish("transfer", &buffer[0], will_copy);
      stuff -= copy;
  }

在 server-side 上,我将 NodeJS 与 mosca 一起使用:

var image;
server.on('published', function(packet, client) {
  if(packet.topic == "transfer")
    image+=packet.payload;

   if (packet.topic == "eof")
    {
         fs.writeFile(client.id+".jpg", image, (err) => {
          if (err) throw err;
         console.log('It\'s saved!');
      });
    }
 });

到达的数据在保存到文件时甚至是正确的JFIF-header但它是垃圾。

有什么建议吗?

PubSubClient 的默认最大数据包大小为 128 字节 (http://pubsubclient.knolleary.net/api.html#configoptions),这限制了您可以发送的消息的大小。

此大小适用于整个 MQTT 消息,因此包括 MQTT header 以及有效负载。

除非您更改了此设置,否则您的 2048 字节缓冲区太大而无法一次发送。

我终于明白了。 我的concat错了,应该是这样的:

 var temp = packet.payload;
 image = Buffer.concat([image,temp]);

有一个

var image = new Buffer(0);

开头。

以防万一有人遇到这个问题。