2016-09-29 5 views
1

Ich entwickle eine Website, die mit einem mqtt-Broker verbinden und Nutzlastnachrichten erhalten kann.Paho Javascript mqtt komprimierte Nutzlast

Die Bibliothek, die ich verwende, ist (https://eclipse.org/paho/clients/js/).

Mein Problem ist das folgende. Wenn ich versuche, eine standardkomprimierte Nachricht (gziped) zu erhalten, löst die Bibliothek eine Ausnahme aus: "Fehler: AMQJS0009E Fehlerhafte UTF-Daten: f5 3 -52."

Wie kann ich mit komprimierten Nachrichten umgehen?

hier ist mein Code:

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

Bearbeiten Sie die Frage um den Code zu zeigen Ihnen – hardillb

Antwort

0

OK, so dass es keine in Umgang mit gzip komprimiert Nutzlasten in MQTT gebaut oder Paho Javascript-Client.

Das bedeutet, wenn der Code ausgeführt wird, versucht er, einen gzip-Stream als UTF-8-Zeichenfolge zu analysieren.

Um mit zu beginnen, müssen Sie mit den rohen Bytes nicht die Zeichenfolgenform der Nachricht arbeiten. Sie können auf die Rohbytes aus dem Feld message.payloadBytes zugreifen.

Jetzt haben Sie das Problem, es tatsächlich zu dekomprimieren. Diese ältere question sieht aus, als würde es helfen.

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

Danke sehr Spiel verwenden für Ihre Antwort :) –

0

Falls jemand die Antwort für Python braucht:

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

Betrachten asnwers in Sprache von Leistung erbringenden Tags - Ihr Code _may_ oder _may not_ kann für den Autor der Frage nützlich sein. – fen1x

+0

Die Frage ist über die Arbeit mit dem Paho Javascript-Client im Browser ausgeführt, so dass dies nicht die Frage beantwortet – hardillb

+0

Ich stimme Ihnen zu, aber andererseits, wenn ich auf der Suche nach der Antwort für Python, konnte ich nichts finden . Google bringt mich zu diesem Thema, vielleicht findet es eines Tages auch hier. – Tomasz

Verwandte Themen