
تطبيقات إنترنت الأشياء : برمجة تطبيق مصباح يدوي Arduino IDE و Android Studio
برمجة تطبيق مصباح يدوي باستخدام إنترنت الأشياء (IoT)
على Android Studio بلغة Java يتضمن عدة خطوات ومكونات.
الفكرة الأساسية هي التحكم في ضوء جهاز متصل بالإنترنت
(وليس بالضرورة ضوء فلاش الهاتف نفسه) من خلال تطبيق Android.
نظرًا لأن التحكم في ضوء فلاش الهاتف مباشرة لا يعتبر عادةً جزءًا من تطبيقات IoT
(فهو يعتمد على واجهات برمجة تطبيقات النظام الأساسي للجهاز)،
سأقدم لك مقالًا مفصلاً يشرح كيفية برمجة تطبيق Android يتحكم في جهاز IoT
خارجي بسيط (مثل مصباح ESP32 متصل بالواي فاي) لتشغيل وإيقاف الضوء.
في هذا المقال المفصل، سنستكشف كيفية برمجة تطبيق Android بسيط باستخدام
Android Studio ولغة Java للتحكم في جهاز إنترنت الأشياء خارجي لتشغيل وإيقاف الضوء.
سنستخدم جهاز ESP32 كمثال لجهاز IoT المتصل بالواي فاي وسنقوم بإنشاء
واجهة برمجة تطبيقات REST بسيطة على ESP32 للتفاعل مع تطبيق Android.
هذا المشروع يوفر فهمًا أساسيًا لكيفية بناء تطبيقات IoT التي تتفاعل مع الأجهزة المتصلة عبر الإنترنت.
** المتطلبات :
- Android Studio: مثبت على جهاز الكمبيوتر .
- جهاز Android: لتشغيل التطبيق.
- جهاز ESP32: مع القدرة على الاتصال بشبكة Wi-Fi.
- بيئة تطوير ESP32: مثبتة (Arduino IDE مع دعم ESP32 أو ESP-IDF).
- مصباح LED: لتوصيله بجهاز ESP32.
- مقاومات وأسلاك توصيل: حسب الحاجة لتوصيل LED بـ ESP32.
- شبكة Wi-Fi: لربط كل من جهاز Android و ESP32.
خطوات برمجة تطبيق مصباح يدوي للتحكم في أجهزة إنترنت الأشياء IoT
الخطوة 1: برمجة جهاز ESP32 (جهاز إنترنت الأشياء)
في هذه الخطوة، سنقوم ببرمجة جهاز ESP32 لإنشاء واجهة برمجة تطبيقات REST بسيطة.
ستستقبل هذه الواجهة طلبات HTTP GET لتشغيل وإيقاف المصباح المتصل به.
* كود (Arduino IDE):
Arduino
#include <WiFi.h>#include <WebServer.h>
// بيانات اعتماد شبكة Wi-Ficonst char* ssid = "YOUR_WIFI_SSID";const char* password = "YOUR_WIFI_PASSWORD";
// منفذ الويبWebServer server(80);
// منفذ GPIO المتصل بالمصباح LED (تعديله حسب توصيلك)const int ledPin = 2;
// حالة المصباحbool ledState = false;
// معالج لطلب تشغيل المصباحvoid handleLedOn() { ledState = true; digitalWrite(ledPin, HIGH); server.send(200, "text/plain", "LED ON");}
// معالج لطلب إيقاف المصباحvoid handleLedOff() { ledState = false; digitalWrite(ledPin, LOW); server.send(200, "text/plain", "LED OFF");}
// معالج لطلب حالة المصباحvoid handleLedStatus() { server.send(200, "text/plain", ledState ? "ON" : "OFF");}
// معالج للصفحة الرئيسية (اختياري)void handleRoot() { server.send(200, "text/html", "<h1>ESP32 IoT Flashlight</h1><p><a href='/led/on'>Turn On</a> | <a href='/led/off'>Turn Off</a> | <a href='/led/status'>Status</a></p>");}
// معالج لصفحة غير موجودةvoid handleNotFound() { server.send(404, "text/plain", "Not found");}
void setup() { Serial.begin(115200); pinMode(ledPin, OUTPUT); digitalWrite(ledPin, LOW); // ابدأ والمصباح مطفأ
// الاتصال بشبكة Wi-Fi Serial.println("Connecting to WiFi..."); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.print("."); } Serial.println("\nConnected to WiFi"); Serial.print("IP address: "); Serial.println(WiFi.localIP());
// تحديد مسارات API server.on("/", handleRoot); server.on("/led/on", handleLedOn); server.on("/led/off", handleLedOff); server.on("/led/status", handleLedStatus); server.onNotFound(handleNotFound);
// بدء تشغيل الخادم server.begin(); Serial.println("HTTP server started");}
void loop() { server.handleClient();}
--
* شرح كود ESP32 :
- يتضمن المكتبات اللازمة للواي فاي وخادم الويب.
- يقوم بتحديد بيانات اعتماد شبكة الواي فاي ومنفذ GPIO المتصل بالمصباح.
- ينشئ خادم ويب على المنفذ 80.
- يحدد معالجات لطلبات HTTP GET على المسارات /led/on (لتشغيل المصباح)، /led/off (لإيقاف المصباح)، و /led/status (للحصول على حالة المصباح).
- يتصل بشبكة الواي فاي ويعرض عنوان IP الخاص به.
- يبدأ تشغيل خادم الويب.
- في حلقة loop()، يستمع الخادم للعملاء ويعالج طلباتهم.
الخطوة 2 : تصميم واجهة مستخدم تطبيق Android
في هذه الخطوة، سنقوم بتصميم واجهة مستخدم بسيطة لتطبيق Android تحتو
ي على زرين: "تشغيل" و "إيقاف".
* ملف activity_main.xml (layout) :
XML
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:gravity="center" tools:context=".MainActivity">
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="مصباح يدوي IoT" android:textSize="24sp" android:layout_marginBottom="32dp" />
<Button android:id="@+id/buttonOn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="تشغيل" android:padding="16dp" android:textSize="18sp" android:layout_marginBottom="16dp" />
<Button android:id="@+id/buttonOff" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="إيقاف" android:padding="16dp" android:textSize="18sp" />
<TextView android:id="@+id/statusTextView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="32dp" android:text="الحالة: غير متصل" android:textSize="16sp" />
</LinearLayout>
--
* شرح تخطيط Android:
- يستخدم LinearLayout بترتيب عمودي لتنظيم العناصر.
- يحتوي على TextView لعرض عنوان التطبيق.
- يحتوي على زري Button بمعرفات buttonOn و buttonOff للتحكم في المصباح.
- يحتوي على TextView بمعرف statusTextView لعرض حالة الاتصال أو حالة المصباح.
الخطوة 3 : كتابة كود Java لتطبيق Android
في هذه الخطوة، سنكتب كود Java في ملف MainActivity.java للتفاعل
مع واجهة برمجة تطبيقات REST على جهاز ESP32 عند النقر على الأزرار.
* ملف MainActivity.java :
java
package com.example.iotflashlight;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;import android.os.StrictMode;import android.view.View;import android.widget.Button;import android.widget.TextView;import android.widget.Toast;
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.net.HttpURLConnection;import java.net.URL;
public class MainActivity extends AppCompatActivity {
private Button buttonOn;private Button buttonOff;private TextView statusTextView;private String esp32IpAddress = "YOUR_ESP32_IP_ADDRESS"; // استبدل بعنوان IP الخاص بجهاز ESP32
@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
// السماح بتنفيذ عمليات الشبكة على مؤشر واجهة المستخدم الرئيسي (لتبسيط المثال، لا يوصى به للإنتاج) StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy);
buttonOn = findViewById(R.id.buttonOn); buttonOff = findViewById(R.id.buttonOff); statusTextView = findViewById(R.id.statusTextView);
buttonOn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { sendHttpRequest("/led/on"); } });
buttonOff.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { sendHttpRequest("/led/off"); } });
// الحصول على حالة المصباح عند بدء التطبيق (اختياري) getLedStatus();}
private void sendHttpRequest(String endpoint) { try { URL url = new URL("http://" + esp32IpAddress + endpoint); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET");
int responseCode = connection.getResponseCode(); if (responseCode == HttpURLConnection.HTTP_OK) { BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); String line; StringBuilder response = new StringBuilder(); while ((line = reader.readLine()) != null) { response.append(line); } reader.close(); statusTextView.setText("الحالة: " + response.toString()); } else { Toast.makeText(this, "فشل الطلب: " + responseCode, Toast.LENGTH_SHORT).show(); } connection.disconnect(); } catch (IOException e) { Toast.makeText(this, "خطأ في الاتصال: " + e.getMessage(), Toast.LENGTH_SHORT).show(); statusTextView.setText("الحالة: غير متصل"); }}
private void getLedStatus() { sendHttpRequest("/led/status");}}
--
شرح كود Android Java :
* يحصل على مراجع لأزرار وعرض الحالة من التخطيط.
* يحدد عنوان IP الخاص بجهاز ESP32
(**تأكد من استبداله بعنوان IP الفعلي لجهازك على شبكة الواي فاي**).
* يضيف مستمعين للنقر على الأزرار "تشغيل" و "إيقاف" لاستدعاء وظيفة
`sendHttpRequest()` مع نقطة النهاية المناسبة.
* تقوم وظيفة `sendHttpRequest()` بإنشاء كائن `URL` وإرسال
طلب HTTP GET إلى جهاز ESP32.
* تقوم بمعالجة استجابة HTTP وعرض الحالة في `statusTextView`.
* تقوم وظيفة `getLedStatus()` بالحصول على الحالة الأولية
للمصباح عند بدء تشغيل التطبيق (اختياري).
* ملاحظة : يتم استخدام
`StrictMode.ThreadPolicy.Builder().permitAll().build()`
للسماح بتنفيذ عمليات الشبكة على مؤشر واجهة المستخدم الرئيسي لتبسيط المثال.
**في تطبيقات الإنتاج، يجب تنفيذ عمليات الشبكة على مؤشرات خلفية
(باستخدام AsyncTask أو ExecutorService أو مكتبات أخرى) لتجنب حظر واجهة المستخدم.**
الخطوة 4 : توصيل المكونات (الأجهزة)
1. قم بتوصيل مصباح LED بمنفذ GPIO المحدد
(`ledPin = 2` في المثال) على جهاز ESP32 عبر مقاومة مناسبة (لحماية LED من التيار الزائد).
2. تأكد من أن جهاز ESP32 متصل بنفس شبكة الواي فاي التي سيتصل بها جهاز Android الخاص بك.
3.قم بتحميل كود ESP32 إلى جهاز ESP32 باستخدام Arduino IDE أو بيئة تطوير ESP32 الأخرى.
4. قم بتشغيل تطبيق Android على جهاز Android الخاص بك.
الخطوة 5: تشغيل التطبيق
1. تأكد من أن جهاز Android الخاص بك متصل بنفس شبكة الواي فاي التي يتصل بها جهاز ESP32.
2. شغل تطبيق "مصباح يدوي IoT" على جهاز Android الخاص بك.
3. انقر على زر "تشغيل" لإرسال طلب HTTP إلى جهاز ESP32، مما سيؤدي إلى تشغيل المصباح المتصل به.
4. انقر على زر "إيقاف" لإرسال طلب HTTP آخر لإيقاف المصباح.
5. يجب أن يعرض `statusTextView` الحالة الحالية للمصباح بناءً على الاستجابة من جهاز ESP32.
*خاتمة:
لقد قمنا في هذا المقال بإنشاء تطبيق Android بسيط يتحكم في جهاز
إنترنت الأشياء خارجي (ESP32) لتشغيل وإيقاف المصباح.
يوضح هذا المشروع الأساسيات اللازمة لبناء تطبيقات IoT التي تتفاعل مع
الأجهزة المتصلة عبر شبكة Wi-Fi باستخدام واجهات برمجة تطبيقات REST.
يمكنك توسيع هذا المشروع لإضافة المزيد من الميزات والتحكم في أجهزة IoT أخرى.
تذكر دائمًا التعامل مع عمليات الشبكة على مؤشرات خلفية في تطبيفات الإنتاج لضمان تجربة مستخدم سلسة.
آمل أن يكون هذا المقال المفصل لكل خطوة واضحًا ومفيدًا لك!