1

私は paho: http://www.eclipse.org/paho/clients/js/ lib を使用して mqtt-broker に接続しています。しかし、websockets 経由でバイナリ データを受信すると、データの形式が正しくないと表示されます: Error: AMQJS0009E Malformed UTF data:d4 -3f 。. paho mqttws31.js でバイナリを受信できないのでしょうか

編集: 残念ながら、受信したメッセージを取得するために (message.payloadString) を使用しました。しかし、私が理解できる限り ( https://github.com/i5ting/paho.mqtt.javascript/blob/master/src/mqttws31.js#L2060 )、message.payloadBytes も使用できます。

つまり、実際には、それぞれが 8 バイトの Double を送信しています。message.payloadBytes 内でそれらにアクセスするにはどうすればよいですか?

どうも。

4

1 に答える 1

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 浮動小数点数であることを前提としています。

他の可能なオプションは、この前の質問に対する答えを見ることです:

JS で float のバイトを読み書きする

編集:

次のコードは私にとってはうまくいきます:

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

これはうまく機能し、double の配列の任意の長さをデコードします。

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 /

于 2014-08-29T08:22:13.820 に答える