📚 البرنامج بشكله النهائي Complete Code
المفاهيم الأساسية
* البرنامج بشكله النهائي: الكود الكامل لبرنامج `mqtt_receiver.py` الذي تم تطويره عبر الصفحات السابقة.
خريطة المفاهيم
```markmap
7. الرسائل في إنترنت الأشياء
إدارة النفايات الذكية وتحليل البيانات (صفحة 292)
إنشاء برامج تحليل البيانات
#### ملف mqtt_receiver.py
##### الوظيفة: الاشتراك في موضوع MQTT وجمع الرسائل.
##### المخرجات: حفظ البيانات في ملف JSON.
#### ملف data_analysis.ipynb
##### الوظيفة: قراءة البيانات من ملف JSON وتحليلها.
##### العملية: يقرأ البيانات، يكتب النتائج، يجمع المعلومات.
تدفق البيانات في النظام
#### وسيط MQTT: نقطة تمرير الرسائل بين الحاوية وبرامج التحليل.
#### ملف JSON: وسيط تخزين للبيانات المجمعة قبل تحليلها.
إنشاء ملف بيانات جسون (صفحة 293)
خطوات إنشاء الملف
#### 1. إنشاء ملف جديد باسم data.json
##### المحتوى: مصفوفة فارغة [].
#### 2. دور ملف mqtt_receiver.py
##### إلحاق كائنات JSON (التقارير) بالمصفوفة الموجودة في data.json.
#### 3. دور ملف data_analysis.py
##### فتح ملف data.json.
##### قراءة محتويات مصفوفة JSON.
##### إجراء عمليات تحليل البيانات.
برمجة ملف mqtt_receiver.py
#### استيراد الحزم المطلوبة
##### datetime: لإضافة طابع زمني للرسائل.
##### json: للتعامل مع كائنات JSON.
##### paho.mqtt.client: لإنشاء عملاء MQTT.
##### os: للتعامل مع الملفات.
#### إنشاء المتغيرات للتعامل مع ملف JSON
##### data_file: المسار الكامل لملف JSON.
##### data_file_objects: قائمة لتخزين الكائنات من ملف JSON.
برمجة عميل MQTT (صفحة 294)
إنشاء متغيرات اتصال MQTT
#### CLIENT_ID: معرف العميل (مثل RECEIVER_01).
#### MQTT_BROKER: عنوان الوسيط (مثل broker.emqx.io).
#### TOPIC: موضوع الاشتراك (مثل waste/drops).
#### PORT: منفذ الاتصال (مثل 1883).
#### FLAG_CONNECTED: علم حالة الاتصال (يبدأ بـ False).
إنشاء متغيرات تخزين البيانات
#### messages_stack: مصفوفة لتخزين الرسائل الخاصة بكل حاوية.
#### reports: مصفوفة لتخزين كائنات التقارير.
إنشاء دالة معالج الأحداث on_connect
#### الوظيفة: طباعة رسالة تأكيد الاتصال في Terminal.
#### العملية: تغيير قيمة FLAG_CONNECTED بناءً على رمز الاستجابة (rc).
##### إذا كان rc == 0: الاتصال ناجح.
##### إذا كان rc != 0: الاتصال فاشل.
برمجة دالة معالجة الرسائل (صفحة 295)
دالة on_message
#### الوظيفة: معالجة الرسائل الواردة من وسيط MQTT.
#### العملية:
##### فك تشفير حمولة الرسالة وتحويلها إلى كائن JSON.
##### إلحاق الكائن بالمصفوفة messages_stack.
##### طباعة الرسالة المستلمة في Terminal.
##### التحقق من وجود العلم can_filled في الكائن.
###### إذا كان True: استدعاء دالة generate_report().
توسعة البرنامج
#### يمكن توسعة البرنامج لمعالجة بيانات JSON تحتوي على المزيد من الحقول والمعلومات حول الناشرين.
برمجة دالة إنشاء التقرير (صفحة 296)
دالة generate_report()
#### الوظيفة: إنشاء كائن JSON للتقرير وإلحاقه بملف البيانات.
#### العملية:
##### الوصول إلى المتغيرات العامة: data_file_objects, messages_stack, reports.
##### استخراج الرسالة الأولى والأخيرة من messages_stack.
##### تحويل الطابع الزمني للرسائل من نص إلى كائن datetime.
##### حساب وقت الامتلاء (time_to_fill) بالدقائق من فرق الطابع الزمني بين الرسالة الأولى والأخيرة.
##### إنشاء كائن التقرير (report) الذي يحتوي على:
###### id: رقم التقرير (طول مصفوفة reports).
###### timestamp: الطابع الزمني للامتلاء.
###### garbage_drops: عدد قطرات النفايات.
###### time_to_fill: الوقت المستغرق لملء الحاوية.
تحديث البيانات والجزء الرئيسي للبرنامج (صفحة 297)
تحديث محتويات ملف البيانات
#### العملية:
##### إلحاق كائن التقرير (report) بمصفوفة data_file_objects.
##### كتابة مصفوفة data_file_objects المحدثة إلى ملف JSON.
##### إلحاق كائن التقرير بمصفوفة reports.
##### تفريغ مصفوفة messages_stack.
الجزء الرئيسي للبرنامج
#### العملية:
##### التحقق من وجود ملف البيانات (data.json) قبل قراءته.
##### قراءة محتويات ملف JSON وتخزينها في data_file_objects.
##### تهيئة عميل MQTT.
##### ربط معالج الأحداث on_connect بالدالة المناسبة.
##### ربط معالج الأحداث on_message بالدالة المناسبة.
##### الاتصال بوسيط MQTT باستخدام العنوان والمنفذ.
##### الاشتراك في الموضوع المحدد (TOPIC).
##### الاستماع بشكل مستمر للرسائل الواردة (loop_forever).
البرنامج بشكله النهائي (صفحة 298)
الكود الكامل لملف mqtt_receiver.py
#### استيراد المكتبات
##### from datetime import datetime
##### import json
##### import paho.mqtt.client as mq
##### from os import path
#### تعريف المتغيرات العامة
##### data_file: مسار ملف JSON.
##### data_file_objects: قائمة كائنات من ملف JSON.
##### CLIENT_ID: معرف العميل.
##### MQTT_BROKER: عنوان الوسيط.
##### TOPIC: موضوع الاشتراك.
##### PORT: منفذ الاتصال.
##### FLAG_CONNECTED: علم حالة الاتصال.
##### messages_stack: مصفوفة الرسائل لكل حاوية.
##### reports: مصفوفة كائنات التقارير.
#### تعريف دالة on_connect
##### الوظيفة: معالجة حدث الاتصال.
##### العملية: تغيير FLAG_CONNECTED وطباعة رسالة بناءً على رمز الاستجابة (rc).
#### تعريف دالة on_message
##### الوظيفة: معالجة الرسائل الواردة.
##### العملية: فك تشفير حمولة الرسالة وإلحاقها بـ messages_stack.
```
نقاط مهمة
- هذه الصفحة تعرض الكود الكامل لبرنامج `mqtt_receiver.py` الذي تم بناؤه خطوة بخطوة في الصفحات السابقة.
- الكود يتضمن استيراد المكتبات، تعريف المتغيرات العامة، ودالتي `on_connect` و `on_message` الأساسيتين.
- يمثل هذا الكود الشكل النهائي للبرنامج الذي يستقبل رسائل MQTT ويبدأ في معالجتها.