2016-09-29 168 views
1

我正在开发一个网站,它可以连接到一个mqtt代理并获取有效负载消息。Paho JavaScript mqtt压缩负载

我使用的库是(https://eclipse.org/paho/clients/js/)。

我的问题是以下。当我尝试获得标准压缩消息(gzipped)时,库会抛出异常“错误:AMQJS0009E格式错误的UTF数据:f5 3 -52。”

如何处理压缩的消息?

这里是我的代码:

var selected_tags = ''; 
var checked_tags = []; 

var hostname  = 'xxx'; 
var port   = 80; 
var qos    = 1; 

var user   = 'xxx'; 
var pass   = 'xxx'; 

var keepAlive  = 60; 
var timeout   = 3; 
var ssl    = false; 
var cleanSession = true; 
var lastWillTopic = ''; 
var lastWillQos  = 1; 
var lastWillRetain = false; 
var lastWillMessage = ''; 
var g_topic; 
var client = new Messaging.Client(hostname, port, "myclientid_" + parseInt(Math.random() * 100, 10)); 

var options = { 
    timeout    : 3, 
    userName   : user, 
    password   : pass, 
    keepAliveInterval : keepAlive, 
    cleanSession  : cleanSession, 
    useSSL    : ssl, 
    onSuccess   : function() { 
     console_log('<span style="color:green">Connected</span>'); 
    }, 
    onFailure   : function (message) { 
     console_log('<span style="color:red">Connection failed: ' + message.errorMessage + '</span>'); 
     client.connect(options); 
    } 
}; 
function _subscribe(){ 
    g_topic = $("#sel_reader").val(); 
    console_log('<span style="color:green">subscribe to: ' + g_topic + '</span>'); 
    client.subscribe(g_topic, {qos: qos}); 
    $("#_subscribe").addClass('hide'); 
    $("#_unsubscribe").removeClass('hide'); 
} 
function _unsubscribe(){ 
    console_log('<span style="color:red">unsubscribe from: ' + g_topic + '</span>'); 
    client.unsubscribe(g_topic); 
    $("#_subscribe").removeClass('hide'); 
    $("#_unsubscribe").addClass('hide'); 
} 
client.onConnectionLost = function (responseObject) { 
    console_log('<span style="color:red">Connection lost: ' + responseObject.errorMessage + '</span>'); 
    client.connect(options); 
}; 
client.onMessageArrived = function (message) { 
    // console.log("message arrived"); 

    var live_search = []; 
    var live_found = ''; 
    var json = JSON.parse(message.payloadString); 

    console_log('<hr />Message Recieved: Topic: ' + message.destinationName + '<br />' 
        +message.payloadString + 
       '. QoS: ' + message.qos 
    ); 

}; 
var publish = function (payload, topic, qos) { 
    var message = new Messaging.Message(payload); 
    message.destinationName = topic; 
    message.qos = qos; 
    client.send(message); 
} 
function console_log(txt){ 
    $("#console").append('<b>'+txt + "</b><br />"); 
} 
var prev_imei = ''; 
var find = ':'; 
var re = new RegExp(find, 'g'); 
function SortByRssi(a, b){ 
    var arssi = a.rssi; 
    var brssi = b.rssi; 
    return ((arssi > brssi) ? -1 : ((arssi < brssi) ? 1 : 0)); 
} 
$(document).ready(function(){ 
    client.connect(options); 
}); 
+0

编辑,以显示你正在使用 – hardillb

回答

0

OK,所以没有建在MQTT或泛美卫生组织JavaScript客户端gzip压缩的有效载荷的处理。

这意味着当您的代码运行时,它会尝试将gzip流解析为UTF-8字符串。

client.onMessageArrived = function (message) { 
    // console.log("message arrived"); 

    var live_search = []; 
    var live_found = ''; 
    var json = JSON.parse(message.payloadString); 

    console_log('<hr />Message Recieved: Topic: ' + message.destinationName + '<br />' 
        +message.payloadString + 
       '. QoS: ' + message.qos 
    ); 
}; 

首先,您需要使用原始字节而不是消息的字符串形式。您可以访问message.payloadBytes字段中的原始字节。

现在你有实际解压的问题。这个较旧的question看起来会有帮助。

client.onMessageArrived = function (message) { 
    // console.log("message arrived"); 

    var live_search = []; 
    var live_found = ''; 
    var compressedJSON = message.payloadBytes; 
    var json = pako.inflate(compressedJSON); 
    console.log('<hr />Message Recieved: Topic: ' + message.destinationName + '<br />' 
       + json + 
      '. QoS: ' + message.qos 
    ); 
}; 
+0

非常感谢你的比赛你的答案:) –

0

万一有人需要Python的答案:

import zlib 

def _on_message(self, mqttc, obj, msg): 
    dec_msg = zlib.decompress(msg.payload) 
    # do whatever you need with dec_msg 
    print dec_msg 
+0

代码考虑从问题的语言提供asnwers问题标签 - 您的代码_may_或_may不会对问题作者有用。 – fen1x

+0

问题是关于使用在浏览器中运行的Paho Javascript客户端,所以这并不回答 – hardillb

+0

我同意你的看法,但另一方面,当我正在寻找python的答案时,我找不到任何东西。谷歌把我带到这个话题,所以也许有一天有人也会在这里找到它。 – Tomasz