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