Introdução
A localização de dispositivos IoT é um recurso cada vez mais explorado em soluções conectadas, especialmente quando o uso de GPS não é viável — seja por custo, consumo ou cobertura. Uma alternativa interessante é utilizar as redes Wi-Fi próximas para estimar a posição de um dispositivo, com a ajuda da Google Geolocation API.
A geolocalização baseada em redes Wi-Fi é um método de posicionamento que utiliza os pontos de acesso ao redor do dispositivo para estimar suas coordenadas geográficas.
O processo é baseado em três pilares principais:
1. Identificação de redes próximas: cada ponto de acesso Wi-Fi possui um identificador único chamado BSSID (Basic Service Set Identifier), que geralmente corresponde ao endereço MAC do roteador.
2. Força do sinal recebido (RSSI): a intensidade do sinal medida pelo dispositivo dá uma noção aproximada da distância até o ponto de acesso.
3. Base de dados de localização: grandes provedores de serviços, como o Google, mantêm bancos de dados atualizados de pontos de acesso e suas localizações geográficas. Essa base é alimentada de forma contínua por milhões de dispositivos móveis que coletam e reportam informações de Wi-Fi e GPS.
A Google Geolocation API funciona recebendo uma lista de pontos de acesso (BSSID + intensidade do sinal) e retornando uma estimativa da latitude e longitude baseada na triangulação dessas “âncoras”. Quanto maior for o número de redes detectadas, maior a precisão.
Esse método é especialmente útil em ambientes urbanos ou internos (indoor), onde o sinal de GPS pode ser fraco ou inexistente.
Pré-requisitos
Para reproduzir o exemplo, você vai precisar:
- ESP32 com suporte a Wi-Fi (ex.: ESP32-DevKitC, ESP32-S3 etc.)
- VSCode com o Platformio Instalado ou ArduinioIDE
- Biblioteca ArduinoJson instalada
No exemplo a seguir, vamos utilizar uma chave de API do Google disponível nos serviços de geolocalização do html5, dessa forma que seu navegador pode conhecer sua localização. Mais detalhes de como obter essa chave no vídeo 1 do Hacker ético Gabriel Pato.
Exemplo prático no ESP32
O código abaixo mostra como escanear redes Wi-Fi com o ESP32 e enviar os dados para a Google Geolocation API.
#include <Arduino.h>
#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
// Substitua pela sua chave da API Google
const char* apiKey = "AIzaSyBOti4mM-6x9WDnZIjIeyEU21OpBXqWBgw";
// Credenciais da rede WiFi
const char* ssid = "Seu_SSID";
const char* password = "Sua_Senha";
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
Serial.print("Conectando ao WiFi...");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi conectado!");
}
void loop() {
if (WiFi.status() == WL_CONNECTED) {
// Escaneia redes Wi-Fi próximas
int n = WiFi.scanNetworks();
Serial.printf("Encontradas %d redes\n", n);
if (n > 0) {
// Monta JSON para enviar à API
StaticJsonDocument<1024> doc;
JsonArray wifiAccessPoints = doc.createNestedArray("wifiAccessPoints");
for (int i = 0; i < n; i++) {
JsonObject ap = wifiAccessPoints.createNestedObject();
ap["macAddress"] = WiFi.BSSIDstr(i);
ap["signalStrength"] = WiFi.RSSI(i);
}
String requestBody;
serializeJson(doc, requestBody);
// Monta URL da API
String url = "https://www.googleapis.com/geolocation/v1/geolocate?key=" + String(apiKey);
HTTPClient http;
http.begin(url);
http.addHeader("Content-Type", "application/json");
int httpResponseCode = http.POST(requestBody);
if (httpResponseCode > 0) {
String response = http.getString();
Serial.println("Resposta da API:");
Serial.println(response);
// Parse da resposta
StaticJsonDocument<512> resp;
DeserializationError error = deserializeJson(resp, response);
if (!error) {
float lat = resp["location"]["lat"];
float lng = resp["location"]["lng"];
float acc = resp["accuracy"];
Serial.printf("Latitude: %f\nLongitude: %f\nPrecisao: %.2f m\n", lat, lng, acc);
}
} else {
Serial.printf("Erro na requisicao: %d\n", httpResponseCode);
}
http.end();
}
delay(30000); // Faz nova consulta a cada 30s
}
}
Vale ressaltar que a chave de API deve ser gerada através da conta do usuário, para garantir que não seja alterada e não gerar consequências futuras.
Saída esperada
No monitor serial, você deverá ver algo como:
Encontradas 7 redes
Resposta da API:
{"location": {"lat": -23.550520, "lng": -46.633308}, "accuracy": 42}
Latitude: -23.550520
Longitude: -46.633308
Precisao: 42.00 m
A API retorna a posição com uma precisão em metros, dependendo da densidade de pontos de acesso Wi-Fi na região.
Considerações importantes
- A precisão varia bastante em áreas urbanas (muitos APs) e rurais (poucos APs).
- É possível combinar essa abordagem com GPS para obter melhores resultados (geo-fusion).
Conclusão
A utilização da Google Geolocation API com o ESP32 é uma alternativa eficiente ao GPS em diversas aplicações IoT. Essa abordagem consome menos energia, pode ser implementada em dispositivos de baixo custo e abre possibilidades para soluções em rastreamento, logística e automação.
E você, já experimentou usar geolocalização baseada em Wi-Fi em seus projetos? Quais métodos ou alternativas você considera mais eficazes — GPS, triangulação por torres de celular, Bluetooth ou até outras APIs?
Compartilhe sua experiência nos comentários e vamos enriquecer a discussão sobre esse tema!
Referências
https://developers.google.com/maps/documentation/geolocation/overview?hl=pt-br




