2016-05-28 14 views
0

Ich bin ein Student, der MQTT studiert und ich versuche, ein JPG-Bild mit MQTT Mosquitto Broker (Pub und Sub) in Raspberry Pi2 zu senden.Wie kann ich ein Bild mit mosquitto senden?

Ich habe viele Fehler gelöst, funktioniert jedoch nicht.

Das ist mein Python-Code pub.py (modifizierte)

import paho.mqtt.client as mqtt 

def on_publish(mosq, userdata, mid): 
    mosq.disconnect() 

client = mqtt.Client() 
client.connect("test.mosquitto.org", 1883, 60) 
client.on_publish = on_publish 

f=open("b.jpg", "rb") #3.7kiB in same folder 
fileContent = f.read() 
byteArr = bytearray(fileContent) 
client.publish("image",byteArr,0) 

client.loop_forever() 

und es ist sub.py (modifizierte)

import paho.mqtt.client as mqtt 

def on_connect(client, userdata, rc): 
    print("Connect" + str(rc)) 
    client.subscribe("image") 

def on_message(client, userdata, msg): 
    print "Topic : ", msg.topic 
    f = open("/tmp/output.jpg", "w") #there is a output.jpg which is different 
    f.write(msg.payload) 
    f.close() 

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

client.connect("test.mosquitto.org", 1883, 60) 

client.loop_forever() 

Mein Python verson ist 2.7.9.

Nachdem ich einen Fehler gelöst habe, scheint es zu funktionieren, aber es tut es nicht.

Wenn ich die sub.py implementieren, verbindet es erfolgreich, also implementiere ich pub.py in anderen Terminal.

Es gibt jedoch keine Reaktion ohne Verbindungsmeldung, die „Verbindung mit Ergebniscode 0“ ist

Es gibt keine Fehlermeldung, damit ich weiß nicht, was mein Fehler ist.

Mein Code ist falsch? Ich denke es ist in Ordnung.

Es tut mir leid, wenn es nur eine grundlegende Codierung Fähigkeit ist.

Bitte helfen Sie mir, ich brauche deine Hand.

Antwort

2

In sub.py Sie 2 on_public Funktionen haben, die on_connect und on_publish jeweils umbenannt werden soll.

In pub.py müssen Sie tatsächlich die on_publish Methode auf dem Client festlegen, damit es aufgerufen wird, sobald die Veröffentlichung abgeschlossen wurde.

... 
client.connect("test.mosquitto.org", 1883, 60) 
client.on_publish = on_public 
... 

Auch als @ralight in seiner Antwort auf Ihre vorherige Frage wies darauf hin, sollten Sie client.loop(5)-client.loop_forever() ändern wird es noch einmal Ausgang der Meldung wegen der in Ihrem sub.py mosq.disconnect()

+0

Ich recode nach Ihrer Antwort. Es funktioniert jedoch immer noch nicht. Irgendwann funktioniert pub.py nicht für immer. Ist meine Code-Reihenfolge falsch? – ahnstar

+1

Definieren Sie "funktioniert nicht", es funktioniert einfach gut für mich – hardillb

+0

Ich denke schon, wenn ich meinen Code lese ich denke, es gibt keinen logischen oder Syntaxfehler. Es scheint zu wokk tatsächlich Es funktioniert, aber ich sehe keine Thema Nachricht in sub.py Termial, wenn ich pub.py/sub.py implementieren. Ich denke, es veröffentlicht kein Bild. Ich kann nur Verbindungssatz sehen. – ahnstar

1

gesendet wurde Sie benötigen einen Rückruf, der eingehende Nachrichten für Ihr Abonnement behandelt. Der Standardrückruf dafür ist on_message.

Benennen Sie einfach in Ihrem sub.y on_publish(client, userdata, msg) zu on_message(client, userdata, msg) um und vergeben Sie client.on_message = on_message.