【问题标题】:Receive binary with paho mqttws31.js使用 paho mqttws31.js 接收二进制文件
【发布时间】:2014-08-28 11:25:30
【问题描述】:

我正在使用 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。

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

谢谢。

【问题讨论】:

    标签: javascript optimization binary mqtt paho


    【解决方案1】:

    你可能想看看这个:

    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/

    【讨论】:

    • 好的,我认为这是以下问题:我想将 Uint8Array[256] 转换为浮点数组,每个元素的长度为 8 字节。所以它是一个长度为 32 个值(256/8)的数组,每个值是一个 8 字节的 Double/Float。
    • 非常感谢。这是本地网络优化的一部分,我获得了 20-30% 的性能提升。因为与 JSON.strinify(data) 相比,它大约是发送二进制数据的一半,对于在 Internet 上传输的大量数据可能非常好。但是我想知道这段代码是否也可以优化,因为它有两个 for 循环并保留两倍的内存量。
    • 所以我猜这是接收数据的最有效方式?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多