صفحة 298 - كتاب إنترنت الأشياء - الصف 11 - الفصل 1 - المملكة العربية السعودية

الكتاب: كتاب إنترنت الأشياء - الصف 11 - الفصل 1 | المادة: إنترنت الأشياء | المرحلة: الصف 11 | الفصل الدراسي: 1

الدولة: المملكة العربية السعودية | المنهج: المنهج السعودي - وزارة التعليم

📚 معلومات الصفحة

الكتاب: كتاب إنترنت الأشياء - الصف 11 - الفصل 1 | المادة: إنترنت الأشياء | المرحلة: الصف 11 | الفصل الدراسي: 1

الدولة: المملكة العربية السعودية | المنهج: المنهج السعودي - وزارة التعليم

نوع المحتوى: درس تعليمي

📝 ملخص الصفحة

📚 البرنامج بشكله النهائي 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 ويبدأ في معالجتها.

📋 المحتوى المنظم

📖 محتوى تعليمي مفصّل

نوع: محتوى تعليمي

from datetime import datetime import json import paho.mqtt.client as mq from os import path data_file = "your_file_path" # Absolute path to the JSON data file data_file_objects = [] # This contains the objects from the JSON data file # Variables to setup MQTT client CLIENT_ID = "RECEIVER_01" # ID of the client MQTT_BROKER = "broker.emqx.io" # Address of the broker TOPIC = "waste/drops" # Topic to subscribe to PORT = 1883 # Default server port FLAG_CONNECTED = False # Connection flag messages_stack = [] # The array with the messages per can filling reports = [] # The array with all the generated report objects def on_connect(client, userdata, flags, rc): global FLAG_CONNECTED # Access the FLAG_CONNECTED variable if rc == 0: FLAG_CONNECTED = True print("Connected to MQTT Broker!") else: print("Failed to connect to MQTT Broker!") def on_message(client, userdata, msg): global messages_stack # Access the messages_stack variable messages_stack.append(msg.payload.decode())

نوع: METADATA

وزارة التعليم Ministry of Education 2025 - 1447 298

📄 النص الكامل للصفحة

from datetime import datetime import json import paho.mqtt.client as mq from os import path data_file = "your_file_path" # Absolute path to the JSON data file data_file_objects = [] # This contains the objects from the JSON data file # Variables to setup MQTT client CLIENT_ID = "RECEIVER_01" # ID of the client MQTT_BROKER = "broker.emqx.io" # Address of the broker TOPIC = "waste/drops" # Topic to subscribe to PORT = 1883 # Default server port FLAG_CONNECTED = False # Connection flag messages_stack = [] # The array with the messages per can filling reports = [] # The array with all the generated report objects def on_connect(client, userdata, flags, rc): global FLAG_CONNECTED # Access the FLAG_CONNECTED variable if rc == 0: FLAG_CONNECTED = True print("Connected to MQTT Broker!") else: print("Failed to connect to MQTT Broker!") def on_message(client, userdata, msg): global messages_stack # Access the messages_stack variable messages_stack.append(msg.payload.decode()) وزارة التعليم Ministry of Education 2025 - 1447 298

🎴 بطاقات تعليمية للمراجعة

عدد البطاقات: 4 بطاقة لهذه الصفحة

ما هو الغرض الرئيسي من الدالة `on_connect` في كود عميل MQTT الموضح؟

  • أ) إرسال رسائل البيانات إلى الوسيط.
  • ب) تحديث حالة الاتصال بالوسيط (Broker) بناءً على رمز الاستجابة (rc).
  • ج) معالجة الرسائل الواردة من الوسيط وتخزينها.
  • د) تهيئة متغيرات الملفات والمسار.

الإجابة الصحيحة: b

الإجابة: تحديث حالة الاتصال بالوسيط (Broker) بناءً على رمز الاستجابة (rc).

الشرح: 1. الدالة `on_connect` هي دالة رد نداء (callback) يتم استدعاؤها تلقائياً عند محاولة الاتصال بالوسيط. 2. تقوم بفحص رمز الاستجابة `rc` (return code). 3. إذا كان `rc == 0`، فهذا يعني نجاح الاتصال، ويتم تعيين العلم `FLAG_CONNECTED` إلى `True`. 4. إذا كان `rc` أي قيمة أخرى، فهذا يعني فشل الاتصال، ويتم طباعة رسالة خطأ. 5. الغرض الرئيسي هو تحديث حالة الاتصال بناءً على النتيجة.

تلميح: تأمل ما يحدث عند نجاح الاتصال أو فشله.

التصنيف: مفهوم جوهري | المستوى: متوسط

