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

时间:2016-06-15 14:14:42

标签: javascript node.js arduino mqtt mosca

我想使用MQTT将(jpeg)图像数据从arduino发送到mosca主机。 在arduino上我使用PubSubClient-library。图像数据存储在SPI连接的FIFO中。

Arduino Sketch:

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;
  }

在服务器端,我使用带有mosca的NodeJS:

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标题,也是它的垃圾。

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

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

此大小适用于整个MQTT消息,因此包括MQTT标头和有效负载。

除非你改变了这个,否则2048字节的缓冲区太大而无法一次发送。

答案 1 :(得分:0)

最后我明白了。 我的结论错了,它应该是这样的:

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

var image = new Buffer(0);

一开始。

以防任何人遇到此问题。