通过 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);
开头。
以防万一有人遇到这个问题。
我想使用 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);
开头。
以防万一有人遇到这个问题。