IoT – ESP8266 (NodeMCU) com MQTT a seu próprio Broker

ESP8266
ESP8266

Como citado nesse post sobre como configurar um MQTT Broker, vamos agora fazer uma comunicação simples e rápida mostrando controle remoto de uma board NodeMCU, programando em Lua através da IDE ESPlorer. Se precisar de conceitos sobre MQTT e Broker, leia esse post. Sobre o NodeMCU e o ESPlorer, sugiro que leia esse post.

Firmware Customizado
Firmware Customizado

Construa seu firmware online na hora

Invés de montar um SDK gigante pra construir seu firmware de poucos KB, construa seu firmware online da Frightanic através do site NodeMCU Build. No site você poderá selecionar os recursos que deseja para seu firmware e ao final bastará mandar contruir o firmware, com link que será enviado para o email especificado no site; é o único requisito, seu email! Em aguns minutos seu firmware estará disponível e ficará armazenado por 24hs, nas opções float e int.

Apesar de inicialmente a velocidade de conexão com o novo firmware ser a mesma (9600 kbauds), o tempo de upload ficou perceptivelmente mais rápido com o firmware customizado. Mais uma vantagem é que a verbosidade de erro agora existe! Fiquei muito satisfeito com a construção online e recomendo.

No shot do boot pelo ESPlorer você pode ver informações importantes sobre sua própria build, separada pelas categorias branch, commit, SSL (true/false), modules, além da data do build e versão do SDK utilizado para contruí-lo. Simplesmente fascinante!

LED para a prova de conceito

É o comum mesmo para prova de conceito. Meu propósito inicial era só monitoramento, mas monitoramento não me deu a mesma sensação de fazer o controle remoto através do Broker. Depois vou implementar monitoramento em Arduino, PIC, ARM, MIPS and so on, mas aqui vamos ver como acender um LED remotamente. Para não ficar igual todo mundo que vive usando LED verde de 5mm, vamos usar um LED verde de 3mm (sarcasmo).




Preparando o ambiente

Antes de começar a programar, foi necessário atualizar o firmware do NodeMCU porque não estava conseguindo subir nada a partir do ESPlorer no firmware original. Se você estiver na mesma condição e pretende utilizar o ESPlorer (recomendo muuuuuito), siga o procedimento de atualização de firmware baixando previamente seu firmware personalizado citado mais acima. Eu utilizei o dev build, sem medo. Baixe o esptool (Linux), descomprima-o e execute o seguinte comando:

Can’t autodetect firmware, because proper answer not received.

Essa será a mensagem que você vai receber do ESPlorer na maioria dos casos (porque aconteceu de aparecer a versão pra mim umas duas vezes, não sei se está relacionado à velocidade da serial e não me importei porque meu propósito agora é outro). Não se esqueça de ajustar a velocidade da serial para 9600 na primeira conexão para não ter aborrecimentos, porque infelizmente a IDE não sugere que você faça a mudança nem tentar as velocidades automaticamente.

Primeiro boot

Agora conecte-se ao NodeMCU através da IDE ESPlorer a 9600kbauds e então clique no botão Reset.Ao primeiro boot você verá a mensagem “lua: cannot open init.lua” no firmware original ou no firmware baixado pelo github. No firmware personalizado você não vê essa mensagem.

O arquivo init.lua é como um arquivo rc no Linux, mais semelhante ao init. Se esse arquivo entrar em loop, dificilmente você conseguirá recuperar o boot, tornando-se necessário um novo flashing, mas sem maiores agravos, portanto, não entre em desespero.

Eu tive que fazer várias vezes o procedimento até entender a divisão e testes prévios de códigos em scripts separados, de forma a somente carregá-los posteriormente no init.lua e tê-los iniciando em tempo de boot. Por fim, pesquisando por outras características, achei alguns bons conselhos em relação à divisão dos códigos em scripts e adotarei sempre essa prática conforme descrevo a partir da próxima linha.

config.lua

Esse arquivo conterá apenas constantes que serão utilizadas nos demais scripts.

init.lua

O arquivo init.lua apenas fará o start do programa. É o último a subir, porque se você cometer um erro agora, pode dar mais trabalho que eventualmente você teria fazendo na ordem descomplicada.

init_main.lua

O init.lua fará a chamada desse script, como você pode notar. Fazê-lo desse modo lhe permite testar fazendo dofile() na caixa de comando do ESPlorer ou Ctrl+S para subir-e-executar.

