J'ai essayé d'utiliser MQTT avec Python / Java, donc je le poste. J'ai essayé de le faire en appelant d'un autre système Cet article correspond aux deux suivants. Si vous ne l'avez pas déjà fait, veuillez d'abord voir 1.
Python 2.7 Python 3.7
Ceci est tiré de l'article précédent, je vais donc l'écrire pour ceux qui ne l'ont pas encore installé.
# Mosquitto(Broker)Installer
$ sudo apt-get install mosquitto
#Installer le client Mosquitto
$ sudo apt-get install mosquitto-clients
Je décrirai également comment installer les bibliothèques clientes Python et Java qui seront utilisées la prochaine fois. Python Installation de la bibliothèque paho
$ pip install paho-mqtt
Il existe un échantillon officiel.
Publisher n'a qu'à accéder à la connexion à chaque fois, la ligne suivante suffit donc. Si vous voulez le faire en continu, bouclez la troisième ligne.
simplepub.py
import paho.mqtt.publish as publish
publish.single("Nom du sujet", "Contenu du message", hostname="nom d'hôte")
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")
L'abonné définit la fonction de rappel et effectue le traitement. (C'est aussi la même chose que 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")
Démarrez le courtier de la même manière que Article précédent Puis démarrez le client.
$ cd C:\Program Files (x86)\mosquitto
$ mosquitto -v
Exécutez chacune des opérations suivantes et si le message publié apparaît sur l'écran de l'abonné, il réussit.
$ python simple_sub.py
$ python simple_pub.py
De plus, le client MQTT (paho.mqtt.client
) a des méthodes par défaut.
Il existe également un exemple d'implémentation qui écrit chaque méthode au lieu d'une seule ligne comme décrit ci-dessus.
Envoyer et recevoir MQTT avec python
Essayer de comprendre la bibliothèque MQTT Paho Python
Ce qui précède est un exemple d'implémentation de Pub / Sub seul, mais ROS et OpenRTM etc. , Je voulais l'appeler à partir d'un système fonctionnant séparément, donc Je les ai rassemblés dans une classe afin qu'ils puissent être facilement lus comme des modules auto-créés.
Ce qui suit est la classe.
Il hérite de mqtt.Client
. Pour référence, consultez client_sub-class.py de 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)
super () .__ init __ ()
ne soit modifiée en super (MyMQTTClient, self) .__ init () __
.Le rôle de chaque méthode est le suivant.
Nom de la méthode | rôle |
---|---|
on_connect | Méthode appelée lors de la connexion au courtier |
on_message | Méthode appelée lors de la réception d'un message(recieve_Remplacez le message reçu par des données) |
run | Démarrer une boucle d'abonné, une méthode appelée de l'extérieur |
publish_message | Méthode de publication du message, ci-dessussimplepub.py Tel quel |
isNew | Une méthode pour déterminer si le message reçu est nouveau |
En fait, il y a une méthode publish ()
dans la classe parent, mais je pensais que cela ne pouvait être fait par l'hôte que lorsque connect ()
était fait, et je voulais le mettre dans une classe, donc de cette façon Je l'ai implémenté. Il semble y avoir un autre moyen.
Voici un exemple d'implémentation utilisant un appel de classe. Placez le fichier dans le même répertoire que MQTTClient.py.
sample_mqtt_lient.py
import MQTTClient
mqttc = MQTTClient.MyMQTTClass()
mqttc.run("nom d'hôte","Nom du sujet")
#Publier une seule fois
mqttc.publish_message("nom d'hôte", "Nom du sujet","message")
if(mqttc.isNew()):
print(mqttc.receive_data)
Démarrez Subscribe avec mqttc.run ()
et publiez le message une seule fois avec mqttc.publish_message ()
.
De plus, la variable souscrite à recieve_data
est saisie. Puisqu'il est jugé par la fonction mqttc.isNew ()
s'il a été abonné, utilisez-le comme un ensemble comme décrit ci-dessus. (Identique à Open RTM)
mqttc = MQTTClient.MyMQTTClass()
mqttc.run("nom d'hôte","Nom du sujet")
Les deux lignes du haut sont les endroits où elles sont exécutées une fois, et les trois lignes suivantes sont les images à mettre dans la boucle principale.
#Publier une seule fois
mqttc.publish_message("nom d'hôte", "Nom du sujet","message")
if(mqttc.isNew()):
print(mqttc.receive_data)
J'ai implémenté une classe qui permet la communication MQTT avec Python. Quand j'ai essayé de l'utiliser avec ROS, cela a bien fonctionné, donc je pense que j'ai pu atteindre mon objectif.
Recommended Posts