تعیین موقعیت مکانی با ماژول ESP8266
تا حالا برای بدست آوردن موقعیت مکانی باید یا از ماژولهای gps یا gsm استغاده می کردیم، یا از طریقی (با سیم و یا بیسیم) اطلاعات رو از گوشی و تبلت و لپتاپ می گرفتیم. ولی آیا راهی نیست که بتونیم بدون نیاز به موارد بالا مستقیم موقعیت رو بدست بیاریم؟؟ خوشبختانه چرا هست
هممون از سرویسهای google map و مشتقاتش استفاده کردیم و راجبش اطلاعات داریم. این سرویس از چند سال پیش امکاناتی رو اضافه کرده که سایتها و اپلیکیشن ها می توانند از طریق api گوگل، باهاش کار کنند و موقعیت مکانی مخاطبان سایت و برنامه را بدست بیاورند (البته با اجازه خود کاربر)
حالا چطوری؟؟؟
سیستم تخمین موقعیت بر اساس آنتنهای موبایل اطراف میباشد.. این سیستم جهت تخمین موقعیت نیازی به سیستم ماهواره ای GPS ندارد و برای مواردی کاربرد خواهد داشت که خودرو داخل تونل یا پارکینگهای مسقف قرار دارد و به دلیل مسقف بودن محل امکان موقعیت یابی ماهواره ای GPS وجود نداشته باشد..
اما روش کار این سیستم چگونه است؟
دکلهای مخابراتی که با نام BTS یا Base Transceiver Station شناخته میشوند را همگی دیده ایم.. هر BTS دارای مشخصات منحصر بفردی در دنیا میباشد.. این مشخصات شامل موارد زیر میباشند : MCC یا Mobile Country Code که نشان دهنده کد کشور میباشد…MNC یا Mobile Network Code که کد اپراتور سرویس دهنده میباشد… LAC یا Location Area Code نشان دهنده کد منطقه میباشد و CellID که نشاندهنده کد آن دکل BTS در منطقه میباشد.. سیستم دزدگیر و ردیاب ماهواره ای خودرو با بدست آوردن این مشخصات از روی نزدکترین دکلهای اطراف که دارای سیگنال قویتری هستند و میانگین گیری کردن از موقعیت آنها نزدیکترین موقعیت را تخمین میزند..همانطور که گفته شد این تخمین نیازی به سیستم GPS نداشته و حتی در مکانهای مسقف نیز محدوده مکانی خودرو را تخمین میزند.
api چیست؟
مختصرا بخوام بگم یسری دستورات و روشی هست که (در اینجا) گوگل مشخص کرده که شما با این دستورات بسادگی میتونید درخواستهاتون رو بفرستید بهش وجوابها رو هم بگیرید.
میخوایم با سرویس google geolocation کار کنیم. در ابتدا نیاز به یک api key مخصوص به خودمون داریم که پس از اینکه وارد اکانت گوگل خود شدید، میتوانید از طریق این لینک اون رو برای خودتان بسازید. البته برای باز شدن صفحه به دلیل اینکه این سرویس مثل تقریبا همه سرویسهای گوگل برای آیپی ایران بسته است نیازمند راهی جهت عبور از آن می باشید.به هر نحوی که خود می توانید وارد صفحه ذکر شده شوید و روی get a key کلیک کنید:
برنامش چیز خاصی نداره فقط باید درخواست رو تحت همون فرمت json ارسال و اطلاعات رو هم با همون فرمت دریافت کنید. خبر خوب اینکه یه دوست عزیزی این کاررو هم برامون انجام داده و کارمون رو راحت و آسون کرده در صفحه گیت هاب ایشون دو فایل آردوینو هست: یکی خروجی رو روی oled نشون میده و دیگری در پنجره سریال مانیتور. چون ما معمولا طول وعرض جغرافیایی بدست آورده را نه برای نمایش بلکه برای ارسال یا دیدن در نقشه و … نیاز دارم پس من از فایل Geolocation_without_display.ino استفاده کردم.
– 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