цифровая электроника
вычислительная техника
встраиваемые системы

 



Как определить местоположение с помощью ESP8266 NodeMCU без GPS

Автор: Mike(admin) от 10-01-2019, 07:55

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


Как определить местоположение с помощью ESP8266 NodeMCU без GPS

Здесь мы будем использовать плату 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 Geolocation API

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


Google Geolocation API

Так что чем больше количество 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 (Начать).


Google Geolocation API

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


Google Geolocation API

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


Google Geolocation API

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


Google Geolocation 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\": ");
.....
....

Загрузите полный код, указанный в конце материала, и откройте последовательный монитор. Вы увидите координаты и точность вашего местоположения, как показано ниже.


Как определить местоположение с помощью ESP8266 NodeMCU без GPS

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


Как определить местоположение с помощью ESP8266 NodeMCU без GPS

Итак, мы увидели, как легко узнать текущее местоположение любых устройств, просто используя универсальный 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


Теги: ESP8266, Wi-Fi, WiFi




Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Комментарии:

Оставить комментарий