# 🔄 دليل التوافق بين Arduino و API ## ✅ المشكلة التي تم حلها كان هناك عدم توافق بين: - **كود Arduino**: كان يرسل `?device_id=X&action=get_commands` - **API المتوقع**: `esp_control.php` يتطلب فقط `device_id` بدون `action` --- ## 📡 التدفق الصحيح للبيانات ### 1️⃣ ESP يطلب الأوامر (GET Request) **Arduino Code:** ```cpp String url = String(serverUrl) + "?device_id=" + deviceId; http.GET(); ``` **API Endpoint:** `backend/api/esp_control.php` **المعاملات المطلوبة:** - ✅ `device_id` (مطلوب) - ❌ `action` (غير مطلوب) **الاستجابة:** ```json { "success": true, "command_id": 123, "action": "pin_control", "payload": { "gpio": 5, "state": 1 } } ``` --- ### 2️⃣ ESP ينفذ الأمر ويرسل تأكيد (POST Request) **Arduino Code:** ```cpp String postData = "device_id=" + deviceId + "&command_id=" + commandId + "&status=executed"; http.POST(postData); ``` **API Endpoint:** `backend/api/esp_control.php` **المعاملات المطلوبة:** - ✅ `device_id` (مطلوب) - ✅ `command_id` (مطلوب) - ✅ `status` (executed أو failed) - ⚠️ `error_message` (اختياري - في حالة الفشل) --- ## 🔑 أسماء المتغيرات الموحدة | المتغير | الاستخدام | النوع | |---------|-----------|-------| | `device_id` | معرف الجهاز | String | | `command_id` | معرف الأمر | Integer | | `action` | نوع الأمر (pin_control) | String | | `gpio` | رقم البين | Integer | | `state` | حالة البين (0/1) | Integer | | `status` | حالة التنفيذ (executed/failed) | String | --- ## 🎯 مثال كامل للتدفق ### الخطوة 1: ESP يطلب أوامر ``` GET: http://yourserver.com/backend/api/esp_control.php?device_id=ESP001 ``` ### الخطوة 2: السيرفر يرد بأمر ```json { "success": true, "command_id": 45, "action": "pin_control", "payload": { "gpio": 5, "state": 1 } } ``` ### الخطوة 3: ESP ينفذ الأمر ```cpp digitalWrite(5, HIGH); // تشغيل GPIO 5 ``` ### الخطوة 4: ESP يرسل تأكيد ``` POST: http://yourserver.com/backend/api/esp_control.php Body: device_id=ESP001&command_id=45&status=executed ``` ### الخطوة 5: السيرفر يؤكد الاستلام ```json { "success": true, "message": "Status updated successfully" } ``` --- ## ⚠️ الأخطاء الشائعة وحلولها ### ❌ خطأ: "device_id and action are required" **السبب:** تستخدم `commands.php` بدلاً من `esp_control.php` **الحل:** ```cpp // ❌ خطأ String url = serverUrl + "?device_id=" + deviceId + "&action=get_commands"; // ✅ صحيح String url = String(serverUrl) + "?device_id=" + deviceId; ``` --- ### ❌ خطأ: "device_id is required" **السبب:** لم يتم إرسال `device_id` في الطلب **الحل:** ```cpp // تأكد من تعريف deviceId const char* deviceId = "ESP001"; // تأكد من إضافته في URL String url = String(serverUrl) + "?device_id=" + deviceId; ``` --- ### ❌ خطأ: HTTP 404 **السبب:** مسار API خاطئ **الحل:** ```cpp // ✅ المسار الصحيح const char* serverUrl = "http://192.168.1.5/KL/backend/api/esp_control.php"; // ❌ مسارات خاطئة // "http://192.168.1.5/api/esp_control.php" // "http://192.168.1.5/backend/esp_control.php" ``` --- ## 🧪 اختبار التوافق ### اختبار GET من المتصفح: ``` http://yourserver.com/backend/api/esp_control.php?device_id=ESP001 ``` **النتيجة المتوقعة:** ```json { "success": true, "action": "none", "message": "No pending commands" } ``` ### اختبار POST من Postman: ``` POST: http://yourserver.com/backend/api/esp_control.php Body (x-www-form-urlencoded): device_id: ESP001 command_id: 1 status: executed ``` --- ## 📋 Checklist للتأكد من التوافق - [ ] كود Arduino يستخدم `esp_control.php` وليس `commands.php` - [ ] GET request يحتوي على `device_id` فقط - [ ] POST request يحتوي على `device_id`, `command_id`, `status` - [ ] أسماء المتغيرات بالإنجليزية (gpio, state, device_id) - [ ] serverUrl يحتوي على المسار الكامل للـ API - [ ] ESP يرسل تأكيد بعد تنفيذ كل أمر --- ## 🎉 النتيجة الآن النظام متوافق 100% بين: - ✅ كود Arduino المُولّد - ✅ API الخاص بـ ESP (`esp_control.php`) - ✅ قاعدة البيانات - ✅ لوحة التحكم **لا توجد مشاكل في التوافق!** 🚀