node.js - Nodejs中的mqtt文件传输? (使用 mqtt.js)

标签 node.js mqtt

是的,我正在尝试在nodejs中使用mqtt传输一些文件。 如果文件很小,则此方法可以正常工作,但 6 MB 的 rar 文件在转换为字符串或缓冲区时会变成 21 MB。

我需要了解文件的一些详细信息,例如路径和文件名,因此我创建了一个包含文件缓冲区和我需要的数据的对象。一旦我有了它,我就用 JSON 将其字符串化并可以发送它。

确保为 mqtt 传输获得适当缓冲区大小的最佳方法是什么?

提前致谢。 托马斯

var mqtt = require('mqtt');

var fs = require('fs');
let client
let message
let bufferMessage
let data

function genPayload() {
  data = fs.readFileSync('app.rar');


  let message = {
    "filename": "app.rar",
    "filePath": "C:\\test\\",
    "data": data
  }

  console.log('Preparing File')
  bufferMessage = JSON.stringify(message);

}

function Connect() {
  client = mqtt.connect("mqtt://test.mosquitto.org", {
    clientId: "vfs001"
  });

  client.on('connect', function () {
    console.log('Client Connected')
  });
}

function SendFile() {
  client.publish('TestReplFile', bufferMessage)
  console.log('File is on the way')

};

genPayload();
Connect();
setTimeout(SendFile, 5000);

最佳答案

问题是 fs.readfileSync() 将返回一个 Buffer,当您对其进行字符串化时,它将生成如下所示的内容:

...
data: [ 0x11, 0x44, 0xcf, ... ]
...

这导致文件中的每个字节至少有 4 个字符。

要获得二进制文件的最小 JSON 安全表示形式,您可能需要对其进行 Base64 编码。

function genPayload() {
  data = fs.readFileSync('app.rar');

  let message = {
    "filename": "app.rar",
    "filePath": "C:\\test\\",
    "data": data.toString('base64')
  }

  console.log('Preparing File')
  bufferMessage = JSON.stringify(message);

}

Base64 仍比输入文件大 30% 左右,但它仍应小于直接字符串化缓冲区。

关于node.js - Nodejs中的mqtt文件传输? (使用 mqtt.js),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55904796/

相关文章:

Azure IoT 中心 MQTT 用户名和密码字符长度限制

c - 使用 mosquitto API 实现 mqtt 协议(protocol)

c# - 使用 C# 实现 MQTT 客户端以连接外部 MQTT 代理

node.js - node.js 中json 之后需要调用end 吗?

node.js - NodeJs 击键在控制台中打印两次

javascript - 我可以在 Express POST 请求中进行 DOM 操作吗?

Android Mosquitto - 客户端连接状态

node.js - 使用 --watch 时,node-sass cli 在初始运行时未编译

javascript - 你能将 Jade 渲染为 Html 吗?

javascript - Paho 客户端 Web 套接字找不到 mqtt