Controlando ESP32 via WiFi com validação por endereço MAC

macaddress

O macaddress é um endereço físico único em formato hexadecimal com 6 bytes, que é atribuído a todo hardware feito para comunicação em rede, e como a identificação é única, ela pode ser usada para fazer o controle de acesso em uma rede local, onde por exemplo, os roteadores permitem o bloqueio de endereços MAC específicos.

 

Neste tutorial vamos aplicar essa funcionalidade na ESP32, usando o Arduino IDE para programa-la no modo AP, e validar o acesso de dispositivos conectados através do endereço MAC. Somente após feita a validação será permitido ao usuário utilizar o sistema.

 

Importante informar que esse tutorial é de caráter didático, uma vez que, apesar do MAC ser único para cada dispositivo, é possível alterá-lo usando técnicas específicas, o que não garante segurança efetiva contra usuários não autorizados. O código completo usado nesse tutorial está disponível na minha conta do Github.

 

 

Instalando bibliotecas

 

Existe um complemento para o Arduino IDE afim de suportar as placas da ESP32, para fazer a instalação confira o tutorial para Windows do Gabriel Almeida. Para outros sistemas operacionais, siga as instruções na conta Github dos fornecedores do complemento.

 

Também iremos usar a biblioteca ESP_ClientMacaddress disponível no meu Github.

 

Configurando WiFi no modo AP (Access Point)

 

Um Access Point é uma Rede de Conexão Local Wireless (WLAN), por onde podemos conectar um dispositivo (client) a ESP (host) via WiFi.

 

Primeiro importamos a seguinte biblioteca para configurar a conexão WiFi na ESP.

 

 

Escolha o SSID e a Senha que desejar, essa será a forma de identificar a rede na qual o usuário deverá conectar-se:

 

 

WiFi Server configurado na porta 80:

 

 

Dentro do setup(), para setar a ESP no modo AP usamos este comando:

 

 

E para iniciar o servidor:

 

 

Neste ponto seu código deve estar dessa forma:

 

 

Agora grave o código na ESP, e então use um celular pra verificar se a rede WiFi aparece disponível, mas não conecte ainda.

 

Fig 1 – Redes Disponíveis

 

Enviando comandos através dos cabeçalhos HTTP do client 

 

Edite o loop() de acordo com o código a seguir. 

 

 

Assim durante a execução do loop(), a ESP estará sempre verificando se foi feita alguma conexão. Uma vez recebida uma solicitação do client, iremos salvar os dados recebidos na String cabeçalho, e com o comando client.println() respondemos com o status OK(código 200) para sinalizar ao client que recebemos os dados com sucesso. Mais adiante, o campo comentando "INSIRA AQUI SUA APLICACAO" será o local onde iremos programar as funcionalidades de controle. 

 

Grave o código, e com um celular conecte-se a rede WiFi que você nomeou, e então no navegador digite o endereço IP 192.168.4.1 do nosso host(ESP), fazendo isso, no monitor do Arduino IDE teremos o output com os cabeçalhos HTTP recebidos com as informações do dispositivo. 

 

Fig 2 – Resposta no Monitor Serial do Arduino IDE

 

Experimente digitar no seu navegador o IP da ESP seguido de qualquer texto, por exemplo digite 192.168.4.1/teste, e verá que o conteúdo da url digitada também é capturado, logo, através da url podemos determinar comandos a serem enviados para a ESP. 

 

Fig 3 – Comando recebido através dos cabeçalhos HTTP

 

Vamos usar essa estratégia para enviar comandos a ESP através do navegador. Neste caso enviaremos comandos para alternar o estado do LED embarcado no módulo da ESP32, que está conectado ao pino 2 da placa. 

 

No início do setup(),  adicione um comando para configurar o pino que controla o LED como sda. 

 

 

Dentro do loop(), abaixo do comentário “INSIRA AQUI SUA APLICAÇÃO”, vamos projetar o sistema para fazer a leitura dos comandos LED_ON e LED_OFF, assim podendo controlar pelo navegador o estado do LED, da seguinte maneira:

 

 

Grave o código, conecte-se a rede WiFi da ESP, e no navegador digite 192.168.4.1/LED_ON para acender o LED, ou 192.168.4.1/LED_OFF para apagar o LED. 

 

Controlando ESP32 através de uma página web com HTML 

 

Agora temos que criar nossa página web, para isso criamos a função run_html()que receberá como parâmetro o próprio client. 

 

 

Então começamos o código html com as seguintes tags usadas para iniciar um documento html.

 

 

Os seguintes comandos CSS do <head > na nossa página alinham o conteúdo de acordo com o tamanho da tela do dispositivo. 

 

 

Em seguida fazemos o corpo da nossa página que é redigida entre as tags <body></body>, e no corpo inserimos um cabeçalho com o título ‘ACIONAMENTO LED’ usando as tags <h1></h1>.

 

 

Ainda no corpo da página, inserimos um botão entre as tags <button></button> com o título ‘ON’ e comprimento de 200px e tamanho da fonte de 80px.

 

 

