Icono del sitio AranaCorp

Configuración de un servidor MQTT con Mosquitto

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

Fuentes

Salir de la versión móvil