Вы когда-нибудь задумывались о том, чтобы узнать местоположение вашего устройства без использования какого-либо оборудования GPS? Звучит интересно! Да, можно получить координаты местоположения, просто используя плату NodeMCU ESP8266 без какого-либо дополнительного оборудования.

Здесь мы будем использовать плату ESP12E, чтобы получить координаты нашего местоположения в реальном времени. Это становится возможным благодаря Google Geolocation API. Итак, давайте посмотрим, как работает этот API геолокации и как мы можем получить данные о местоположении с помощью этого инструмента.
Для начала рассмотрим, как работает Google Geolocation API. Как все мы знаем, ОС Android для смартфонов работает на платформе Google. Как правило, в большинстве телефонов GPS и Wi-Fi включены постоянно, поэтому Google не только отслеживает наше местоположение, но и отслеживает близлежащие сети Wi-Fi. Например, если вы идете по улице с включенным Wi-Fi и GPS, и ваш телефон постоянно сканирует близлежащие сети Wi-Fi и что при этом делает Google – он сохраняет MAC-адреса и названия этих сетей Wi-Fi вместе с расположение нашего телефона.

Таким образом, основываясь на уровне сигнала, полученного на телефоне, Google оценивает местоположение этой конкретной сети Wi-Fi и сохраняет эти данные в базе данных. Поэтому в следующий раз, если кто-нибудь пройдет мимо тех же сетей Wi-Fi и не включит GPS в своем телефоне, он все равно сможет определить местоположение телефона на основе местоположения этой конкретной сети Wi-Fi.

Так что чем больше количество Wi-Fi сетей поблизости, тем точнее будет местоположение. Теперь мы будем использовать эту магию Geolocation API в плате NodeMCU ESP12E и попытаемся получить координаты местоположения. Здесь мы будем использовать последовательный монитор Arduino IDE, чтобы увидеть координаты. В качестве альтернативы вы можете связать OLED-дисплей с ESP12-e для отображения данных или, если вы новичок в работе с ESP, тогда начните с индикации с помощью мигающего светодиода на ESP12E.
Чтобы использовать сервис геолокации Google, нам нужен аккаунт Google и ключ API. Выполните следующие шаги, чтобы получить ключ API. Сначала перейдите на страницу разработчиков Google, войдите под своей учетной записью Google, нажмите Get API key (Получить ключ API) и затем нажмите Get started (Начать).

Нажав на кнопку Get started, откроется новое окно, как показано ниже.

Выберите Maps (Карты) и Places (Места), затем нажмите Continue (Продолжить). Дайте название своему проекту, затем нажмите Next (Далее).

Следующим шагом является Set up billing (Настройка биллинга). Вы должны сохранить данные своей банковской карты. Хотя эта услуга бесплатна в течение года, это просто для проверки того, что вы не робот. Через год сервис не будет удерживать сумму с вашего счета без вашего разрешения. Так что, просто заполните детали и переходите к далее. После этого вы получите свой ключ API. Скопируйте этот ключ и сохраните его в блокноте. Нам потребуется этот ключ в нашем коде.

