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

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

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

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

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

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

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

📝 ملخص الصفحة

📚 برمجة وتطبيقات MQTT

المفاهيم الأساسية

تحديث ملف البيانات: إلحاق كائن التقرير الجديد بالمصفوفة الموجودة في ملف JSON وحفظه.

الجزء الرئيسي للبرنامج: فتح ملف البيانات، تهيئة عميل MQTT، ربط معالجات الأحداث، الاتصال بالوسيط، والاشتراك في موضوع للاستماع للرسائل.

التحقق من وجود ملف البيانات: خطوة ضرورية قبل قراءة الملف لتجنب حدوث أخطاء في البرنامج.

خريطة المفاهيم

```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).

```

نقاط مهمة

  • بعد إنشاء التقرير، يجب تحديث ملف البيانات الرئيسي (data.json) فوراً لحفظ المعلومات الجديدة.
  • قبل أي عملية قراءة لملف البيانات، يجب التحقق من وجوده لتجنب أخطاء تشغيل البرنامج.
  • الجزء الرئيسي من البرنامج يجمع بين تهيئة اتصال MQTT وإدارة ملف البيانات في سلسلة واحدة من الخطوات المنطقية.

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

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

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

# Append the new report to the objects of the data file # and write the data_file_objects array to the data file data_file_objects.append(report) with open(data_file, 'w') as file: json.dump(data_file_objects, file, indent=4, separators=(',', ':')) # Append the report object to the reports array and to the JSON data file # and clear the messages stack reports.append(report) messages_stack = []

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

تحديث محتويات مصفوفة البيانات وملف البيانات.

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

ستتحقق في الجزء الرئيس من البرنامج مما إذا كانت البيانات موجودة وتقوم بفتحها، ثم ستقوم بتهيئة عميل MQTT، وتربط معالجات الأحداث on_connect و on_message بالدوال المذكورة أعلاه. ثم تقوم بالاتصال بوسيط MQTT، والاشتراك في الموضوع المحدد والاستماع إلى الرسائل الواردة.

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

# Check if the data file exists if path.isfile(data_file) is False: raise Exception("Data file not found") # Read the contents of the JSON data file with open(data_file) as fp: data_file_objects = json.load(fp) client = mq.Client(CLIENT_ID) # Initialize an MQTT client client.on_connect = on_connect # Bind the on_connect event handler client.on_message = on_message # Bind the on_message event handler client.connect(MQTT_BROKER, PORT) # Connect on the specified MQTT broker client.subscribe(TOPIC, 0) # Subscribe to the specified topic client.loop_forever() # Listen continuously for messages

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

التأكد من وجود ملف البيانات لتجنب الأخطاء.

نوع: METADATA

297

نوع: METADATA

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

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

# Append the new report to the objects of the data file # and write the data_file_objects array to the data file data_file_objects.append(report) with open(data_file, 'w') as file: json.dump(data_file_objects, file, indent=4, separators=(',', ':')) # Append the report object to the reports array and to the JSON data file # and clear the messages stack reports.append(report) messages_stack = [] تحديث محتويات مصفوفة البيانات وملف البيانات. ستتحقق في الجزء الرئيس من البرنامج مما إذا كانت البيانات موجودة وتقوم بفتحها، ثم ستقوم بتهيئة عميل MQTT، وتربط معالجات الأحداث on_connect و on_message بالدوال المذكورة أعلاه. ثم تقوم بالاتصال بوسيط MQTT، والاشتراك في الموضوع المحدد والاستماع إلى الرسائل الواردة. # Check if the data file exists if path.isfile(data_file) is False: raise Exception("Data file not found") # Read the contents of the JSON data file with open(data_file) as fp: data_file_objects = json.load(fp) client = mq.Client(CLIENT_ID) # Initialize an MQTT client client.on_connect = on_connect # Bind the on_connect event handler client.on_message = on_message # Bind the on_message event handler client.connect(MQTT_BROKER, PORT) # Connect on the specified MQTT broker client.subscribe(TOPIC, 0) # Subscribe to the specified topic client.loop_forever() # Listen continuously for messages التأكد من وجود ملف البيانات لتجنب الأخطاء. 297 وزارة التعليم Ministry of Education 2025 - 1447

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

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

