[MQTT / Python] Implementierte eine Klasse, die Pub / Sub von MQTT in Python ausführt

Einführung

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.

  1. [MQTT] Einführung von MQTT auf Befehlsbasis (vorherige)
  2. [Python] Implementierte eine Klasse, die Pub / Sub von MQTT in Python ausführt (dieser Artikel)
  3. [Java] Implementierte eine Klasse, die Pub / Sub von MQTT in Java ausführt (nächstes Mal)
  4. [ROS] Implementierte einen Knoten für die MQTT-Kommunikation (nacheinander)

Betriebsumgebung

Python 2.7 Python 3.7

Bibliothek, Broker-Installation

Dies ist aus dem vorherigen Artikel, also schreibe ich es für diejenigen, die es noch nicht installiert haben.

Bibliothek, Broker-Installation
### 1. Für Windows Bitte laden Sie das Installationsprogramm entsprechend Ihrer Umgebung von "Binäre Installation" ⇒ "Windows" auf der folgenden Site herunter. https://mosquitto.org/download/ ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426354/e6ec1314-653b-3dd2-31d7-dc1619f14f1f.png) ### 2. Für Linux Führen Sie die folgenden zwei Befehle aus.
# Mosquitto(Broker)Installieren
$ sudo apt-get install mosquitto

#Installieren Sie den Mosquitto-Client
$ sudo apt-get install mosquitto-clients

Installation der Client-Bibliothek

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

MQTT-Kommunikation mit Python

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")

Lauf

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

MQTT-Kommunikationsklasse

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.pyWie 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.

Anwendungsbeispiel

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)

abschließend

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.

Recommended Posts

[MQTT / Python] Implementierte eine Klasse, die Pub / Sub von MQTT in Python ausführt
Einfache Pub / Sub-Programmhinweise in Python
Eine Klasse, die häufig verwendete Methoden in Twitter API (Python) zusammenfasst.
Generieren Sie eine erstklassige Sammlung in Python
Ein einfacher HTTP-Client, der in Python implementiert ist
Generieren Sie eine Klasse aus einer Zeichenfolge in Python
Ein Memo, das ich schnell in Python geschrieben habe
[Python / Tkinter] Eine Klasse, die einen scrollbaren Frame erstellt
Ich habe eine Klasse in Python3 und Java geschrieben
Ein Programm, das doppelte Anweisungen in Python entfernt
Python: Erstellen Sie eine Klasse, die entpackte Zuweisungen unterstützt
Ich habe versucht, eine Klasse zu erstellen, mit der Json in Python problemlos serialisiert werden kann
Fallklasse in Python
SimRank in Python implementiert
Klassennotation in Python
Shiritori in Python implementiert
Schlüsseleingabe, die nicht auf Schlüsseleingabe in Python wartet
Was ist in dieser Variablen (wenn das Python-Skript ausgeführt wird)?
Erstellen Sie in Python einen Dekorator, der Argumente dynamisch akzeptiert. Erstellen Sie einen Dekorator
Ich habe einen Vim-ähnlichen Ersetzungsbefehl in Slackbot #Python implementiert
MALSS (Einführung), ein Tool, das maschinelles Lernen in Python unterstützt
Was bedeutet das letzte () in einer Funktion in Python?
Machen Sie einen Screenshot in Python
Python-Programm von "Buch, das schwieriges Programmieren leicht lehrt"
Ein Allzweckprogramm, das Linux-Befehlszeichenfolgen mit Python formatiert
Erstellen Sie eine Funktion in Python
Erstellen Sie ein Wörterbuch in Python
Eine Funktion, die iterable in Python in N Teile unterteilt
Durchlaufen Sie einen Generator, der einen Datumsiterator in Python zurückgibt
Verwendung der Methode __call__ in der Python-Klasse
Erstellen wir ein Skript, das sich bei Ideone.com in Python registriert.
Ich habe versucht, "ein Programm, das doppelte Anweisungen in Python entfernt"
Erstellen Sie ein Lesezeichen in Python
Erstellen Sie den Code, der in Python "A und vorgeben B" ausgibt
Ich habe eine Klasse in Python erstellt und versucht, Enten zu tippen
Implementierte Supreme Solver in Python 3
Zeichne ein Herz in Python
Eine Reihe von Skriptdateien, die Wordcloud mit Python3 ausführen
Erstellen Sie eine Instanz einer vordefinierten Klasse aus einer Zeichenfolge in Python
Spielen Sie Sounds in Python ab, vorausgesetzt, die Tastatur ist eine Klaviertastatur
Ein Memo, das doppelte Anführungszeichen in voller Breite mit regulären Python-Ausdrücken verarbeitet
Verwenden Sie networkx, eine Bibliothek, die Diagramme in Python verarbeitet (Teil 2: Lernprogramm).
Einfach! Implementieren Sie einen Twitter-Bot, der auf Heroku in Python ausgeführt wird
[Python / Django] Erstellen Sie eine Web-API, die im JSON-Format antwortet
Ein Datensatz, den GAMEBOY mit Python nicht erstellen konnte. (PYBOY)
Über psd-tools, eine Bibliothek, die psd-Dateien in Python verarbeiten kann
Eine Funktion, die die Verarbeitungszeit einer Methode in Python misst
Ein Programm, das bestimmt, ob eine in Python eingegebene Zahl eine Primzahl ist
Python-Spezialcodec, der zu wissen scheint, aber nicht weiß
Was in datetime neu ist, ist in Python 3 etwas nützlicher
[Python] Ich habe eine Klasse erstellt, die schnell einen Dateibaum schreiben kann
Wahrscheinlich in einer Nishiki-Schlange (Originaltitel: Vielleicht in Python)
Schreiben Sie eine Dichotomie in Python
[Python] Verwalten Sie Funktionen in einer Liste
Drücken Sie einen Befehl in Python (Windows)
Implementierte Bildsegmentierung in Python (Union-Find)
In Python-Klassenvariablen versteckte Landminen
Erstellen Sie einen DI-Container mit Python
Zeichnen Sie eine Streudiagrammmatrix mit Python