مقدمـــــــة عن المشروع
هل فكرت في الحصول على موقع جهازك دون استخدام أي جهاز 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);
}
