📚 المقطع البرمجي النهائي (proxy.py)
المفاهيم الأساسية
المقطع البرمجي لوحدة التحكم (Controller): يتشابه مع برامج العقد الوسطى في فحص المخزن المؤقت وقراءة الرسالة المستلمة، لكنه يطبع الرسالة الأصلية التي أُنشئت بواسطة عقدة الطرفية (Edge Node).
خريطة المفاهيم
```markmap
أدوات محاكاة إنترنت الأشياء
برنامج كاب كاربون (CupCarbon)
إنشاء مشروع محاكاة جديد
#### الخطوة 1: بدء مشروع جديد
- اضغط على أيقونة "New Project" (مشروع جديد) من شريط الأدوات.
#### الخطوة 2: حفظ المشروع
- اختر الموقع المراد حفظ المشروع فيه.
- اكتب اسم الملف: "My First CupCarbon Simulation".
#### الخطوة 3: تأكيد الحفظ
- اضغط على زر "Save" (حفظ).
مشروع محاكاة: مراقبة الحريق والتحذيرات
#### إنشاء مشروع جديد للمراقبة
##### الخطوة 1: بدء مشروع جديد
- اضغط على New Project (مشروع جديد) من شريط الأدوات.
##### الخطوة 2: تسمية المشروع وحفظه
- اختر الموقع الذي تريد تخزين المشروع فيه.
- اكتب "Fire Surveillance and Notification" في حقل File name (اسم الملف).
- اضغط على Save (حفظ).
إنشاء شبكة العقدة بوحدة التحكم الرئيسية والوسطي
#### الخطوة 1: إدراج العقد
- اضغط على "عقدة إنترنت أشياء (IoT) Node" من شريط Toolbar.
- اضغط على الخريطة لإضافة العقدة.
- اضغط على "All" من شريط State.
- ضع عقدتين أخريين داخل الدائرة الخارجية للعقدة الأولى.
- اضغط على Esc.
#### الخطوة 2: التعرف على العقد
- العقدة الأولى المضافة هي وحدة التحكم الرئيسية.
- العقدتان الأخريان هما عقد الوسطي.
#### الخطوة 3: ضمان الاتصال
- يجب وضع العقد داخل نصف قطر اتصال وحدة التحكم.
- إذا لم تكن داخل النطاق، اسحبها وأقلتها بالقرب حتى يظهر سهم اتصال ثنائي الاتجاه.
تابع إضافة العقد الطرفية
#### لإدراج العقد الطرفية:
##### الخطوة 1
- اضغط على Node IoT (عقدة إنترنت الأشياء) من شريط Toolbar (الأدوات).
##### الخطوة 2
- ضع عقدتين كل node proxy (عقدة وسطى)، وذلك داخل دائرتها الأخرى.
##### الخطوة 3
- اضغط على All (الكل) من شريط الحالة.
##### الخطوة 4
- اضغط على Esc في لوحة المفاتيح.
إنشاء المقاطع البرمجية
#### المكتبات اللازمة
- `import time`
- `import random`
#### منطق المحاكاة (العقد الطرفية)
##### توليد حدث حريق عشوائي
- داخل حلقة `while node.loop():`
- `fire = random.randint(1, 6)` لتحديد القطاع الذي قد يحدث فيه الحريق.
##### التحقق من وقوع الحريق وإرسال التحذير
- إذا كانت `fire == 1` (اندلع حريق في القطاع 1):
- `node.print("FIRE!")`
- إنشاء رسالة: `message = "FIRE IN SECTOR " + str(node.id())`
- إرسال الرسالة: `node.send(message)`
##### حالة عدم وجود حريق
- إذا أنتجت دالة التوليد أي رقم آخر (من 2 إلى 6):
- لا يوجد حريق في القطاع.
- تقوم العقدة بطباعة نص ذاتي فارغ: `node.print("")` لمسح أي نص مطبوع سابقاً.
##### فترة السكون العشوائية
- تهدف إلى محاكاة الأحداث في الحياة الواقعية.
- تستخدم الدالة `time.sleep(random.uniform(1, 4))`.
- فترة السكون تتراوح بين 1 و 4 ثوانٍ.
#### المقطع البرمجي النهائي (edge.py)
#### المقطع البرمجي للعقد الوسطى
##### التحقق من وجود بيانات
- التحقق من أن حجم المخزن المؤقت أكبر من صفر باستخدام `node.bufferSize() > 0`.
##### قراءة البيانات وإعادة توجيهها
- قراءة الرسالة المستقبلة باستخدام `message = node.read()`.
- طباعة رسالة توضيحية: `node.print("FORWARDING...")`.
- إرسال الرسالة إلى وحدة التحكم الرئيسية (معرفها 1) باستخدام `node.send(message, 1)`.
##### إدارة عرض الرسائل
- السكون لمدة ثانية واحدة: `time.sleep(1)`.
- مسح الرسالة المطبوعة: `node.print("")`.
##### ضمان استجابة العقدة
- السكون لفترة قصيرة جداً (0.01 ثانية) باستخدام `time.sleep(0.01)`.
#### المقطع البرمجي النهائي (proxy.py)
##### منطق العقدة الوسطى (Proxy)
- `if node.bufferSize() > 0:`
- `message = node.read()`
- `node.print("FORWARDING...")`
- `node.send(message, 1)` (معامل الرقم 1 هو رقم مُعرّف عُقدة وحدة المتحكم)
- `time.sleep(1)`
- `node.print("")`
- `time.sleep(0.01)`
##### منطق وحدة التحكم (Controller)
- `if node.bufferSize() > 0:`
- `message = node.read()`
- `node.print(message)` (يطبع الرسالة الأصلية من العقدة الطرفية)
- `time.sleep(2)`
- `node.print("")`
- `time.sleep(0.01)`
```
نقاط مهمة
- معامل الرقم في دالة `node.send()` هو رقم مُعرّف عُقدة وحدة المتحكم.
- وحدة التحكم تفحص المخزن المؤقت وتقرأ الرسالة المستلمة مثل العقد الوسطى، لكنها تطبع الرسالة الأصلية التي أُنشئت في العقدة الطرفية.
- وحدة التحكم تسكن (تنتظر) لمدة ثانيتين بعد طباعة الرسالة، ثم تطبع نصًا فارغًا، ثم تسكن لفترة قصيرة (0.01 ثانية).