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.

fig1
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. 

fig2
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. 

fig3 1
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). 

fig4 1
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. 

fig5
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. 

fig6
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. 

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

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

Comentários:
Notificações
Notificar
guest
10 Comentários
recentes
antigos mais votados
Inline Feedbacks
View all comments
Guliver Watchson
Guliver Watchson
14/08/2019 17:41

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

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

Felipe Jorge
Felipe Jorge
Reply to  Guliver Watchson
06/09/2019 16:56

Tive esse mesmo erro, a espera da solução

Thiago Tavares
Thiago Tavares
Reply to  Felipe Jorge
16/09/2019 19:04

Basta vc colocar String cabecalho antes do while(client.connected())

Thiago Tavares
Thiago Tavares
Reply to  Guliver Watchson
16/09/2019 15:25

Tive o mesmo erro

Rogerio
Rogerio
05/02/2020 01:23

Olá Roger.
Muito bom artigo.
Parabéns !
Gostaria de saber se há como passar um numero pela url.
De preferência usando um formulário.
Obrigado.

Vinicius Arpino
Vinicius Arpino
05/06/2019 14:29

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
19/03/2019 05:44

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

Talvez você goste:

Séries

Menu