Ich habe versucht, MQTT mit Python / Java zu verwenden, also poste ich es. Ich fragte mich, wie ich es machen sollte, wenn ich tatsächlich von einem anderen System aus anrief Dieser Artikel entspricht den folgenden beiden. Wenn Sie dies noch nicht getan haben, lesen Sie bitte zuerst 1.
Python 2.7 Python 3.7
Dies ist aus dem vorherigen Artikel, also schreibe ich es für diejenigen, die es noch nicht installiert haben.
# Mosquitto(Broker)Installieren
$ sudo apt-get install mosquitto
#Installieren Sie den Mosquitto-Client
$ sudo apt-get install mosquitto-clients
Ich werde auch beschreiben, wie die Python- und Java-Clientbibliotheken installiert werden, die beim nächsten Mal verwendet werden. Python Installation der Bibliothek paho
$ pip install paho-mqtt
Es gibt ein offizielles Beispiel.
Der Publisher muss nur jedes Mal zur Verbindung wechseln, daher reicht die folgende Zeile aus. Wenn Sie dies kontinuierlich tun möchten, wiederholen Sie die dritte Zeile.
simplepub.py
import paho.mqtt.publish as publish
publish.single("Themenname", "Nachrichteninhalt", hostname="Hostname")
simplepub_loop.py
import paho.mqtt.publish as publish
import time
i = 0
while True:
time.sleep(3)
i += 1
print(i)
publish.single("testTopic2", i, hostname="localhost")
Der Teilnehmer legt die Rückruffunktion fest und führt die Verarbeitung durch. (Dies ist auch das gleiche wie ROS1)
simplesub.py
import paho.mqtt.subscribe as subscribe
topics = 'test'
def print_msg(client, userdata, message):
print("%s : %s" % (message.topic, message.payload))
while True:
subscribe.callback(print_msg, "test", hostname="localhost")
Starten Sie den Broker auf die gleiche Weise wie Vorheriger Artikel Starten Sie dann den Client.
$ cd C:\Program Files (x86)\mosquitto
$ mosquitto -v
Führen Sie die folgenden Schritte aus. Wenn die veröffentlichte Nachricht auf dem Abonnentenbildschirm angezeigt wird, ist sie erfolgreich.
$ python simple_sub.py
$ python simple_pub.py
Außerdem verfügt der MQTT-Client (paho.mqtt.client
) über einige Standardmethoden.
Es gibt auch ein Implementierungsbeispiel, das jede Methode anstelle nur einer Zeile wie oben beschrieben schreibt.
MQTT mit Python senden und empfangen
Versuch, die MQTT-Bibliothek Paho Python zu verstehen
Das Obige ist ein Implementierungsbeispiel für Pub / Sub allein, aber ROS und OpenRTM usw. Ich wollte es von einem System aus aufrufen, das separat läuft Ich habe sie in einer Klasse zusammengestellt, damit sie leicht als selbst erstelltes Modul gelesen werden können.
Das Folgende ist die Klasse.
Es erbt mqtt.Client
. Eine Referenz finden Sie unter client_sub-class.py von Official GitHub. blob / master / examples / client_sub-class.py).
MQTTClient.py
import paho.mqtt.client as mqtt
import paho.mqtt.publish as publish
import time
class MyMQTTClass(mqtt.Client):
def __init__(self):
super().__init__()
self.recieve_data = ""
self.recieve_time = ""
self.lasttime = ""
def on_connect(self, mqttc, obj, flags, rc):
print("rc: "+str(rc))
def on_message(self, mqttc, obj, msg):
print(msg.topic+" "+str(msg.qos)+" "+str(msg.payload))
self.recieve_time = time.time()
self.recieve_data = (msg.payload).decode()
def run(self, hostname, topic):
self.connect(hostname, 1883, 60)
self.subscribe(topic, 0)
self.loop_start()
rc = 0
return rc
def publish_message(self, host_name, topic, message):
publish.single(topic, message, hostname=host_name)
def isNew(self):
flag = False
if self.lasttime==self.recieve_time: flag = False
else: flag = True
self.lasttime = self.recieve_time
return flag
# If you want to use a specific client id, use
# mqttc = MyMQTTClass("client-id")
# but note that the client id must be unique on the broker. Leaving the client
# id parameter empty will generate a random id for you.
mqttc = MyMQTTClass()
rc = mqttc.run("localhost","testTopic1")
print("rc: "+str(rc))
i=0
while(1):
i+=1
print(i)
mqttc.publish_message("localhost", "testTopic2",i)
if mqttc.isNew(): print(mqttc.recieve_data)
Die Rolle jeder Methode ist wie folgt.
Methodenname | Rolle |
---|---|
on_connect | Methode, die beim Herstellen einer Verbindung zum Broker aufgerufen wird |
on_message | Methode, die beim Empfang einer Nachricht aufgerufen wird(recieve_Ersetzen Sie die empfangene Nachricht durch Daten) |
run | Starten Sie eine Teilnehmerschleife, eine Methode, die von außen aufgerufen wird |
publish_message | Methode zum Veröffentlichen der Nachricht obensimplepub.py Wie es ist |
isNew | Eine Methode, um festzustellen, ob die empfangene Nachricht neu ist |
Eigentlich gibt es in der übergeordneten Klasse eine "Publish ()" - Methode, aber ich dachte, dass dies nur vom Host ausgeführt werden kann, wenn "Connect ()" ausgeführt wird, und ich wollte sie auf diese Weise in eine Klasse einteilen Ich habe es implementiert. Es scheint einen anderen Weg zu geben.
Eine beispielhafte Implementierung unter Verwendung eines Klassenaufrufs ist wie folgt. Legen Sie die Datei im selben Verzeichnis wie MQTTClient.py ab.
sample_mqtt_lient.py
import MQTTClient
mqttc = MQTTClient.MyMQTTClass()
mqttc.run("Hostname","Themenname")
#Nur einmal veröffentlichen
mqttc.publish_message("Hostname", "Themenname","Botschaft")
if(mqttc.isNew()):
print(mqttc.receive_data)
Starten Sie Abonnieren mit mqttc.run ()
und veröffentlichen Sie die Nachricht nur einmal mit mqttc.publish_message ()
.
Außerdem wird die Variable "recieve_data" eingegeben. Da es von der Funktion mqttc.isNew ()
beurteilt wird, ob es abonniert ist, verwenden Sie es wie oben beschrieben als Menge. (Wie Open RTM)
mqttc = MQTTClient.MyMQTTClass()
mqttc.run("Hostname","Themenname")
Die beiden oberen Zeilen sind die Stellen, an denen sie einmal ausgeführt werden, und die folgenden drei Zeilen sind die Bilder, die in die Hauptschleife eingefügt werden sollen.
#Nur einmal veröffentlichen
mqttc.publish_message("Hostname", "Themenname","Botschaft")
if(mqttc.isNew()):
print(mqttc.receive_data)
Ich habe eine Klasse implementiert, die die MQTT-Kommunikation mit Python ermöglicht. Als ich versuchte, es mit ROS zu verwenden, funktionierte es gut, und ich glaube, ich konnte mein Ziel erreichen.