Raspberry Pi: Controle GPIO com MQTT: mudanças entre as edições
(19 revisões intermediárias pelo mesmo usuário não estão sendo mostradas) | |||
Linha 38: | Linha 38: | ||
mosquitto -v -c /etc/mosquitto/conf.d/conf_local.conf | mosquitto -v -c /etc/mosquitto/conf.d/conf_local.conf | ||
== | ==Clientes MQTT Python== | ||
Para | Para utilizar '''clientes MQTT''' com '''Python''' é necessário utilizar a biblioteca '''Paho MQTT Python Client''' <ref name=steves-into>http://www.steves-internet-guide.com/into-mqtt-python-client/</ref>. | ||
;Instalação do Cliente Paho MQTT: | ;Instalação do Cliente Paho MQTT: | ||
sudo pip install paho-mqtt | sudo pip install paho-mqtt | ||
A principal entidade da biblioteca é a classe que provê acesso as funções para '''publicar mensagens''' e '''subscrever tópicos''' em um '''''broker'' MQTT'''. | |||
A principal entidade da biblioteca | |||
===Publicação de mensagens=== | |||
Exemplo de código para '''publicar''' mensagens em um broker <ref name=steves-into/>: | |||
<syntaxhighlight lang="python"> | <syntaxhighlight lang="python"> | ||
import paho.mqtt.client as mqtt | import paho.mqtt.client as mqtt | ||
broker="192.168.1.19" | broker="192.168.1.19" | ||
Linha 66: | Linha 63: | ||
Testar a publicação utilizando um cliente via terminal para subscrever o tópico: | Testar a publicação utilizando um cliente via terminal para subscrever o tópico: | ||
mosquitto_sub -t teste | mosquitto_sub -t teste | ||
===Subscrição de mensagens=== | |||
O código exemplo abaixo descreve os procedimentos para '''subscrever''' mensagens em um broker <ref name=steves-into/>. Neste código temos uma função '''callback''', com diversos parâmetros, que é chamada quando o cliente recebe uma mensagem. | |||
<syntaxhighlight lang="python"> | |||
import paho.mqtt.client as mqtt | |||
broker="192.168.1.19" | |||
print("creating new instance") | |||
client = mqtt.Client("c1") | |||
print("connecting to broker") | |||
client.connect(broker) | |||
print("Subscribing to topic","teste") | |||
client.subscribe("teste") | |||
def on_message(client, userdata, message): | |||
print("message received " ,str(message.payload.decode("utf-8"))) | |||
print("message topic=",message.topic) | |||
print("message qos=",message.qos) | |||
print("message retain flag=",message.retain) | |||
client.on_message=on_message | |||
client.loop_start() | |||
#time.sleep(4) # wait | |||
#client.loop_stop() #stop the loop | |||
</syntaxhighlight> | |||
E exemplo acima deixa o cliente rodando em loop, caso necessário deve-se parar o loop após um tempo. | |||
Testar a publicação utilizando um cliente via terminal para publicar no tópico: | |||
mosquitto_pub -t teste -m m1 | |||
==Controle GPIO com Python e utilização do protocolo MQTT== | |||
Para controlar as portas '''GPIO''' do '''Raspberry Pi''' através do protocolo '''MQTT''' também é necessário utilizar a biblioteca '''Paho MQTT Python Client''' <ref name=steves-gpio>http://www.steves-internet-guide.com/mqtt-raspberry-pi-gpio/</ref>. | |||
===Publicar o estado de uma porta GPIO=== | |||
Para '''publicar''' o valor de um pino em um '''''broker'' MQTT''' é necessário definir o nome do '''tópico''', por exemplo: | |||
*pi/GPIO/numero_porta | |||
<syntaxhighlight lang="python"> | |||
import RPi.GPIO as GPIO | |||
GPIO.setmode(GPIO.BCM) | |||
GPIO.setup(26, GPIO.IN, pull_up_down=GPIO.PUD_UP) | |||
import paho.mqtt.client as mqtt | |||
broker="192.168.1.19" | |||
client = mqtt.Client("c1") | |||
client.connect(broker) | |||
print("Publishing message to topic","GPIO/26") | |||
client.publish("GPIO/26",GPIO.input(26)) | |||
</syntaxhighlight> | |||
===Subscrever um tópico para controlar uma porta GPIO=== | |||
Programa exemplo para '''subscrever''' um '''tópico''' e controlar uma porta '''GPIO'''. | |||
Subscreve o tópico: | |||
*GPIO/control/# | |||
Aceitando qualquer número de porta GPIO. | |||
O programa realiza a separação (split) de cada sub-tópico e utiliza para acionar a porta especificada. | |||
<syntaxhighlight lang="python"> | |||
import RPi.GPIO as GPIO | |||
GPIO.setmode(GPIO.BCM) | |||
GPIO.setup(20, GPIO.OUT) | |||
GPIO.setup(21, GPIO.OUT) | |||
import paho.mqtt.client as mqtt | |||
broker="192.168.1.19" | |||
client = mqtt.Client("c1") | |||
client.connect(broker) | |||
print("Subscribing to topic","GPIO/control/21") | |||
client.subscribe("GPIO/control/#") | |||
def on_message(client, userdata, message): | |||
msg=str(message.payload.decode("utf-8")) | |||
top=str(message.topic) | |||
sub_top=top.split(sep="/") | |||
print("message received " ,msg) | |||
print("message topic=",top) | |||
print("message sub topics=",sub_top) | |||
print("message GPIO=",sub_top[2]) | |||
GPIO.output(int(sub_top[2]), int(msg)) | |||
client.on_message=on_message | |||
client.loop_start() | |||
</syntaxhighlight> | |||
==Referências== | ==Referências== | ||
Linha 71: | Linha 157: | ||
---- | ---- | ||
[[Usuário:Evandro.cantu|Evandro.cantu]] ([[Usuário Discussão:Evandro.cantu|discussão]]) | [[Usuário:Evandro.cantu|Evandro.cantu]] ([[Usuário Discussão:Evandro.cantu|discussão]]) 10h54min de 22 de fevereiro de 2022 (-03) | ||
---- | ---- | ||
[[Categoria:Raspberry Pi]] [[Categoria:IoT]] | [[Categoria:Raspberry Pi]] [[Categoria:IoT]] |
Edição atual tal como às 19h33min de 24 de fevereiro de 2022
Raspberry Pi: Controle GPIO com MQTT
Mosquitto
O Mosquitto é um broker MQTT que implementa o modelo publilsher/subscriber, o qual pode ser instalado diretamente no Raspberry Pi.
Instalação do Mosquitto no Raspberry Pi
sudo apt update sudo apt install mosquitto sudo apt install mosquitto-clients
Depois de instalado o Mosquito é automaticamente iniciado, assim como é iniciado a cada reboot. Para verificar se está rodando, pode utilizar o comando:
ps -aux|grep mosquitto
Parar, iniciar ou reiniciar Mosquitto:
service mosquitto stop service mosquitto start service mosquitto restart
Configuração do Mosquitto para acesso por máquinas remotas
Nas versões do Mosquitto 2.0 e superiores deve-se configurar o modo autenticação para os clientes de conectarem ao broker [1]. Caso contrário, somente terão acesso os clientes rodando na máquina local (localhost). Isso pode ser verificado rodando o Mosquitto para mostrar os log
da operação com o comando:
mosquitto -v
- Exemplo de saída:
pi@raspberrypi:~ $ mosquitto -v 1645204154: mosquitto version 2.0.11 starting 1645204154: Using default config. 1645204154: Starting in local only mode. Connections will only be possible from clients running on this machine. 1645204154: Create a configuration file which defines a listener to allow remote access.
Para habilitar acesso remoto e sem autenticação, deve-se criar um arquivo de configuração contendo as opções:
listener 1883 allow_anonymous true
Este arquivo deve ter a extensão .conf
e deve ser posicionado no diretório:
/etc/mosquitto/conf.d
Depois deve-se iniciar o mosquito utilizando o parâmetro -c
, por exemplo:
mosquitto -v -c /etc/mosquitto/conf.d/conf_local.conf
Clientes MQTT Python
Para utilizar clientes MQTT com Python é necessário utilizar a biblioteca Paho MQTT Python Client [2].
- Instalação do Cliente Paho MQTT
sudo pip install paho-mqtt
A principal entidade da biblioteca é a classe que provê acesso as funções para publicar mensagens e subscrever tópicos em um broker MQTT.
Publicação de mensagens
Exemplo de código para publicar mensagens em um broker [2]:
import paho.mqtt.client as mqtt
broker="192.168.1.19"
print("creating new instance")
client = mqtt.Client("c1")
print("connecting to broker")
client.connect(broker)
print("Publishing message to topic","teste")
client.publish("teste","m1")
Testar a publicação utilizando um cliente via terminal para subscrever o tópico:
mosquitto_sub -t teste
Subscrição de mensagens
O código exemplo abaixo descreve os procedimentos para subscrever mensagens em um broker [2]. Neste código temos uma função callback, com diversos parâmetros, que é chamada quando o cliente recebe uma mensagem.
import paho.mqtt.client as mqtt
broker="192.168.1.19"
print("creating new instance")
client = mqtt.Client("c1")
print("connecting to broker")
client.connect(broker)
print("Subscribing to topic","teste")
client.subscribe("teste")
def on_message(client, userdata, message):
print("message received " ,str(message.payload.decode("utf-8")))
print("message topic=",message.topic)
print("message qos=",message.qos)
print("message retain flag=",message.retain)
client.on_message=on_message
client.loop_start()
#time.sleep(4) # wait
#client.loop_stop() #stop the loop
E exemplo acima deixa o cliente rodando em loop, caso necessário deve-se parar o loop após um tempo.
Testar a publicação utilizando um cliente via terminal para publicar no tópico:
mosquitto_pub -t teste -m m1
Controle GPIO com Python e utilização do protocolo MQTT
Para controlar as portas GPIO do Raspberry Pi através do protocolo MQTT também é necessário utilizar a biblioteca Paho MQTT Python Client [3].
Publicar o estado de uma porta GPIO
Para publicar o valor de um pino em um broker MQTT é necessário definir o nome do tópico, por exemplo:
- pi/GPIO/numero_porta
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(26, GPIO.IN, pull_up_down=GPIO.PUD_UP)
import paho.mqtt.client as mqtt
broker="192.168.1.19"
client = mqtt.Client("c1")
client.connect(broker)
print("Publishing message to topic","GPIO/26")
client.publish("GPIO/26",GPIO.input(26))
Subscrever um tópico para controlar uma porta GPIO
Programa exemplo para subscrever um tópico e controlar uma porta GPIO.
Subscreve o tópico:
- GPIO/control/#
Aceitando qualquer número de porta GPIO.
O programa realiza a separação (split) de cada sub-tópico e utiliza para acionar a porta especificada.
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(20, GPIO.OUT)
GPIO.setup(21, GPIO.OUT)
import paho.mqtt.client as mqtt
broker="192.168.1.19"
client = mqtt.Client("c1")
client.connect(broker)
print("Subscribing to topic","GPIO/control/21")
client.subscribe("GPIO/control/#")
def on_message(client, userdata, message):
msg=str(message.payload.decode("utf-8"))
top=str(message.topic)
sub_top=top.split(sep="/")
print("message received " ,msg)
print("message topic=",top)
print("message sub topics=",sub_top)
print("message GPIO=",sub_top[2])
GPIO.output(int(sub_top[2]), int(msg))
client.on_message=on_message
client.loop_start()
Referências
Evandro.cantu (discussão) 10h54min de 22 de fevereiro de 2022 (-03)