fbpixel
Etiquetas: ,

Para testar e usar o protocolo MQTT, você pode instalar um servidor MQTT usando o Mosquitto em um computador Windows ou Linux. Uma aplicação comum é instalar o Mosquittoem um Raspberry Pi e usá-lo como um servidor MQTT para IoT e automação residencial.

Descrição do protocolo MQTT

O protocolo MQTT (Message Queue Telemetry Transport) é um protocolo de comunicações especificado para pequenas trocas de dados em redes com grandes atrasos e baixa largura de banda.

O protocolo consiste num servidor MQTT (broker) ao qual os clientes se ligam. Os clientes podem publicar ou subscrever um tópico. As mensagens publicadas nos tópicos podem então ser trocadas entre clientes.

O Mosquittoé um servidor MQTT de código aberto que facilita a utilização do protocolo MQTT entre diferentes dispositivos ligados à mesma rede.

Instalar o servidor MQTT no Linux

No Linux, o Mosquittopode ser instalado usando os seguintes comandos

sudo apt-get update
sudo apt-get install mosquitto mosquitto-clients

Uma vez instalado o serviço, este pode ser gerido através dos seguintes 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

O servidor é configurado utilizando o ficheiro

sudo nano /etc/mosquitto/mosquitto.conf
sudo nano /etc/mosquitto/conf.d/default.conf

Exemplo de um ficheiro de configuração

 # 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

Instalar o servidor MQTT no Windows

No Windows, descarregue e instale o Mosquitto

Uma vez instalado, introduza o seguinte comando numa linha de comandos para iniciar o serviço

mosquitto

Para verificar se o serviço foi 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

O ficheiro de configuração do servidor está localizado na pasta de instalação

C:\Program Files\mosquitto\mosquitto.conf

Teste do MQTT

Pode utilizar o mosquitto diretamente a partir da linha de comandos. Num terminal, introduza o seguinte comando

mosquitto_sub -h localhost -t test_topic

Noutro terminal

mosquitto_pub -h localhost -t test_topic -m "Hello World!"

N.B.: Executar o código de assinante antes do código de editor

Teste do MQTT com Python

No exemplo seguinte, vamos utilizar o mosquitto com Python para trocar mensagens MQTT entre dois scripts python

python -m pip install paho-mqtt

Script Python de assinante

#!/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 de editor Python

Para publicar num tópico, basta especificar o endereço do servidor (MQTT_BROKER) e o nome do tópico que pretende 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()	
mqtt-simple-message-result Configurar um servidor MQTT com Mosquitto

Enviar um grupo de dados ordenados utilizando JSON

O pacote python JSON é uma biblioteca prática para armazenar e trocar dados sob a forma de ficheiros JSON.

Script para enviar um JSON

O ficheiro JSON está simplesmente no formato “dicionário

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 receber um JSON

No script de receção, adicionaremos a descodificação do json sob a forma de um dicionário

	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()
mqtt-json-message-result Configurar um servidor MQTT com Mosquitto

Fontes