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

问题描述:

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

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

所以实际上我发送双打,每个有8bytes。 如何在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浮点数

另一种可能的选择是查看此前的答案提问:

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); 
}; 

注意,我必须扭转字节顺序以获得正确的输出。

EDIT 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结束( )根据发送平台的字节序)

我写获取代码的

全写了这一步可以在这里找到:http://www.hardill.me.uk/wordpress/2014/08/29/unpacking-binary-data-from-mqtt-in-javascript/

+0

好吧,我想这是以下问题:我想将Uint8Array [256]转换为浮点数组,每个元素有8个字节的长度。所以它是一个长度为32个值(256/8)的数组,每个值都是8字节的Double/Float。 – 2014-08-29 16:58:20

+0

非常感谢。这是本地网络内优化的一部分,我获得了20-30%的性能提升。因为与JSON.strinify(数据)相比,它大约是数据发送二进制文件的一半,对于在互联网上传输的大量数据可能非常好。不过,我不知道这个代码是否可以优化,因为它是两个for循环并保留两倍的内存。 – 2014-08-30 10:43:24

+0

所以我想这是接收数据最有效的方法? – 2014-09-02 19:45:48