- O que é MQTT?
- Instalando Mosquitto MQTT Broker no Raspberry Pi
- Testando o Raspberry Pi Mosquitto Broker
- Diagrama de circuito
- Código e Explicação
MQTT é um protocolo usado para enviar e receber mensagens pela Internet. Anteriormente, usamos este protocolo no medidor de eletricidade Iot e Raspberry Pi Alexa para publicar os dados na internet. Neste tutorial, saberemos mais sobre o MQTT e os termos relacionados a ele. Aqui, usaremos o Raspberry Pi como intermediário MQTT local e controlaremos um LED conectado ao NodeMCU ESP12E por meio do painel do aplicativo MQTT. Um sensor DHT11 também é conectado ao NodeMCU, de modo que obtemos a leitura de temperatura e umidade no painel MQTT, usando novamente o Raspberry Pi como corretor MQTT local.
Portanto, vamos começar resumindo o MQTT e os termos relacionados a ele.
O que é MQTT?
MQTT significa Message Queue Telemetry Transport, desenvolvido pela IBM. Este protocolo é simples e leve, usado para enviar e receber mensagens pela internet e é projetado para dispositivos que têm baixa largura de banda. Hoje em dia, esse protocolo é frequentemente usado nos dispositivos IoT para enviar e receber os dados dos sensores. Além disso, em sistemas de automação residencial baseados em IoT, este protocolo pode ser facilmente usado sem usar muitos dados da Internet.
Existem alguns termos que são usados com frequência no MQTT:
- Inscreva-se e publique
- mensagem
- Tema
- Corretor
1. Assinar e publicar: Assinar significa obter os dados de outro dispositivo, e publicar significa enviar os dados para outro dispositivo.
Quando o dispositivo1 envia os dados para o dispositivo2, ele é conhecido como Editor e outro é Assinante e vice-versa.
2. Mensagem: Mensagens são as informações que enviamos e recebemos. Pode ser um dado ou qualquer tipo de comando. Por exemplo, se estivermos publicando os dados de temperatura na nuvem, esses dados de temperatura são conhecidos como Mensagem.
3. Tópico: Esta é a forma como você registra o interesse pelas mensagens recebidas ou como especifica onde deseja publicar a mensagem. Os tópicos são representados por strings separadas por uma barra. Os dados são publicados nos tópicos usando MQTT e, em seguida, o dispositivo MQTT assina o tópico para obter os dados.
4. MQTT Broker: Essa coisa é responsável por receber todas as mensagens dos editores, filtra as mensagens e, em seguida, publica as mensagens para os assinantes que estão interessados nelas.
Quando esse broker está hospedado na nuvem, ele é chamado de nuvem MQTT. Existem muitos serviços MQTT baseados em nuvem como Adafruit IO, MQTT.IO, IBM bluemix, Microsoft Azure, etc. O MQTT também pode ser usado com a nuvem Amazon AWS popular, que explicamos no tutorial de Introdução ao Amazon AWS.
Podemos fazer nosso próprio corretor MQTT usando o Raspberry Pi. Este será o corretor MQTT local, ou seja, você pode enviar e receber os dados em sua rede local, mas não de qualquer lugar. Portanto, aqui instalaremos o broker Mosquitto MQTT no Raspberry Pi para torná-lo um broker MQTT local e enviaremos os dados de temperatura do NodeMCU para o aplicativo de painel MQTT. Além disso, controlaremos um LED conectado ao NodeMCU usando o corretor.
Instalando Mosquitto MQTT Broker no Raspberry Pi
Abra o terminal em seu Raspberry pi e digite os seguintes comandos para instalar o corretor
sudo apt update sudo apt install -y mosquitto mosquitto-clients
Aguarde a conclusão da instalação. Agora, para iniciar o corretor na inicialização do raspberry pi, digite o seguinte comando
sudo systemctl enable mosquitto.service
É isso, estamos prontos para lançar nosso corretor MQTT. Para verificar se ele está instalado corretamente, digite o seguinte comando
mosquitto -v
Este comando fornecerá a versão de seu broker MQTT. Deve ser 1.4.x ou superior.
Testando o Raspberry Pi Mosquitto Broker
1. Execute o corretor Mosquitto em segundo plano usando o comando abaixo
mosquitto -d
2. Agora, vamos inscrever um tópico em exampleTopic usando o seguinte comando
mosquitto_sub -d -t exampleTopic
3. Agora, vamos publicar alguma mensagem para exampleTopic
mosquitto_pub -d -t exampleTopic -m "Olá, mundo!"
Você receberá o Hello world! Mensagem no terminal do assinante.
Agora, é hora de controlar e obter os dados de outro dispositivo, em nosso caso, estamos usando o aplicativo de painel NodeMCU e MQTT .
- Primeiro, controlaremos um LED enviando um comando usando o App, portanto, neste caso, o NodeMCU se comporta como um assinante e o App como um editor.
- Então, a ESP12E também tem um sensor DHT11 conectado a ela e envia essa leitura de temperatura para o aplicativo MQTT móvel, portanto, neste caso, o dispositivo móvel será o assinante e o NodeMCU será o editor. E para encaminhar essas mensagens nos respectivos Tópicos, o broker Mosquitto MQTT é usado.
Diagrama de circuito
Conecte o circuito conforme mostrado no diagrama. Aqui, o DHT11 é usado para as leituras de temperatura, mas um sensor de temperatura LM35 também pode ser usado. Já usamos o sensor DHT11 em muitos de nossos projetos, incluindo o NodeMCU para construir uma estação meteorológica.
Vamos começar a escrever o código para o NodeMCU para assinar e publicar os dados.
Código e Explicação
Aqui, usaremos o modelo de biblioteca Adafruit MQTT e alteraremos as coisas necessárias no código. O mesmo código pode ser usado para publicar e inscrever os dados na nuvem Adafruit IO apenas alterando algumas coisas.Para isso, baixe a biblioteca Adafruit MQTT em Sketch -> Incluir Biblioteca -> Gerenciar Bibliotecas. Pesquise Adafruit MQTT e instale-o. Depois de instalar a biblioteca. Vá para exemplos -> Biblioteca Adafruit mqtt -> mqtt_esp8266
Em seguida, edite esse código de acordo com nosso endereço IP do Raspberry Pi e credenciais de Wi-Fi.
Inclui todas as bibliotecas para ESP8266WIFI e Adafruit MQTT .
#incluir
Em seguida, defina o SSID e a senha do seu Wi-Fi, a partir do qual deseja conectar o ESP-12e. Certifique-se de que seu RPi e NodeMCU se conectem à mesma rede.
#define WLAN_SSID "xxxxxxxx" #define WLAN_PASS "xxxxxxxxxxx"
Esta seção define o servidor Adafruit, neste caso o endereço IP do seu Raspberry Pi e a porta do servidor.
#define AIO_SERVER "endereço ip do seu Pi" #define AIO_SERVERPORT 1883
Os campos abaixo permanecerão vazios porque não estamos usando a nuvem Adafruit.
#define AIO_USERNAME "" #define AIO_KEY ""
Em seguida, crie uma classe WiFiClient ESP8266 para se conectar ao servidor MQTT.
Cliente WiFiClient;
Configure a classe do cliente MQTT passando o cliente WiFi e o servidor MQTT e os detalhes de login.
Adafruit_MQTT_Client mqtt (& client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
Configure um feed chamado 'Temperatura' para publicar a temperatura.
Adafruit_MQTT_Publish Temperatura = Adafruit_MQTT_Publish (& mqtt, AIO_USERNAME "/ feeds / temperatura");
Configure um feed chamado 'led1' para inscrever-se nas alterações.
Adafruit_MQTT_Subscribe led1 = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / led");
Na função de configuração , declaramos o PIN do NodeMCU no qual você deseja obter a saída. Em seguida, conecte o NodeMCU ao ponto de acesso Wi-fi.
configuração vazia () { Serial.begin (115200); atraso (10); pinMode (LED, SAÍDA); Serial.println (F ("Adafruit MQTT demo")); // Conecte ao ponto de acesso WiFi. Serial.println (); Serial.println (); Serial.print ("Conectando a"); Serial.println (WLAN_SSID); WiFi.begin (WLAN_SSID, WLAN_PASS); enquanto (WiFi.status ()! = WL_CONNECTED) { …. … … Configure a assinatura MQTT para feed de led. mqtt.subscribe (& led1); }
Na função de loop , iremos garantir que a conexão com o servidor MQTT esteja ativa usando MQTT_connect (); função.
loop vazio () { MQTT_connect ();
Agora, assine o feed 'led' e obtenha a sequência do broker MQTT e converta essa sequência em número usando atoi (); função e escrever este número no pino do LED usando digitalWrite (); função.
Assinatura Adafruit_MQTT_Subscribe *; while ((subscription = mqtt.readSubscription (20000))) { if (subscription == & led1) { Serial.print (F ("Got:")); Serial.println ((char *) led1.lastread); int led1_State = atoi ((char *) led1.lastread); digitalWrite (LED, led1_State); }
Agora, pegue a temperatura em uma variável e publique este valor usando a função Temperature.publish (t) .
float t = dht.readTemperature (); … .. if (! Temperature.publish (t)) { Serial.println (F ("Failed")); } else { Serial.println (F ("OK!")); }
O código completo com um vídeo de demonstração é fornecido no final deste tutorial. Faça upload do código para a placa NodeMCU e abra o aplicativo de painel MQTT que você baixou no Smartphone.
Você também pode controlar Raspberry Pi GPIO de qualquer lugar do mundo usando a nuvem MQTT como Adafruit IO, MQTT.IO etc, que aprenderemos no próximo tutorial.