3 de agosto de 2019

WiFi Scan com ESP32 - Buscando e conectando em redes abertas

O circuito permanece verificando as redes WiFi disponíveis e, quando encontrar redes abertas efetua a conexão na que estiver com o melhor sinal.


Quando já conectado, continua verificando se existem redes abertas com um melhor sinal e, caso exista, faz a conexão na nova rede.

Para esse projeto foi utilizado o ESP32 e as informações de conexões de rede são exibidas através da comunicação serial. O led da placa sinaliza quando o circuito está conectado no wifi.

O circuito exibe todas as redes WiFi encontradas. Quanto mais próximo de zero estiver o valor do sinal, melhor sua força. As redes que estiverem com um asterisco (*) são seguras, protegidas por senha.

No exemplo abaixo existem duas redes abertas, EfeitoNerd.com.br e Millennium Falcon.


Neste novo exemplo não foram encontradas nenhuma rede aberta disponível.


Segue o código fonte:

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
/*---------------------------------------------------------
  Programa : WIFI SCAN OPEN NETWORKS - ESP32
  Autor    : Fellipe Couto [ http://www.efeitonerd.com.br ]
  Data     : 03/08/2019
  ---------------------------------------------------------*/
#include <WiFi.h>      //Biblioteca para utilização do WiFi
#define LED_BUILTIN 2  //Led no GPIO 2 no ESP32

String wifiConnected = ""; //Variável para controle do nome da rede conectada

/*--- SETUP ---*/
void setup() {
  Serial.begin(115200); //Inicializa a comunicação serial com taxa de transmissão de 115200 baud rate
  pinMode(LED_BUILTIN, OUTPUT); //Configura o pino do led
}

/*--- LOOP PRINCIPAL ---*/
void loop() {
  //Retorna o nome da rede aberta com melhor sinal
  String ssid = wifiScanOpenNet();

  if (ssid != "" && ssid != wifiConnected) {
    //Se retornou nome de rede wifi e a rede for diferente da atual, tenta a conexão
    wifiConnect(ssid);

  } else if (ssid != "" && ssid == wifiConnected) {
    //Se retornou nome de rede wifi e a rede for igual a atual, permanece conectado
    Serial.println("Ja conectado na rede!\n");

  } else if (ssid == "" || WiFi.status() != WL_CONNECTED) {
    //Se não retornou nome de rede wifi ou o status da conexão estiver diferente de conectado
    WiFi.disconnect();
    wifiConnected = "";
    digitalWrite(LED_BUILTIN, LOW);
  }

  delay(20000);
}

/*--- VERIFICA REDES WIFI ABERTAS ---*/
String wifiScanOpenNet() {
  Serial.println("Procurando redes WiFi...");

  int countWifi = WiFi.scanNetworks(); //Retorna a quantidade de redes wifi disponíveis
  int openWifi = 0; //Variável para contar quantas redes abertas foram encontradas
  String ssid = "";

  //Exibe as redes wifi encontradas
  if (countWifi > 0) {
    Serial.println(String(countWifi) + " redes encontradas.\n");
    delay(500);
    for (int i = 0; i < countWifi; ++i) {
      Serial.print(i + 1);
      Serial.print(": ");
      Serial.print(WiFi.SSID(i));
      Serial.print(" (");
      Serial.print(WiFi.RSSI(i));
      Serial.print(") ");
      if (WiFi.encryptionType(i) != WIFI_AUTH_OPEN) {
        Serial.println("*");
      } else {
        Serial.println();
        openWifi++;
      }
    }
  } else {
    Serial.println("Nenhuma rede encontrada.");
    return ssid;
  }
  delay(2000);

  //Exibe os dados da rede wifi aberta com melhor sinal
  if (openWifi > 0) {
    for (int i = 0; i < countWifi; ++i) {
      if (WiFi.encryptionType(i) == WIFI_AUTH_OPEN) {
        Serial.println("\nRede aberta com melhor sinal:");
        Serial.print("SSID: ");
        Serial.print(WiFi.SSID(i));
        Serial.print("\t\tSINAL: ");
        Serial.print(WiFi.RSSI(i));
        Serial.print("\t\tCANAL: ");
        Serial.println(WiFi.channel(i));
        Serial.println();
        ssid = WiFi.SSID(i);
        break; //Finaliza o loop
      }
    }
  } else {
    Serial.println("\nNenhuma rede aberta encontrada.\n");
  }
  delay(2000);

  return ssid;
}

/*--- EFETUA CONEXÃO COM REDE WIFI ---*/
void wifiConnect(String ssid) {
  char wifiSSID[50];
  ssid.toCharArray(wifiSSID, 50);

  WiFi.disconnect();    //Fecha conexão aberta
  WiFi.begin(wifiSSID); //Efetua a conexão com a rede wifi

  Serial.print("Conectando no WiFi " + ssid + ".");
  int times = 0;

  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
    times++;
    if (times == 250) break; //Mantém aguardando conexão por 15 segundos
    delay(100);
  }

  if (WiFi.status() == WL_CONNECTED) {
    wifiConnected = ssid;
    Serial.println("\nWiFi conectado!\n");
    digitalWrite(LED_BUILTIN, HIGH);
  } else {
    wifiConnected = "";
    Serial.println("\nNao foi possivel conectar.\n");
    digitalWrite(LED_BUILTIN, LOW);
  }
}

Nenhum comentário:

Postar um comentário