使用paho mqttws31.js接收二进制文件

Receive binary with paho mqttws31.js

本文关键字:二进制文件 js paho mqttws31 使用      更新时间:2023-09-26

我正在使用paho:http://www.eclipse.org/paho/clients/js/lib连接到mqtt代理。但当我通过websocket接收二进制数据时,它会说我的数据格式错误:错误:AMQJS0009E格式不正确的UTF数据:d4-3f。是不是可以用paho mqttws31.js 接收二进制

编辑:不幸的是,我使用了(message.payloadString)来获取收到的消息。但据我所知(https://github.com/i5ting/paho.mqtt.javascript/blob/master/src/mqttws31.js#L2060)也可以使用message.payloadBytes.

所以实际上我发送的是Double,每个都有8字节。如何在message.payloadBytes中访问它们?

Thx。

您可能想看看这个:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays

由此看来,你应该能够做这样的事情:

var payload = message.payloadByte()
var doubleView = new Float64Array(payload);
var number = doubleView[0];

这假设消息的有效载荷是单个64位IEEE浮点数

另一个可能的选择是看看前面这个问题的答案:

JS 中浮点的读/写字节

编辑:

以下代码适用于我:

function onMessageArrived(message) {
  var payload = message.payloadBytes
  var length = payload.length;
  var buffer = new ArrayBuffer(length);
  uint = new Uint8Array(buffer);
  for (var i=0; i<length; i++) {
      uint[(length-1)-i] = payload[i];
  }
  var doubleView = new Float64Array(uint.buffer);
  var number = doubleView[0];
  console.log("onMessageArrived:"+number);
};

请注意,我必须颠倒字节顺序才能得到正确的输出。

编辑2

这样做效果更好,可以解码任意长度的双打数组:

function onMessageArrived(message) {
  var payload = message.payloadBytes
  var length = payload.length;
  var buffer = new ArrayBuffer(length);
  uint = new Uint8Array(buffer);
  for (var i=0; i<length; i++) {
      uint[i] = payload[i];
  }
  var dataView = new DataView(uint.buffer);
  for (var i=0; i<length/8; i++) {
      console.log(dataView.getFloat64((i*8), false));
  }
};

(您可能需要在dataView.getFloat64()的末尾将false翻转为true,具体取决于发送平台的端序)

我为走到这一步而写的代码的完整内容可以在这里找到:http://www.hardill.me.uk/wordpress/2014/08/29/unpacking-binary-data-from-mqtt-in-javascript/