我想使用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标题,也是它的垃圾。
有什么建议吗?
答案 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);
一开始。
以防任何人遇到此问题。