2016-05-28 13 views
0

Ich schrieb ein einfaches Python-Programm zum Verbinden von RabbitMqtt Server und hoffe, eine Warteschlange zu generieren und Nachrichten zu veröffentlichen. Nach dem Erstellen der Verbindung und dem Erstellen einer Warteschlange wurde die Nachricht jedoch nicht erfolgreich veröffentlicht (wenn ich die Informationen der Nachricht überprüfe, kann ich keine Datensätze und Daten finden). Ich frage mich, ob ich einige Parameter oder Einstellungen in client.publish() vermisse, aber ich weiß nicht, wie ich es herausfinden soll.Veröffentlichen Sie Daten auf RabbitMQ-Server über Mqtt

import paho.mqtt.client as mqtt 


# The callback for when the client receives a CONNACK response from the server. 
def on_connect(client, userdata, flags, rc): 
    print("Connected with result code " + str(rc)) 

    # Subscribing in on_connect() means that if we lose the connection and 
    # reconnect then subscriptions will be renewed. 
    client.subscribe('SEEDQ') 
    client.publish('SEEDQ', 'deqwdqwefqwefwefqwefqwe', 0, False) 

# The callback for when a PUBLISH message is received from the server. 
def on_message(client, userdata, msg): 
    print(msg.topic + " " + str(msg.payload)) 


client = mqtt.Client() 
client.on_connect = on_connect 
client.on_message = on_message 

client.connect("15.78.xx.xx", 1883, 60) 

client.loop_forever() 
+0

Sie veröffentlichen also zum Thema SEEDQ? Sie erhalten keine Nachricht zu einem Thema, es sei denn, Sie abonnieren das Thema, haben Sie das getan? – barny

+0

Ja, ich hoffe, zum Thema SEEDQ zu veröffentlichen. Soll ich nämlich meinen Code in client.subscribe ('SEEDQ') und client.publish ('SEEDQ', 111, 0, False) ändern? Danke – QuickLearner

+0

Ja, muss abonnieren, um Nachrichten zu empfangen, – barny

Antwort

0

Das Problem ist, dass Sie client.publish anrufen(), bevor die Verbindung abgeschlossen ist. Verschieben Sie client.publish in die on_connect-Funktion, NACH clientsubscribe ('SEEDQ'), und es wird funktionieren.

# The callback for when the client receives a CONNACK response from the server. 
def on_connect(client, userdata, flags, rc): 
    print("Connected with result code "+str(rc)) 

    # Subscribing in on_connect() means that if we lose the connection and 
    # reconnect then subscriptions will be renewed. 
# client.subscribe("$SYS/#") 
    client.subscribe('SEEDQ') 
    client.publish('SEEDQ', 111, 0, False) 

Ausgang:

Connected with result code 0 
SEEDQ 111 

FYI ich den öffentlichen Testserver bei iot.eclipse.org verwendet, Port 1883.

FYI gibt es einen sehr nützlichen Browser-Client HERE -verwenden diese und der öffentliche testserver messagesight.demos.ibm.com port 1883 du kannst SEEDQ abonnieren und deine python-script-veröffentlichung sehen, und auch den browser-client verwenden, den du in SEEDQ von deinem browser veröffentlichen kannst und dein script zeigt die nachricht an, während sie sich befindet der loop_forever(). Offensichtlich ist die Verwendung dieser Testserver öffentlich sichtbar.

UPDATE hier ist der vollständige Code - das funktioniert gegen die öffentlichen Server, die ich oben zeige.

import paho.mqtt.client as mqtt 

# The callback for when the client receives a CONNACK response from the server. 
def on_connect(client, userdata, flags, rc): 
    print("Connected with result code "+str(rc)) 

    # Subscribing in on_connect() means that if we lose the connection and 
    # reconnect then subscriptions will be renewed. 
# client.subscribe("$SYS/#") 
    client.subscribe('SEEDQ') 
    client.publish('SEEDQ', 111, 0, False) 


# The callback for when a PUBLISH message is received from the server. 
def on_message(client, userdata, msg): 
    print(msg.topic+" "+str(msg.payload)) 

client = mqtt.Client() 
client.on_connect = on_connect 
client.on_message = on_message 

#client.connect('15.xx.xx.xx', 1883, 60) 
#client.connect("iot.eclipse.org", 1883, 60) 
client.connect("messagesight.demos.ibm.com", 1883, 60) 

#client.publish('SEEDQ', 111, 0, False) 

# Blocking call that processes network traffic, dispatches callbacks and 
# handles reconnecting. 
# Other loop*() functions are available that give a threaded interface and a 
# manual interface. 
client.loop_forever() 
+0

Danke, ich habe den client.publish in die on_connect-Funktion verschoben, der RabbitMqtt zeigt aber immer noch an, dass es keine Nachricht gibt. Ich poste die Codes wie folgt. – QuickLearner

+0

Sie können und sollten Ihre Frage bearbeiten, um Ihren überarbeiteten Code anzuzeigen, anstatt eine neue Antwort zu erstellen. – barny

+0

Nochmals vielen Dank für Ihre Hilfe. Der zweite HERE-Link ist Netzwerkfehler. – QuickLearner