مطالب علمی

تعیین موقعیت مکانی با ماژول ESP8266

تا حالا برای بدست آوردن موقعیت مکانی باید یا از ماژولهای gps یا gsm استغاده می کردیم، یا از طریقی (با سیم و یا بیسیم) اطلاعات رو از گوشی و تبلت و لپتاپ می گرفتیم. ولی آیا راهی نیست که بتونیم بدون نیاز به موارد بالا مستقیم موقعیت رو بدست بیاریم؟؟ خوشبختانه چرا هست

هممون از سرویسهای google map و مشتقاتش استفاده کردیم و راجبش اطلاعات داریم. این سرویس از چند سال پیش امکاناتی رو اضافه کرده که سایتها و اپلیکیشن ها می توانند از طریق api گوگل، باهاش کار کنند و موقعیت مکانی مخاطبان سایت و برنامه را بدست بیاورند (البته با اجازه خود کاربر)
حالا چطوری؟؟؟

esp00

سیستم تخمین موقعیت بر اساس آنتنهای موبایل اطراف میباشد.. این سیستم جهت تخمین موقعیت نیازی به سیستم ماهواره ای GPS ندارد و برای مواردی کاربرد خواهد داشت که خودرو داخل تونل یا پارکینگهای مسقف قرار دارد و به دلیل مسقف بودن محل امکان موقعیت یابی ماهواره ای GPS وجود نداشته باشد..

اما روش کار این سیستم چگونه است؟
دکلهای مخابراتی که با نام BTS یا Base Transceiver Station شناخته میشوند را همگی دیده ایم.. هر BTS دارای مشخصات منحصر بفردی در دنیا میباشد.. این مشخصات شامل موارد زیر میباشند : MCC یا Mobile Country Code که نشان دهنده کد کشور میباشد…MNC یا Mobile Network Code که کد اپراتور سرویس دهنده میباشد… LAC یا Location Area Code نشان دهنده کد منطقه میباشد و CellID که نشاندهنده کد آن دکل BTS در منطقه میباشد.. سیستم دزدگیر و ردیاب ماهواره ای خودرو با بدست آوردن این مشخصات از روی نزدکترین دکلهای اطراف که دارای سیگنال قویتری هستند و میانگین گیری کردن از موقعیت آنها نزدیکترین موقعیت را تخمین میزند..همانطور که گفته شد این تخمین نیازی به سیستم GPS نداشته و حتی در مکانهای مسقف نیز محدوده مکانی خودرو را تخمین میزند.

esp01

api چیست؟

مختصرا بخوام بگم یسری دستورات و روشی هست که (در اینجا) گوگل مشخص کرده که شما با این دستورات بسادگی میتونید درخواستهاتون رو بفرستید بهش وجوابها رو هم بگیرید.

گرفتن API KEY:
میخوایم با سرویس google geolocation کار کنیم. در ابتدا نیاز به یک api key مخصوص به خودمون داریم که پس از اینکه وارد اکانت گوگل خود شدید، میتوانید از طریق این لینک اون رو برای خودتان بسازید. البته برای باز شدن صفحه به دلیل اینکه این سرویس مثل تقریبا همه سرویسهای گوگل برای آیپی ایران بسته است نیازمند راهی جهت عبور از آن می باشید.به هر نحوی که خود می توانید وارد صفحه ذکر شده شوید و روی get a key کلیک کنید:
geo1
مرحله بعدش اگر قبلا پروژه ای ساخته باشید ازتون میخواد که یکی از اونها رو از تو لیست انتخاب کنید و یا اگر دفعه اول باشه  باید یه اسم برای پروژتون انتخاب کنید:
Get a APi Key
حال کلید داده شده را کپی و در یک جای امن ذخیره کنید.
API Key
قبل از ادامه مطلب پیشنهاد میکنم دوستان یسری اطلاعات درمورد انواع ارتباط با اینترنت و پروتکل های ارتباطیش و انواع درخواستها و … کسب کنند که برای کار با ماژولهای esp شدیدا مورد نیاز است. یکی از این اطلاعات هم شناخت و کار با فرمت json می باشد که اگه بتونید خوب باهاش کار کنید، پروژه های مشابه این پروژه براحتی میتونید راه اندازی کنید و با api مربوطه ارتباط برقرار کنید. پروژه هایی مثل دستورات صدا و کلامی ، اطلاعات آب وهوا و دما ، ساعت ntp و… برای راه اندازی و برنامه نویسی esp8266 از آردوینواستفاده شده است.
برنامه نویسی:
برنامش چیز خاصی نداره فقط باید درخواست رو تحت همون فرمت json ارسال و اطلاعات رو هم با همون فرمت دریافت کنید. خبر خوب اینکه یه دوست عزیزی این کاررو هم برامون انجام داده و کارمون رو راحت و آسون کرده در صفحه گیت هاب ایشون دو فایل آردوینو هست: یکی خروجی رو روی oled نشون میده و دیگری در پنجره سریال مانیتور. چون ما معمولا طول وعرض جغرافیایی بدست آورده را نه برای نمایش بلکه برای ارسال یا دیدن در نقشه و … نیاز دارم پس من از فایل Geolocation_without_display.ino استفاده کردم.
https://github.com/techiesms/Geolocation
فقط موارد زیررا بایدمتناسب با شرایط خودتان در فایل تغییر بدهید:
myssid و mypass » نام و پسورد مودم برای اتصال به اینترنت ماژولesp
homeMobileCountryCode همان mcc
key  همان api key که از گوگل گرفتیم
homeMobileNetworkCode» همان mnc
mcc و mnc رو میتونید از یکی ازاین دو لینک بگیرید: این لینک یا این لینک   که mccبرای ایران 432 هست و mnc بستگی به اپراتور اینترنتتون داره.