main.lua

Esse arquivo contém todo o handshake com o protocolo MQTT. Está muito limpinho, uma parte eu fiz idêntica a um exemplo que encontrei, outra parte escrevi do jeito que achei mais interessante. O código só não deve estar muito bonito porque esse é meu segundo programa em Lua, mas pelo menos está funcionando sem bugs.




A nuance entre o refresh e o reflash

Pode ser tão comum quanto um F5. Se tiver um bug em seu script init.lua que o mantenha em um loop infinito, meu amigo, tenha certeza que a única solução é fazer um reflash. Eu fiz algumas tantas vezes até entender como as coisas funcionam (se é que eu entendi mesmo). Se for para testar, faça scripts à parte. Se der um problema federal, o sistema vai reiniciar sem executar o script, mas se esse script estiver sendo chamado dentro do init.lua, problemas na certa.

Código MQTT para NodeMCU

Inicialmente o propósito era apenas monitorar a luminosidade do ambiente com o sensor TSL235R, o qual escrevi um post para Arduino há alguns anos. Não vou utilizá-lo nesse post porque tem 1 bug e ainda não encontrei; ele está rodando por um determinado periodo e depois pára. Teve caso de reiniciar a MCU. Você consegue encontrar um bug? Veja o código em Lua.
Será necessário analisarmos a board em questão (NodeMCU) para escolher o pino a utilizar para a leitura do sensor. Encontrei um pinout bem bonito fornecido por eles mesmos. Em seguida vamos ao código.

nodemcu-pinout

Mais uma vez enfatizo que estou começando a aprender Lua e esse é meu segundo programa, então sinto-me à vontade para utilizar um código consolidado. De qualquer modo, alguma coisa do código a seguir consigo explicar. Além do mais, a leitura do sensor estou fazendo tal qual no meu post sobre TSL235R. Vou portar o código C++ para Lua, por isso coloco-o aqui para comparação, talvez você codifique melhor:

Como você pode ver acima, a interrupção trata exclusivamente de incrementar a variável cnt. No loop, millis() é chamado para verificar se a diferença de last é igual ou maior que 1 segundo. O pino está em pull-up e é entrada (leitura). O pino utilizado na interrupção (0) é o pino 2 do Arduino UNO ou Leonardo, tanto faz.

Eliminei todo o código relacionado ao MQTT; esse script era todo o programa, antes de eu entender melhor como manipular scripts Lua para NodeMCU. Deixei essa parte para que você possa utilizar e debugar, ou pelo menos ajudar a debugar antes que eu faça um novo post com a solução permanente para o sensor. Por estar “meia-boca”, preferi não adicioná-lo a este post, como citei anteriormente.

client e broker
client e broker

Nessa prévia você vê como fica a comunicação na serial e a recepção pelo Broker, exibido aí no terminal. No video estou apenas mostrando que de fato o LED apaga e acende através do aplicativo MyMQTT, fazendo o papel de client até que eu exiba novas implementações em outros posts (é, realmente estou empolgado com isso).




USE SEMPRE SSL NA COMUNICAÇÃO COM O BROKER

Se você estiver fazendo um laboratório ou se for em um ambiente que não haverá consulta na nuvem nem acesso público, não há problema em utilizar a conexão aberta como fiz. Mas se pretende implementar seriamente, não deixe de implementar SSL porque senão o usuário e senha pode ser sniffado. Por exemplo:

Apesar de eu ter colocado suporte a SSL em ambos, tanto o broker como nesse novo firmware NodeMCU, não fiz nenhum teste ainda, vou fazer um post mais específico apenas sobre implementação de alguns recursos extras como base de dados diferentes para fazer persistência, etc.

Pra finalizar, um video simples de tudo, só como prova de conceito.

Siga-nos no Do bit Ao Byte no Facebook.

Prefere twitter? @DobitAoByte.

Inscreva-se no nosso canal Do bit Ao Byte Brasil no YouTube.

Próximo post a caminho!

Comments

comments

Djames Suhanko

Djames Suhanko é Perito Forense Digital. Já atuou com deployer em sistemas de missão critica em diversos países pelo mundão. Programador Shell, Python, C, C++ e Qt, tendo contato com embarcados ( ora profissionalmente, ora por lazer ) desde 2009.

Um comentário em “IoT – ESP8266 (NodeMCU) com MQTT a seu próprio Broker

Deixe uma resposta