Anteriormente para acender o LED, tivemos que digitar no navegador o endereço IP mais o comando LED_ON, desta vez vamos atribuir essa função ao botão que acabamos de criar. 

 

Para isso colocamos a linha de código do botão entre as tags <a></a> com o link de redirecionamento, e usamos a tag <p> para posicionar os botões verticalmente. 

 

 

E de forma semelhante fazemos mais um botão para desligar o LED. 

 

 

Finalmente encerramos o documento html com a tag </html>. 

 

Dentro da função run_html(), vamos armazenar o conteúdo HTML na String html_content, e usar o comando client.println() afim de a ESP enviar o código html para o client, assim a função fica dessa forma:

 

 

Agora que nossa página web está pronta, voltaremos ao loop(), e no campo "INSIRA AQUI SUA APLICAÇÃO" adicionamos uma chamada pra função run_html(). 

 

 

Grave o código na ESP e conecte-se a rede WiFi com seu celular ou computador, e no navegador digite o IP 192.168.4.1 para carregar a página html. Agora, ao invés de digitar os comandos LED_ON ou LED_OFF no seu navegador para acionar o LED, você poderá fazer isso simplesmente acionando os botões da página, e a solicitação http será enviada do client (seu navegador) para o host (ESP). 

 

Fig 4 - Página web para controle do LED

 

Validando acesso por WiFi macaddress 

 

Importe a biblioteca ESP_ClientMacaddress. 

 

 

Acesse as configurações WiFi do seu celular e procure pelo endereço MAC (macaddress), no link você tem acesso a instruções de como visualizar o macaddress para Android, iOS, Windows Phone e PC. 

 

Fig 5 - Endereço MAC de um celular com Android

 

De volta ao código, crie um array para armazenar os bytes do endereço MAC de quaisquer dispositivos que deseje autorizar o acesso. 

 

Neste exemplo vou usar 3 macaddress fictícios, onde também deve-se definir a quantidade de dispositivos. 

 

Crie a váriavel booleana mac_conhecido. 

 

Agora instanciamos a classe ClientMacaddress, passando como parâmetro a lista de endereços MAC e a quantidade de dispositivos autorizados. 

 

 

Altere o código do campo "INSIRA AQUI SUA APLICAÇÃO" como demonstrado a seguir: 

 

 

Com essa alteração, o comando getAddr() armazena na variável m o endereço MAC do client, em seguida o comando isKnown() seta a variável mac_conhecido como true se o MAC for conhecido, ou false caso seja desconhecida, dessa forma impedindo que dispositivos não autorizados tenham acesso ao controle do LED. 

 

E pra finalizar, alteramos a função run_html(), de forma que a página web só libere acesso aos botões ON e OFF se o client tiver um endereço MAC conhecido, caso contrário carregamos a mensagem de alerta "DISPOSITIVO NÃO AUTORIZADO". 

 

 

Grave o código, e desta vez, usando um dispositivo qualquer que você NÃO tenha cadastrado o endereço MAC, conecte-se a rede WiFi da ESP e digite o IP 192.168.4.1 no seu navegador. Assim o usuário será notificado que o dispositivo não é autorizado a acessar o sistema. 

 

Fig 6 - Página web com mensagem de alerta

 

Acabamos! 

 

Neste tutorial você aprendeu a como construir um Access Point com um módulo ESP32, usando a biblioteca ESP_ClientMacaddress para realizar a validação do Endereço MAC do dispositivo conectado. 

 

Vimos um exemplo simples de como controlar um LED usando como interface uma página web, agora você pode trabalhar com base neste exemplo substituindo o LED para acionar um relé ou qualquer outro dispositivo, e também customizar a página web. 

NEWSLETTER

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Obrigado! Sua inscrição foi um sucesso.

Ops, algo deu errado. Por favor tente novamente.

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

Roger Moschiel
Possuo formação em engenharia elétrica, experiência no desenvolvimento de software embarcado (firmware) em C/C++, ambos sistema baremetal e sistema operacional de tempo real (freeRTOS). Experiência em projetos de hardware, atuando no design de esquemáticos e placas de circuito impresso (PCB) utilizando KiCad. Conhecimento em diversas tecnologias/ferramentas como Flutter, .NET Framework, Python, HTML, Javascript, SQL.

5
Deixe um comentário

avatar
 
3 Comment threads
2 Thread replies
0 Followers
 
Most reacted comment
Hottest comment thread
4 Comment authors
Guliver WatchsonVinicius ArpinoRoger MoschielMario C G Moura Recent comment authors
  Notificações  
recentes antigos mais votados
Notificar
Guliver Watchson
Visitante
Guliver Watchson

WIFI_AcessPoint:31:15: error: 'cabecalho' was not declared in this scope

cabecalho += (char)client.read();

Vinicius Arpino
Visitante
Vinicius Arpino

Boa tarde, logo lá no início na criação da rede, eu jogo o programa na placa e ela não gera a rede. O que pode ser?

Mario C G Moura
Membro
Mario C G Moura

Bom dia! Você tá de parabéns....escreve de forma concisa e objetiva.
Muito bom artigo.