مقدمـــــــة عن المشروع
هل فكرت في الحصول على موقع جهازك دون استخدام أي جهاز GPS ؟ مثير للاهتمام !! نعم ، من الممكن الحصول على إحداثيات الموقع فقط باستخدام لوحة NodeMCU ESP بدون أي أجهزة إضافية .
هنا سنستخدم لوحة ESP12E للحصول على إحداثيات حية لموقعنا . يصبح ذلك ممكنًا بسبب Google Geolocation API . لذلك دعونا نرى كيف تعمل واجهة برمجة تطبيقات الموقع الجغرافي وكيف يمكننا الحصول على الموقع باستخدام هذا .
متطلبات المشروع
- NodeMCU ESP board
طريقة العمل والتوصيل
ما هو 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 القريبة الأكثر دقة هو الموقع . هذه هي الطريقة التي يعمل بها تحديد الموقع الجغرافي بواسطة Google .
الآن ، سوف نستخدم سحر واجهة برمجة تطبيقات تحديد الموقع الجغرافي في لوحة NodeMCU ESP12E ومحاولة الحصول على إحداثيات الموقع . سنستخدم هنا المنفذ التسلسلي من Arduino IDE لرؤية الإحداثيات . بدلاً من ذلك ، يمكنك ربط شاشة OLED مع ESP12-e لعرض البيانات .
الحصول على مفتاح API من Google لتحديد الموقع الجغرافي
لاستخدام خدمة تحديد الموقع الجغرافي من Google ، نحتاج إلى حساب Google ومفتاح API. اتبع الخطوات التالية للحصول على مفتاح API .
الخطوة 1: – انتقل إلى صفحة حساب Google ، وقم بتسجيل الدخول باستخدام حساب Google الخاص بك وانقر فوق مفتاح Get API ، ثم انقر فوق “ابدأ” كما بالصورة أدناه .
الخطوة 2: – من خلال النقر على “البدء” ، سيتم فتح نافذة جديدة كما هو موضح أدناه .
انقر فوق الخيار Maps and Places for Pick Product ثم انقر فوق “continue“.
الخطوة 3: – أعط اسمًا لمشروعك ، ثم انقر فوق “التالي” .
الخطوة 4: – الخطوة التالية هي إعداد الفواتير . يجب عليك حفظ تفاصيل بطاقتك المصرفية . على الرغم من أن هذه الخدمة مجانية لمدة عام ، إلا أنها للتأكد من أنك لست روبوتًا . بعد عام ، لن يتم خصم المبلغ من حسابك دون إذنك. لذلك ، فقط املأ التفاصيل والمضي قدما وانقر على التالي .
الخطوة 5: – بعد ذلك سوف تحصل على مفتاح API الخاص بك. انسخ هذا المفتاح واحفظ هذا المفتاح على المفكرة. نحتاج هذا المفتاح في الكود الخاص بنا .
نتــــــائج المشروع
قم بتحميل الكود الكامل المعطى أدناه على اللوحة وافتح الشاشة التسلسلية .
سترى إحداثيات ودقة موقعك كما هو موضح أدناه.
الآن ، افتح خرائط Google في هاتفك الذكي وأدخل خطوط الطول والعرض مفصولة بفاصلة (،) . سترى موقعك على الخريطة كما هو موضح .
لذلك فقد رأينا مدى سهولة الحصول على الموقع الحالي لأي أجهزة فقط عن طريق استخدام ESP12 متعدد الاستخدامات دون الحاجة إلى أي وحدة GPS .
الكـــــــــود البرمجي
لتحميل الكود البرمجي اضغط هنا
#include <ESP8266HTTPClient.h> #include <ArduinoJson.h> #include "ESP8266WiFi.h" char ssid[] = "********"; // your network SSID name char 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(9600); 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(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 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) { 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\": 234,\n"; // this is a real UK MCC jsonString += "\"homeMobileNetworkCode\": 27,\n"; // and a real UK MNC 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(""); //Connect to the client and make the api call 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); } //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); }