Para probar y utilizar el protocolo MQTT, puede instalar un servidor MQTT utilizando Mosquitto en un ordenador Windows o Linux. Una aplicación común es instalar Mosquittoen una Raspberry Pi y utilizarla como servidor MQTT para IoT y domótica.
Descripción del protocolo MQTT
El protocolo MQTT (Message Queue Telemetry Transport) es un protocolo de comunicaciones especificado para pequeños intercambios de datos a través de redes con grandes retardos y poco ancho de banda.
El protocolo consiste en un servidor MQTT (broker) al que se conectan los clientes. Los clientes pueden publicar o suscribirse a un tema. Los mensajes publicados en temas pueden intercambiarse entre clientes.
Mosquittoes un servidor MQTT de código abierto que facilita el uso del protocolo MQTT entre distintos dispositivos conectados a la misma red.
Instalación del servidor MQTT en Linux
En Linux, Mosquittopuede instalarse utilizando los siguientes comandos
sudo apt-get update
sudo apt-get install mosquitto mosquitto-clients
Una vez instalado el servicio, puede gestionarse mediante los siguientes comandos
sudo systemctl stop mosquitto #arrêter
sudo systemctl start mosquitto #démarrer
sudo systemctl restart mosquitto #redémarrer
sudo systemctl status mosquitto #connaitre le status
El servidor se configura mediante el archivo
sudo nano /etc/mosquitto/mosquitto.conf
sudo nano /etc/mosquitto/conf.d/default.conf
Ejemplo de fichero de configuración
# Place your local configuration in /etc/mosquitto/conf.d/ # # A full description of the configuration file is at # /usr/share/doc/mosquitto/examples/mosquitto.conf.example pid_file /var/run/mosquitto/mosquitto.pid persistence true persistence_location /var/lib/mosquitto/ log_dest file /var/log/mosquitto/mosquitto.log port 1883 allow_anonymous true include_dir /etc/mosquitto/conf.d
Instalación del servidor MQTT en Windows
En Windows, descargue e instale Mosquitto
Una vez instalado, introduzca el siguiente comando en un símbolo del sistema para iniciar el servicio
mosquitto
Para comprobar que el servicio se ha iniciado:
netstat -an | find str 1883
C:\Users\ADMIN>netstat -an | findstr 1883
TCP 127.0.0.1:1883 0.0.0.0:0 LISTENING
TCP [::1]:1883 [::]:0 LISTENING
El archivo de configuración del servidor se encuentra en la carpeta de instalación
C:\Program Files\mosquitto\mosquitto.conf
Probar MQTT
Puede utilizar mosquitto directamente desde la línea de comandos. En un terminal, introduzca el siguiente comando
mosquitto_sub -h localhost -t test_topic
En otro terminal
mosquitto_pub -h localhost -t test_topic -m "Hello World!"
N.B.: Ejecute el código de abonado antes que el código de editor
Probar MQTT avec Python
En el siguiente ejemplo, vamos a utilizar mosquitto con Python para intercambiar mensajes MQTT entre dos scripts python
python -m pip install paho-mqtt
Script Python de abonado
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import paho.mqtt.client as mqtt #import library
import time
MQTT_BROKER = "localhost" #specify the broker address, it can be IP of raspberry pi or simply localhost
MQTT_TOPIC = "test_channel" #this is the name of topic
global messageReceived
messageReceived=False
# callback called when client receives a CONNACK response
def on_connect(client, userdata, flags, rc):
if rc==0:
client.subscribe(MQTT_TOPIC)
print("subscribe to {}".format(MQTT_TOPIC))
else:
syslog.syslog("bad connection {}".format(rc))
# callback called when a PUBLISH message is received
def on_message(client, userdata, msg):
print(msg.topic+" "+str(msg.payload.decode("utf-8")))
global messageReceived
messageReceived=True
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect(MQTT_BROKER)
client.loop_forever()# use this line if you don't want to write any further code. It blocks the code forever to check for data
"""
client.loop_start() #use this line if you want to write any more code here
delay=0.001
counter=120/delay #2min
while messageReceived==False and counter>0:
time.sleep(delay)
client.loop_stop()
"""
Script editor Python
Para publicar en un tema, basta con especificar la dirección del servidor (MQTT_BROKER) y el nombre del tema en el que se desea publicar (MQTT_TOPIC).
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import paho.mqtt.client as mqtt #import library
import time
MQTT_BROKER = "localhost"
MQTT_TOPIC = "test_channel"
client = mqtt.Client("pyScript")
client.connect(MQTT_BROKER)
msg="Hello World!!"
client.publish(MQTT_TOPIC,msg)
print("Published {} over MQTT".format(msg))
counter=0
while counter<10:
counter+=1
client.publish(MQTT_TOPIC,"counter : {}".format(counter))
print("Published counter : {}".format(counter))
time.sleep(0.001)
client.disconnect()

Enviar un grupo de datos ordenados mediante JSON
El paquete JSON de python es una práctica biblioteca para almacenar e intercambiar datos en forma de archivos JSON.
Script para enviar un JSON
El archivo JSON está simplemente en formato «diccionario».
import paho.mqtt.client as mqtt #import library
import time
import json
MQTT_BROKER = "localhost"
MQTT_TOPIC = "test_channel"
client = mqtt.Client("10.3.141.1")
client.connect(MQTT_BROKER)
json_data = {}
json_data['msg'] = "hello World"
json_data['index'] = 12
json_data['value'] = 49.3
json_data['list'] = ["alpha","bravo","charlie"]
client.publish(MQTT_TOPIC,str(json_data))
print("Published json over MQTT")
Script para recibir un JSON
En el script de recepción, añadiremos la decodificación del json en forma de diccionario
if "{" in msgrec: #decode json
data = json.loads(msgrec.replace("'",'"'))
for key in data:
print("{} : {}".format(key,data[key]))
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import paho.mqtt.client as mqtt #import library
import time
import json
MQTT_BROKER = "localhost" #specify the broker address, it can be IP of raspberry pi or simply localhost
MQTT_TOPIC = "test_channel" #this is the name of topic
global messageReceived
messageReceived=False
# The callback for when the client receives a CONNACK response from the server.
def on_connect(client, userdata, flags, rc):
if rc==0:
client.subscribe(MQTT_TOPIC)
print("subscribe to {}".format(MQTT_TOPIC))
else:
syslog.syslog("bad connection {}".format(rc))
# The callback for when a PUBLISH message is received from the server.
def on_message(client, userdata, msg):
msgrec=str(msg.payload.decode("utf-8"))
print(msg.topic+" "+msgrec)
if "{" in msgrec: #decode json
data = json.loads(msgrec.replace("'",'"'))
for key in data:
print("{} : {}".format(key,data[key]))
global messageReceived
messageReceived=True
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect(MQTT_BROKER)
client.loop_forever()