برنامه تعیین موقعیت مکانی با ماژول ESP8266:

/*********************************************************************  This is the code for Fetching your location from Google Geolocation API
   
  This code is provided by 
  techiesms
*********************************************************************/
 
 
[URL=https://www.eca.ir/forums/usertag.php?do=list&action=hash&hash=include]#include[/URL]  <ESP8266HTTPClient.h>
[URL=https://www.eca.ir/forums/usertag.php?do=list&action=hash&hash=include]#include[/URL]  <ArduinoJson.h>
[URL=https://www.eca.ir/forums/usertag.php?do=list&action=hash&hash=include]#include[/URL]  "ESP8266WiFi.h"
 
 
char myssid[] = "SSID"         // your network SSID (name)
char mypass[] = "PASS"          // your network password
 
 
 
 
//Credentials for 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; // set to 1 for more debug output
 
 
 
 
 
 
 
 
void setup()   {
  Serial.begin(115200);
 
 
 
 
  Serial.println("Start");
  // Set WiFi to station mode and disconnect from an AP if it was previously connected
  WiFi.mode(WIFI_STA);
  WiFi.disconnect();
  delay(100);
  Serial.println("Setup done");
  // We start by connecting to a WiFi network
  Serial.print("Connecting to ");
  Serial.println(myssid);
  WiFi.begin(myssid, mypass);
 
 
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println(".");
 
 
 
 
}
 
 
 
 
void loop() {
 
 
  char bssid[6];
  DynamicJsonBuffer jsonBuffer;
  Serial.println("scan start");
  // WiFi.scanNetworks will return the number of networks found
  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) {
      // Print out the formatted json...
      Serial.println("{");
      Serial.println("\"homeMobileCountryCode\": 432,");  // this is a real UK MCC
      Serial.println("\"homeMobileNetworkCode\": 19,");   // and a real UK MNC
      Serial.println("\"radioType\": \"gsm\",");          // for gsm
      Serial.println("\"carrier\": \"Vodafone\",");       // associated with Vodafone
      //Serial.println("\"cellTowers\": [");                // I'm not reporting any cell towers
      //Serial.println("],");
      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(" ");
  }
  // now build the jsonString...
  jsonString = "{\n";
  jsonString += "\"homeMobileCountryCode\": 432,\n"; // this is a real UK MCC last 234
  jsonString += "\"homeMobileNetworkCode\": 19,\n";  // and a real UK MNC lasr 27
  jsonString += "\"radioType\": \"gsm\",\n";         // for gsm
  jsonString += "\"carrier\": \"Vodafone\",\n";      // associated with Vodafone
  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("");
 
 
  WiFiClientSecure client;
 
 
  //Connect to the client and make the api call
  Serial.print("Requesting URL: ");
  Serial.println("https://" + (String)Host + thisPage + "AIzaSyCYNXIYINPmTNIdusMjJloS4_BXSOff1_g");
  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);
  }
 
 
  //Read and parse all the lines of the reply from server
  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);
 
}

اجرا:
پس از کامپایل و اجرا در پنجره سریال مانیتور، مقدار دو عبارت
Latitudeو Longitude طول و عرض جغرافیایی ما هستند.
نمایش:
برای مشاهده میتوانید از این لینک استفاده کرده ، مقادیر بالا را درآن جایگزین کرده و در مرورگر کروم یا … لینک مذکور رو اجرا کنید

https://www.google.com/maps/@Latitude,Longitude,18z
18z میزان زوم تصویر می باشد.

لینک مطلب در انجمن: https://www.eca.ir/forums/thread78943.html

نویسنده: digi-rx

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا