مدخل إلى إنترنت الأشياء (IoT): كيف تتحدث الأجهزة الصماء مع الإنترنت؟
ماذا سنتعلم اليوم؟
سنتعلم كيف يمكن للأجهزة المادية "الصماء" مثل متحكمات ESP32/ESP8266 الاتصال بالإنترنت وإرسال البيانات، لنبني أساس فهمنا لعالم إنترنت الأشياء.
في هذا الدرس، سنقوم ببناء مثال عملي يوضح كيف يمكن لجهاز صغير (مثل ESP32 أو ESP8266) الاتصال بشبكة Wi-Fi ثم إرسال طلب HTTP إلى الإنترنت، مما يمثل "حديث" الجهاز مع العالم الرقمي. هذا هو حجر الزاوية في معظم تطبيقات إنترنت الأشياء.
الخطوة 1: تهيئة بيئة العمل والاتصال بالشبكة اللاسلكية (Wi-Fi)
الخطوة الأولى لأي جهاز إنترنت أشياء هي تمكينه من الاتصال بالشبكة. في معظم الحالات، تكون هذه الشبكة هي Wi-Fi. سنقوم هنا بتهيئة متحكم ESP32/ESP8266 للاتصال بشبكتك اللاسلكية.
ملاحظة تقنية: متحكمات ESP32 و ESP8266 تتميز بوجود وحدة Wi-Fi مدمجة، مما يجعلها مثالية لمشاريع إنترنت الأشياء دون الحاجة إلى مكونات إضافية معقدة للاتصال بالشبكة.
أضف هذا الجزء من الكود إلى ملفك البرمجي (في Arduino IDE):
#include <WiFi.h> // تضمين مكتبة الواي فاي للتعامل مع الاتصال اللاسلكي
const char* ssid = "YOUR_WIFI_SSID"; // استبدل "YOUR_WIFI_SSID" باسم شبكة الواي فاي الخاصة بك
const char* password = "YOUR_WIFI_PASSWORD"; // استبدل "YOUR_WIFI_PASSWORD" بكلمة مرور شبكتك
void setup() {
Serial.begin(115200); // بدء الاتصال التسلسلي لمراقبة الإخراج على الشاشة
Serial.println("\nبدء الاتصال بالواي فاي...");
WiFi.begin(ssid, password); // محاولة الاتصال بشبكة الواي فاي المحددة
while (WiFi.status() != WL_CONNECTED) { // حلقة انتظار حتى يتم الاتصال بالشبكة بنجاح
delay(1000); // انتظر ثانية واحدة قبل إعادة التحقق
Serial.println("جاري الاتصال...");
}
Serial.println("تم الاتصال بالواي فاي بنجاح!");
Serial.print("عنوان IP الخاص بالجهاز: ");
Serial.println(WiFi.localIP()); // طباعة عنوان IP الذي حصل عليه الجهاز على الشبكة المحلية
}
void loop() {
// سيتم إضافة الكود هنا في الخطوات التالية
}
الخطوة 2: إرسال البيانات عبر بروتوكول HTTP
بمجرد اتصال الجهاز بالإنترنت، يمكنه البدء في تبادل المعلومات. أحد أبسط وأكثر البروتوكولات شيوعًا لإرسال واستقبال البيانات عبر الويب هو HTTP (Hypertext Transfer Protocol). سنقوم بإرسال طلب HTTP GET إلى خدمة عامة على الإنترنت.
ملاحظة تقنية: طلب HTTP GET هو طريقة لطلب البيانات من خادم. إنه يشبه تمامًا ما يحدث عندما تكتب عنوان URL في متصفحك وتضغط Enter، حيث يطلب المتصفح صفحة الويب من الخادم.
أضف هذا الكود إلى دالة loop() وإلى أعلى ملفك البرمجي بعد تضمين مكتبة Wi-Fi:
#include <HTTPClient.h> // تضمين مكتبة HTTPClient لإجراء طلبات HTTP
// ... (الكود السابق من الخطوة 1)
const char* serverName = "http://worldtimeapi.org/api/ip"; // URL لخدمة عامة بسيطة (مثال: للحصول على عنوان IP العام أو وقت العالم)
// يمكن استبداله بأي API عام لا يتطلب مفتاح.
void loop() {
if (WiFi.status() == WL_CONNECTED) { // تأكد من أن الجهاز لا يزال متصلاً بالواي فاي
HTTPClient http; // إنشاء كائن HTTPClient للتعامل مع الطلب
http.begin(serverName); // بدء جلسة HTTP مع الخادم المحدد
Serial.println("\nجاري إرسال طلب HTTP GET إلى: " + String(serverName));
int httpResponseCode = http.GET(); // إرسال طلب GET واستقبال رمز الاستجابة HTTP
if (httpResponseCode > 0) { // إذا كان رمز الاستجابة موجبًا، فهذا يعني نجاح الطلب (مثال: 200 OK)
Serial.print("رمز استجابة HTTP: ");
Serial.println(httpResponseCode); // طباعة رمز الاستجابة
String payload = http.getString(); // قراءة الحمولة (payload) من الاستجابة (البيانات التي أرسلها الخادم)
Serial.println("حمولة الاستجابة:");
Serial.println(payload); // طباعة الحمولة المستلمة
} else {
Serial.print("خطأ في طلب HTTP: ");
Serial.println(httpResponseCode); // طباعة رمز الخطأ (إذا كان سالبًا)
Serial.println(http.errorToString(httpResponseCode)); // طباعة وصف الخطأ
}
http.end(); // إنهاء الاتصال لتحرير الموارد
} else {
Serial.println("فقد الاتصال بالواي فاي، جاري إعادة المحاولة...");
// يمكن هنا إضافة منطق لإعادة الاتصال بالواي فاي تلقائياً
}
delay(15000); // انتظر 15 ثانية قبل إرسال الطلب التالي لتجنب إغراق الخادم بالطلبات
}
الخطوة 3: استعراض البيانات والتحكم بالتدفق
في الخطوة السابقة، قمنا بإرسال الطلب واستقبال الاستجابة. في هذه الخطوة، نركز على فهم ما يحدث في loop() وكيف يتم التعامل مع البيانات المستلمة. لاحظ أننا أضفنا تأخيرًا (delay) لمنع إرسال عدد كبير جدًا من الطلبات بسرعة، وهو أمر مهم عند التعامل مع خدمات الإنترنت.
ملاحظة تقنية: إدارة معدل الطلبات (Rate Limiting) هي ممارسة جيدة في تطوير IoT. إرسال عدد كبير جدًا من الطلبات في فترة زمنية قصيرة يمكن أن يؤدي إلى حظر جهازك من قبل الخادم أو استنزاف موارد الشبكة والطاقة.
الكود الموضح في الخطوة 2 هو بالفعل كامل ويحتوي على كل ما نحتاجه. لقد قمنا بالفعل بتضمين طباعة رمز الاستجابة والحمولة إلى Serial Monitor، مما يسمح لنا برؤية ما يرسله الخادم إلينا بوضوح.
الكود النهائي الكامل
هذا هو الكود الكامل الذي يمكنك نسخه ولصقه في Arduino IDE (تأكد من اختيار لوحة ESP32 Dev Module أو ESP8266 الخاصة بك وتثبيت المكتبات المطلوبة).
#include <WiFi.h> // مكتبة للتعامل مع اتصال Wi-Fi
#include <HTTPClient.h> // مكتبة للتعامل مع طلبات HTTP
// تعريف بيانات شبكة الواي فاي الخاصة بك
const char* ssid = "YOUR_WIFI_SSID"; // استبدل باسم شبكة الواي فاي
const char* password = "YOUR_WIFI_PASSWORD"; // استبدل بكلمة مرور شبكة الواي فاي
// URL للخدمة التي سيتم إرسال الطلب إليها
// هذا مثال لخدمة عامة تعرض معلومات IP أو الوقت العالمي
const char* serverName = "http://worldtimeapi.org/api/ip";
void setup() {
Serial.begin(115200); // تهيئة الاتصال التسلسلي لمراقبة المخرجات
Serial.println("\nبدء الاتصال بالواي فاي...");
WiFi.begin(ssid, password); // محاولة الاتصال بشبكة الواي فاي
while (WiFi.status() != WL_CONNECTED) { // انتظر حتى يتم الاتصال بنجاح
delay(1000); // تأخير لمدة ثانية واحدة
Serial.println("جاري الاتصال...");
}
Serial.println("تم الاتصال بالواي فاي بنجاح!");
Serial.print("عنوان IP الخاص بالجهاز: ");
Serial.println(WiFi.localIP()); // طباعة عنوان IP للجهاز على الشبكة المحلية
}
void loop() {
if (WiFi.status() == WL_CONNECTED) { // التحقق من أن الاتصال بالواي فاي لا يزال قائماً
HTTPClient http; // إنشاء كائن HTTPClient
// بدء جلسة HTTP مع الخادم المحدد
http.begin(serverName);
Serial.println("\nجاري إرسال طلب HTTP GET إلى: " + String(serverName));
int httpResponseCode = http.GET(); // إرسال طلب GET والحصول على رمز الاستجابة
if (httpResponseCode > 0) { // إذا كان رمز الاستجابة موجباً (مثل 200 OK)
Serial.print("رمز استجابة HTTP: ");
Serial.println(httpResponseCode); // طباعة رمز الاستجابة
String payload = http.getString(); // قراءة محتوى الاستجابة (البيانات)
Serial.println("حمولة الاستجابة:");
Serial.println(payload); // طباعة الحمولة المستلمة
} else { // إذا كان هناك خطأ في الطلب
Serial.print("خطأ في طلب HTTP: ");
Serial.println(httpResponseCode); // طباعة رمز الخطأ
Serial.println(http.errorToString(httpResponseCode)); // طباعة وصف الخطأ
}
http.end(); // إنهاء الاتصال لتحرير الموارد
} else {
Serial.println("فقد الاتصال بالواي فاي، جاري إعادة المحاولة...");
// يمكن إضافة منطق هنا لإعادة الاتصال بالواي فاي
}
delay(15000); // تأخير 15 ثانية قبل إرسال الطلب التالي
}
النتيجة المتوقعة
عند تحميل الكود على لوحة ESP32/ESP8266 وفتح Serial Monitor (على سرعة 115200 بود)، سترى المخرجات التالية:
- رسائل تفيد بمحاولة الاتصال بالواي فاي.
- رسالة "تم الاتصال بالواي فاي بنجاح!" تليها عنوان IP المحلي للجهاز.
- كل 15 ثانية، سترى رسالة "جاري إرسال طلب HTTP GET..." تليها:
- "رمز استجابة HTTP: 200" (أو رمز آخر يدل على النجاح).
- "حمولة الاستجابة:" تليها بيانات JSON أو نصية من الخادم (مثل معلومات حول عنوان IP العام الخاص بك أو الوقت الحالي).
- في حالة وجود مشكلة في الاتصال بالإنترنت أو الخادم، ستظهر رسائل خطأ توضح المشكلة.
هذا يوضح بنجاح كيف يمكن لجهاز "أصم" أن "يتحدث" مع الإنترنت، وهي الخطوة الأساسية في بناء أي نظام لإنترنت الأشياء.