في سياق برنامج Python يتعامل مع MQTT، ما هي الوظيفة الرئيسية للدالة `on_message`؟

  • أ) إنشاء اتصال جديد مع وسيط MQTT.
  • ب) معالجة الرسائل الواردة من وسيط MQTT عند استلامها.
  • ج) إرسال رسائل إلى موضوع محدد على وسيط MQTT.
  • د) الاشتراك في موضوع جديد بعد فشل الاشتراك الأول.

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

الإجابة: معالجة الرسائل الواردة من وسيط MQTT عند استلامها.

الشرح: 1. في برمجة MQTT باستخدام Python، يتم ربط معالج الأحداث `on_message` بعميل MQTT. 2. يتم استدعاء هذه الدالة تلقائياً من قبل المكتبة (مثل paho-mqtt) في كل مرة تصل فيها رسالة جديدة على الموضوع الذي اشترك فيه العميل. 3. وظيفتها هي استقبال محتوى الرسالة (payload) ومعالجتها (مثل تحليلها JSON وتخزينها في ملف).

تلميح: ترتبط هذه الدالة بحدث معين في دورة حياة عميل MQTT.

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

ما الخطوة التي يجب تنفيذها قبل قراءة محتويات ملف JSON في برنامج Python لضمان تجنب الأخطاء؟

  • أ) تشفير محتويات الملف باستخدام مفتاح خاص.
  • ب) التحقق من وجود الملف على نظام الملفات باستخدام `path.isfile()`.
  • ج) حذف النسخة القديمة من الملف لإنشاء نسخة جديدة.
  • د) تحويل الملف من صيغة JSON إلى صيغة XML أولاً.

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

الإجابة: التحقق من وجود الملف على نظام الملفات باستخدام `path.isfile()`.

الشرح: 1. عند كتابة برنامج يعتمد على قراءة بيانات من ملف (مثل ملف JSON)، فإن محاولة فتح ملف غير موجود ستتسبب في خطأ (Exception). 2. لذلك، من الممارسات البرمجية الجيدة التحقق أولاً من وجود المسار المحدد للملف. 3. يتم ذلك عادةً باستخدام دالة مثل `os.path.isfile()` أو `pathlib.Path.exists()`. 4. في النص المقدم، تم استخدام الشرط: `if path.isfile(data_file) is False:` لرفع استثناء في حالة عدم وجود الملف، مما يمنع حدوث أخطاء في وقت التشغيل.

تلميح: تتعلق هذه الخطوة بالتعامل الآمن مع الملفات وفحصها قبل فتحها.

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

بعد معالجة تقرير (report) وارد عبر MQTT في Python، ما الإجراءان المتسلسلان اللذان يتم تنفيذهما عادةً لحفظ البيانات بشكل دائم؟

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

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

الإجابة: إضافة كائن التقرير إلى مصفوفة الكائنات في الذاكرة، ثم كتابة المصفوفة المحدثة بالكامل إلى ملف JSON.

الشرح: 1. أولاً: يتم إلحاق كائن التقرير الجديد (`report`) بمصفوفة موجودة في الذاكرة تحتوي على جميع التقارير السابقة (`data_file_objects.append(report)`). هذا يحدث في ذاكرة البرنامج. 2. ثانياً: لكي يصبح التقرير الجديد جزءاً دائماً من البيانات ويبقى بعد إغلاق البرنامج، يجب حفظ مصفوفة الكائنات المحدثة بالكامل (`data_file_objects`) إلى ملف على القرص. 3. يتم ذلك بفتح الملف في وضع الكتابة (`'w'`) واستخدام `json.dump()` لكتابة المحتوى الجديد، مما يستبدل المحتوى القديم.

تلميح: يتضمن الإجراء خطوتين: تحديث البيانات في الذاكرة (RAM)، ثم حفظ هذه البيانات على القرص (Storage).

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