Manual
do
Maker
.
com
No artigo anterior vimos como procurar por uma determinada porta em uma rede à qual o ESP32 esteja conectado. Nesse artigo veremos algo que talvez seja ainda mais interessante: faremos o ESP32 chegar portas abertas em nosso computador. Dessa vez vou pular os conceitos de rede, que estão descritos no artigo citado ao início do parágrafo.
Invés de fazer o scan na rede toda, dessa vez o ESP32 fará scan em somente 1 host. Para tal, o ESP32 deve ser colocado em modo AP. Ao conectar-se a ele, é iniciada a varredura do computador conectado, em busca de portas de serviço abertas. Aqui teremos alguns pontos muito interessantes.
No artigo anterior mantive o timeout padrão, o que já não é lá tão aceitável. Mas para varrer mais de 60.000 portas, é impossível manter o padrão do artigo anterior. Por essa razão, redefinimos o tempo do socket para um rápido escaneamento.
O ESP32 deve identificar uma conexão, uma vez que não há um serviço rodando para a estação se conectar a ele. Quando uma conexão ao ESP32 acontece, o número de estações conectadas é incrementada, então saímos de 0 para algum valor. Como esperamos ter apenas 1 estação conectada para o escaneamento, verificamos se o retorno dessa função é igual a 1, então chamamos a função scanPorts(). Presumidamente o IP atribuído à estação será 192.168.4.2, exceto se os parâmetros de rede sejam modificados.
Como ainda estou usando a Heltec Wireless Stick para o artigo, aproveitei o display para exibir as portas abertas. Na função scanPorts() está definido um atraso de 3 segundos, para que seja possível acompanhar no display as portas abertas. Nada que não possa ser solucionado gerando arquivos de log, salvos no sistema de arquivos do ESP32/ESP8266.
O código, atendendo aos requisitos supracitados, é esse:
#include <Arduino.h>
#include <WiFi.h>
#include "heltec.h"
#define OLED_UPDATE_INTERVAL 500
const char* ssid = "ESP32 Scanner";
const char* password = "01234567";
void scanPorts(){
//Hora de fazer o loop, varrendo os hosts e descobrindo se a porta está aberta
for (unsigned long int port=23; port<5000;port++){ //0 é reserva de rede e 255 é o broadcast
String target = "192.168.4.2";
WiFiClient client;
client.setTimeout(1);
if (client.connect(target.c_str(), port)) {
client.setTimeout(1);
Serial.print("Porta aberta: ");
Serial.println(port);
client.stop();
String msgH = "Porta aberta";
String msgP = String(port);
Heltec.display->clear();
Heltec.display->drawString(0, 0, msgH);
Heltec.display->drawString(0, 10, msgP);
Heltec.display->display();
vTaskDelay(pdMS_TO_TICKS(3000));
}
}
}
void setupWIFI(){
Heltec.display->clear();
Heltec.display->drawString(0, 0, "Connecting...");
Heltec.display->drawString(0, 10, String(ssid));
Heltec.display->display();
WiFi.softAP(ssid, password);
Heltec.display->clear();
Heltec.display->drawString(0, 0, "Conectado");
Heltec.display->drawString(0, 10, "Ate logo");
Heltec.display->display();
delay(5000);
Heltec.display->clear();
Heltec.display->display();
Heltec.display->clear();
}
void setup(){
pinMode(0,INPUT_PULLDOWN);
Heltec.begin(true /*DisplayEnable Enable*/, false /*LoRa Disable*/, true /*Serial Enable*/);
pinMode(25, OUTPUT);
while (!Serial) {
vTaskDelay(pdMS_TO_TICKS(10));
}
setupWIFI();
//se escolhida a opção 2, a primeira chamada pode ser no setup:
vTaskDelay(pdMS_TO_TICKS(2000));
}
void loop() {
if (WiFi.softAPgetStationNum() == 1){
scanPorts();
}
delay(5000);
}
O vídeo de apresentação desse artigo está disponível em nosso canal DobitaobyteBrasil no Youtube. Se não é inscrito, prestigie-nos. Se gostar do vídeo, deixe seu like. Se tiver sugestões de artigos, deixe nos comentários dos vídeos.
O link direto para o vídeo é esse.
Gostou do ESP32? Esse modelo está disponível na CurtoCircuito através desse link. Já escrevi alguns artigos sobre ele, como esse color picker e recomendo bastante.
Até a próxima!
Revisão: Ricardo Amaral de Andrade
Inscreva-se no nosso canal Manual do Maker no YouTube.
Também estamos no Instagram.
Autor do blog "Do bit Ao Byte / Manual do Maker".
Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.