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

时间:2014-08-28 11:25:30

标签: javascript optimization binary mqtt paho

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

接收二进制文件

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

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

THX。

1 个答案:

答案 0 :(得分:3)

你可能想看看这个:

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浮点数

另一种可能的选择是查看上一个问题的答案:

Read/Write bytes of float in 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/