Здесь мы будем использовать Arduino IDE для программирования ESP12. Итак, убедитесь, что вы скачали файлы платы ESP8266. Полный код дается в конце проекта. Для программирования нам понадобятся три библиотеки ESP8266HTTPClient, ArduinoJson, ESP8266WiFi. Затем мы инициализируем переменные для наименования сети Wi-Fi, пароля Wi-Fi, ключа API и инициализируем другие переменные, используемые в коде.
char ssid[] = "********"; // имя SSID сети
char pass[] = "********"; // пароль сети
String key = "your api key";
…
..
double latitude = 0.0;
double longitude = 0.0;
double accuracy = 0.0;
В функции настройки (setup) мы устанавливаем Wi-Fi в режим станции и отключаемся от точки доступа, если она была ранее была подключена.
void setup() {
Serial.begin(9600);
Serial.println("Start");
WiFi.mode(WIFI_STA);
WiFi.disconnect();
delay(100);
Serial.println("Setup done");
…
..
В бесконечном цикле мы будем сканировать все близлежащие сети Wi-Fi и извлекать MAC-адрес и мощность этих сетей. Затем мы создаем строку json из извлеченной информации и отправляем ее в облако Google, а взамен получаем координаты местоположения, то есть широты, долготы и точности. Точность будет зависеть от количества доступных сетей Wi-Fi.
int n = WiFi.scanNetworks();
Serial.println("scan done");
if (n == 0)
Serial.println("no networks found");
else
{
Serial.print(n);
Serial.println(" networks found...");
if (more_text) {
Serial.println("\"wifiAccessPoints\": [");
for (int i = 0; i < n; ++i)
{
Serial.println("{");
Serial.print("\"macAddress\" : \"");
Serial.print(WiFi.BSSIDstr(i));
Serial.println("\",");
Serial.print("\"signalStrength\": ");
.....
....
Загрузите полный код, указанный в конце материала, и откройте последовательный монитор. Вы увидите координаты и точность вашего местоположения, как показано ниже.

Теперь откройте Google Maps на своем смартфоне и введите широту и долготу, разделенные запятой. Вы увидите свое местоположение на карте, как показано далее.

Итак, мы увидели, как легко узнать текущее местоположение любых устройств, просто используя универсальный ESP12, без необходимости использования GPS-модуля. Полный код проекта:
#include <ESP8266HTTPClient.h>
#include <ArduinoJson.h>
#include "ESP8266WiFi.h"
char ssid[] = "********"; // имя SSID сети
char pass[] = "********"; // пароль сети
// Учетные данные для Google GeoLocation API
const char* Host = "www.googleapis.com";
String thisPage = "/geolocation/v1/geolocate?key=";
String key = "your api key";
int status = WL_IDLE_STATUS;
String jsonString = "{\n";
double latitude = 0.0;
double longitude = 0.0;
double accuracy = 0.0;
int more_text = 1; // установить 1 для большего количества отладочных выходных данных
void setup() {
Serial.begin(9600);
Serial.println("Start");
// Установите WiFi в режим станции и отключитесь от точки доступа, если она была ранее подключена
WiFi.mode(WIFI_STA);
WiFi.disconnect();
delay(100);
Serial.println("Setup done");
// Начнем с подключения к сети WiFi
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(".");
}
void loop() {
char bssid[6];
DynamicJsonBuffer jsonBuffer;
Serial.println("scan start");
// WiFi.scanNetworks вернет количество найденных сетей
int n = WiFi.scanNetworks();
Serial.println("scan done");
if (n == 0)
Serial.println("no networks found");
else
{
Serial.print(n);
Serial.println(" networks found...");
if (more_text) {
Serial.println("\"wifiAccessPoints\": [");
for (int i = 0; i < n; ++i)
{
Serial.println("{");
Serial.print("\"macAddress\" : \"");
Serial.print(WiFi.BSSIDstr(i));
Serial.println("\",");
Serial.print("\"signalStrength\": ");
Serial.println(WiFi.RSSI(i));
if (i < n - 1)
{
Serial.println("},");
}
else
{
Serial.println("}");
}
}
Serial.println("]");
Serial.println("}");
}
Serial.println(" ");
}
// Теперь создадим jsonString
jsonString = "{\n";
jsonString += "\"homeMobileCountryCode\": 234,\n";
jsonString += "\"homeMobileNetworkCode\": 27,\n";
jsonString += "\"radioType\": \"gsm\",\n";
jsonString += "\"carrier\": \"Vodafone\",\n";
jsonString += "\"wifiAccessPoints\": [\n";
for (int j = 0; j < n; ++j)
{
jsonString += "{\n";
jsonString += "\"macAddress\" : \"";
jsonString += (WiFi.BSSIDstr(j));
jsonString += "\",\n";
jsonString += "\"signalStrength\": ";
jsonString += WiFi.RSSI(j);
jsonString += "\n";
if (j < n - 1)
{
jsonString += "},\n";
}
else
{
jsonString += "}\n";
}
}
jsonString += ("]\n");
jsonString += ("}\n");
//-------------------------------------------------------------------- Serial.println("");
// Подключитесь к клиенту и сделайте вызов API
WiFiClientSecure client;
Serial.print("Requesting URL: ");
Serial.println("https://" + (String)Host + thisPage + key);
Serial.println(" ");
if (client.connect(Host, 443)) {
Serial.println("Connected");
client.println("POST " + thisPage + key + " HTTP/1.1");
client.println("Host: " + (String)Host);
client.println("Connection: close");
client.println("Content-Type: application/json");
client.println("User-Agent: Arduino/1.0");
client.print("Content-Length: ");
client.println(jsonString.length());
client.println();
client.print(jsonString);
delay(500);
}
// Прочитать и разобрать все строки ответа с сервера
while (client.available()) {
String line = client.readStringUntil('\r');
if (more_text) {
Serial.print(line);
}
JsonObject& root = jsonBuffer.parseObject(line);
if (root.success()) {
latitude = root["location"]["lat"];
longitude = root["location"]["lng"];
accuracy = root["accuracy"];
}
}
Serial.println("closing connection");
Serial.println();
client.stop();
Serial.print("Latitude = ");
Serial.println(latitude, 6);
Serial.print("Longitude = ");
Serial.println(longitude, 6);
Serial.print("Accuracy = ");
Serial.println(accuracy);
}
© digitrode.ru