ما هي وظيفة الدالة `on_message` في نموذج كود عميل MQTT؟

  • أ) إرسال تقارير إلى ملف خارجي.
  • ب) فحص اتصال الوسيط وإعادة المحاولة عند الفشل.
  • ج) استقبال الرسائل من الوسيط وإضافتها إلى قائمة الانتظار (`messages_stack`).
  • د) تحويل البيانات من صيغة JSON إلى كائنات بايثون.

الإجابة الصحيحة: c

الإجابة: استقبال الرسائل من الوسيط وإضافتها إلى قائمة الانتظار (`messages_stack`).

الشرح: 1. الدالة `on_message` هي دالة رد نداء (callback) يتم استدعاؤها تلقائياً عند استقبال رسالة على الموضوع (Topic) المشترك فيه. 2. تستقبل معاملات منها `msg` الذي يحتوي على الرسالة. 3. تستخدم الدالة `msg.payload.decode()` لفك تشفير محتوى الرسالة (Payload) وتحويله إلى نص. 4. تقوم بإلحاق (append) النص الناتج إلى القائمة العالمية `messages_stack`. 5. الوظيفة الأساسية هي تخزين الرسائل الواردة في ذاكرة مؤقتة للمعالجة لاحقاً.

تلميح: ما الذي يحدث للبيانات (`payload`) عند وصول رسالة جديدة؟

التصنيف: تعريف | المستوى: متوسط

في سياق بروتوكول MQTT، ما هو دور الوسيط (Broker) كما يتضح من المتغير `MQTT_BROKER`؟

  • أ) هو الجهاز الذي يجمع البيانات من أجهزة الاستشعار فقط.
  • ب) هو الخادم المركزي الذي يتوسط في تبادل الرسائل بين الأجهزة (العملاء).
  • ج) هو البرنامج الذي يحول البيانات إلى صيغة JSON.
  • د) هو المتغير الذي يخزن الرسائل المؤقتة قبل معالجتها.

الإجابة الصحيحة: b

الإجابة: هو الخادم المركزي الذي يتوسط في تبادل الرسائل بين الأجهزة (العملاء).

الشرح: 1. بروتوكول MQTT يعتمد على نموذج الناشر/المشترك (Publisher/Subscriber). 2. الوسيط (Broker) هو عنصر مركزي في هذا النموذج. 3. دوره هو استقبال الرسائل من الناشرين (Publishers). 4. ثم إعادة توجيه هذه الرسائل إلى جميع المشتركين (Subscribers) المهتمين بموضوع (Topic) تلك الرسالة. 5. المتغير `MQTT_BROKER = "broker.emqx.io"` يخزن عنوان هذا الخادم الوسيط الذي سيتصل به العميل.

تلميح: تأمل في اسم المتغير والوظيفة العامة للنظام.

التصنيف: تعريف | المستوى: سهل

ما الفرق الأساسي بين وظيفة المتغير `messages_stack` والمتغير `reports` في الكود؟

  • أ) `messages_stack` لتخزين عناوين الوسيط، و`reports` لتخزين رسائل الخطأ.
  • ب) كلاهما له نفس الوظيفة ولكن لأجزاء مختلفة من الكود.
  • ج) `messages_stack` لتخزين الرسائل الواردة مؤقتاً، بينما `reports` لتخزين كائنات التقارير المُنشأة.
  • د) `messages_stack` لتخزين إعدادات الاتصال، و`reports` لتخزين بيانات أجهزة الاستشعار.

الإجابة الصحيحة: c

الإجابة: `messages_stack` لتخزين الرسائل الواردة مؤقتاً، بينما `reports` لتخزين كائنات التقارير المُنشأة.

الشرح: 1. المتغير `messages_stack` مُعرّف بالتعليق: "The array with the messages per can filling". 2. وظيفته: هو قائمة (array) تعمل كذاكرة مؤقتة (stack) لتخزين الرسائل الواردة من الوسيط عبر دالة `on_message`، وهي خاصة بملء صندوق قمامة معين. 3. المتغير `reports` مُعرّف بالتعليق: "The array with all the generated report objects". 4. وظيفته: هو قائمة لتخزين كائنات التقارير التي تم إنشاؤها بعد معالجة البيانات من `messages_stack`، وتمثل المخرجات النهائية المنظمة. 5. الفرق: الأول للتخزين المؤقت للبيانات الخام، والثاني للتخزين الدائم للمخرجات المُعالجة.

تلميح: اقرأ التعليقات (Comments) بجانب تعريف كل متغير.

التصنيف: فرق بين مفهومين | المستوى: متوسط