Raspberry Pi: Controle GPIO com MQTT: mudanças entre as edições

De Wiki Cursos IFPR Foz
Ir para navegaçãoIr para pesquisar
 
(27 revisões intermediárias pelo mesmo usuário não estão sendo mostradas)
Linha 2: Linha 2:


==Mosquitto==
==Mosquitto==
O '''[[Mosquitto]]''' é um ''broker'' '''MQTT''' que implementa o modelo '''publilsher/subscriber''', o qual pode ser instalado diretamente no '''Raspberry Pi'''.
O '''[https://mosquitto.org/ Mosquitto]''' é um ''broker'' '''MQTT''' que implementa o modelo '''publilsher/subscriber''', o qual pode ser instalado diretamente no '''Raspberry Pi'''.


;Instalação e configuração do Mosquitto no Raspberry Pi:
===Instalação do Mosquitto no Raspberry Pi===
  sudo apt update
  sudo apt update
  sudo apt install mosquitto
  sudo apt install mosquitto
Linha 17: Linha 17:
  service mosquitto restart
  service mosquitto restart


;Configuração do Mosquitto para acesso por máquinas remotas:
===Configuração do Mosquitto para acesso por máquinas remotas===


As versões novas do Mosquitto somente permitem acesso de clientes rodando na máquina local (localhost). Isso pode ser verificado rodando o Mosquitto para mostrar os <code>log</code> da operação com o comando:
Nas versões do Mosquitto 2.0 e superiores deve-se '''configurar o modo autenticação''' para os clientes de conectarem ao broker <ref>https://mosquitto.org/documentation/authentication-methods/</ref>. 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 <code>log</code> da operação com o comando:
  mosquitto -v  
  mosquitto -v  


Linha 29: Linha 29:
  1645204154: Create a configuration file which defines a listener to allow remote access.
  1645204154: Create a configuration file which defines a listener to allow remote access.


==Exemplo de programas==
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 <code>.conf</code> e deve ser posicionado no diretório:
  /etc/mosquitto/conf.d
 
Depois deve-se iniciar o mosquito utilizando o parâmetro <code>-c</code>, 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''' <ref name=steves-into>http://www.steves-internet-guide.com/into-mqtt-python-client/</ref>.
 
;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 <ref name=steves-into/>:
 
<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("Publishing message to topic","teste")
client.publish("teste","m1")
</syntaxhighlight>
 
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 <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">
<syntaxhighlight lang="python">
import RPi.GPIO as GPIO
import RPi.GPIO as GPIO
from time import *
GPIO.setmode(GPIO.BCM)
GPIO.setup(26,  GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setmode(GPIO.BCM)   # Numeração nomes GPIO
import paho.mqtt.client as mqtt
#GPIO.setmode(GPIO.BOARD) # Numeração pinagem da placa
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)
GPIO.setup(21, GPIO.OUT)
import paho.mqtt.client as mqtt
while True:
broker="192.168.1.19"
     GPIO.output(21, GPIO.HIGH)
client = mqtt.Client("c1")
     print("Led ON")
client.connect(broker)
     sleep(1)
print("Subscribing to topic","GPIO/control/21")
     GPIO.output(21, GPIO.LOW)
client.subscribe("GPIO/control/#")
     print("Led OFF")
 
     sleep(1)
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>
</syntaxhighlight>


==Referências==
==Referências==
Linha 53: Linha 157:


----
----
[[Usuário:Evandro.cantu|Evandro.cantu]] ([[Usuário Discussão:Evandro.cantu|discussão]]) 17h51min de 17 de fevereiro de 2022 (-03)
[[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)