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

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

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

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

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

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

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

📝 ملخص الصفحة

📚 فك تشفير الرسائل وإنشاء التقارير

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

فك تشفير حمولة الرسالة (payload): تحويل البيانات المشفرة الواردة عبر MQTT إلى نص مقروء باستخدام `str(msg.payload.decode())`.

تحويل إلى كائن JSON: تحويل النص الناتج إلى كائن برمجي (قاموس) في Python باستخدام `json.loads(payload)`.

توليد التقرير (generate_report): دالة تُستدعى تلقائياً عند استلام رسالة تحتوي على العلم `"can_filled": True` لإنشاء تقرير عن الحاوية الممتلئة.

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

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

فك تشفير الرسائل وإنشاء التقارير (صفحة 299)

خطوات معالجة الرسالة في دالة on_message

#### فك تشفير الحمولة: `payload = str(msg.payload.decode())`

#### تحويل إلى كائن JSON: `payload_object = json.loads(payload)`

#### تخزين الرسالة: `messages_stack.append(payload_object)`

#### طباعة تأكيد الاستلام في Terminal.

#### التحقق من علم الامتلاء:

##### إذا كان `payload_object["can_filled"] == True`: استدعاء `generate_report()`

بداية دالة generate_report()

#### الوصول إلى المتغيرات العامة: `data_file_objects`, `messages_stack`, `reports`

#### استخراج الرسالة الأولى والأخيرة من `messages_stack`

#### تحويل الطابع الزمني من نص إلى كائن `datetime`:

##### `first_timestamp = datetime.strptime(first_msg["timestamp"], "%H:%M:%S")`

##### `last_timestamp = datetime.strptime(last_msg["timestamp"], "%H:%M:%S")`

#### حساب وقت الامتلاء:

##### `time_delta = last_timestamp - first_timestamp`

```

نقاط مهمة

  • يتم فك تشفير كل رسالة واردة وتحويلها إلى كائن JSON قبل تخزينها في `messages_stack`.
  • يتم طباعة تأكيد استلام كل رسالة في Terminal لعرض المحتوى.
  • يتم تشغيل دالة `generate_report()` تلقائياً فقط عند استلام رسالة تحتوي على `"can_filled": True`.
  • تبدأ دالة التقرير باستخراج أول وآخر رسالة من المكدس لاستخدامها في حساب وقت الامتلاء.

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

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

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

# Decode the message payload payload = str(msg.payload.decode()) # Convert the payload to a JSON object and append it # to the messages stack payload_object = json.loads(payload) messages_stack.append(payload_object) # When you receive a message, print it to the terminal print("|----- MESSAGE RECEIVED ----|\n") print("Payload: " + str(payload_object)) # If the payload object has the can_filled flag set to True # generate a report for the filled can if payload_object["can_filled"] == True: generate_report() def generate_report(): global data_file_objects # Access data_file_objects variable global messages_stack # Access messages_stack variable global reports # Access reports variable # Getting the first and last objects from the messages stack first_msg = messages_stack[0] last_msg = messages_stack[len(messages_stack) - 1] # Converting the string datetimes to datetime objects first_timestamp = datetime.strptime(first_msg["timestamp"], "%H:%M:%S") last_timestamp = datetime.strptime(last_msg["timestamp"], "%H:%M:%S") garbage_drops = last_msg["garbage_drops"] # Calculating the time_to_fill by comparing the timestamps # of the first and last fillings time_delta = last_timestamp - first_timestamp

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

# Decode the message payload payload = str(msg.payload.decode()) # Convert the payload to a JSON object and append it # to the messages stack payload_object = json.loads(payload) messages_stack.append(payload_object) # When you receive a message, print it to the terminal print("|----- MESSAGE RECEIVED ----|\n") print("Payload: " + str(payload_object)) # If the payload object has the can_filled flag set to True # generate a report for the filled can if payload_object["can_filled"] == True: generate_report() def generate_report(): global data_file_objects # Access data_file_objects variable global messages_stack # Access messages_stack variable global reports # Access reports variable # Getting the first and last objects from the messages stack first_msg = messages_stack[0] last_msg = messages_stack[len(messages_stack) - 1] # Converting the string datetimes to datetime objects first_timestamp = datetime.strptime(first_msg["timestamp"], "%H:%M:%S") last_timestamp = datetime.strptime(last_msg["timestamp"], "%H:%M:%S") garbage_drops = last_msg["garbage_drops"] # Calculating the time_to_fill by comparing the timestamps # of the first and last fillings time_delta = last_timestamp - first_timestamp

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

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

في سياق برمجة إنترنت الأشياء، ما هي الوظيفة الرئيسية للكود `payload = str(msg.payload.decode())`؟

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

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

الإجابة: فك تشفير البيانات الواردة من جهاز إنترنت الأشياء وتحويلها إلى سلسلة نصية.

الشرح: 1. `msg.payload` يستقبل البيانات (Payload) المرسلة عبر بروتوكول MQTT (شائع في إنترنت الأشياء). 2. `.decode()` يحول البيانات من تنسيق بايت (bytes) إلى سلسلة نصية (string). 3. `str()` تضمن أن النتيجة هي سلسلة نصية، مما يسهل معالجتها لاحقاً (مثل تحويلها إلى كائن JSON).

تلميح: تتعلق هذه العملية بتحويل البيانات من تنسيق قابل للنقل عبر الشبكة إلى تنسيق يمكن للبرنامج قراءته ومعالجته.

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

في برنامج معالجة بيانات إنترنت الأشياء، ما الغرض من استخدام الدالة `json.loads()` على الـ Payload؟

  • أ) تحويل كائن Python إلى سلسلة نصية بتنسيق JSON للإرسال.
  • ب) تحميل مكتبة JSON الأساسية في لغة Python.
  • ج) تحويل سلسلة نصية (string) تحتوي على بيانات بتنسيق JSON إلى كائن (object) أو قاموس (dictionary) في لغة البرمجة.
  • د) تشفير البيانات باستخدام خوارزمية JSON للحماية.

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

الإجابة: تحويل سلسلة نصية (string) تحتوي على بيانات بتنسيق JSON إلى كائن (object) أو قاموس (dictionary) في لغة البرمجة.

الشرح: 1. بعد فك تشفير الـ Payload، نحصل على سلسلة نصية قد تبدو هكذا: `{"temperature": 25, "humidity": 60}`. 2. الدالة `json.loads()` تأخذ هذه السلسلة النصية كمدخل. 3. تقوم بتحليل (Parse) السلسلة وتحويلها إلى هيكل بيانات (مثل قاموس في Python) يمكن الوصول إليه مباشرة (مثلاً: `payload_object["temperature"]` تعطي القيمة 25).

تلميح: هذه الدالة تسمح للبرنامج بالتعامل مع البيانات المنظمة (مثل القراءات من الحساسات) ككائنات يمكن الوصول إلى خصائصها بسهولة.

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

في مثال مراقبة صندوق القمامة الذكي، ما الشرط الذي يؤدي إلى استدعاء دالة `generate_report()`؟

  • أ) عند استقبال أي رسالة جديدة من أي جهاز على الشبكة.
  • ب) عندما تكون قيمة المفتاح (key) "can_filled" في كائن البيانات الوارد مساوية لـ True.
  • ج) عندما يكون حجم الـ Payload الوارد أكبر من حجم محدد.
  • د) بشكل تلقائي كل 5 دقائق بغض النظر عن البيانات.

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

الإجابة: عندما تكون قيمة المفتاح (key) "can_filled" في كائن البيانات الوارد مساوية لـ True.

الشرح: 1. بعد تحويل الـ Payload إلى كائن (`payload_object`)، يصبح بإمكان البرنامج فحص خصائصه. 2. يتحقق الشرط `if payload_object["can_filled"] == True:` من قيمة المفتاح `can_filled` داخل الكائن. 3. إذا كانت القيمة `True` (صحيحة)، فهذا يشير إلى أن صندوق القمامة قد امتلاء، مما يستدعي تنفيذ الدالة `generate_report()` لإنشاء تقرير عن الحدث.

تلميح: يتم فحص خاصية معينة في البيانات الواردة من الحساس لتحديد ما إذا كان حدث معين (مثل امتلاء الصندوق) قد وقع.

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

كيف يحسب البرنامج الزمن المستغرق لملء صندوق القمامة (`time_to_fill`) في مثال إنترنت الأشياء؟

  • أ) بجمع كل الأوقات المسجلة في `messages_stack`.
  • ب) باستخدام وقت النظام الحالي فقط.
  • ج) بطرح وقت أول رسالة استقبلت (`first_timestamp`) من وقت آخر رسالة استقبلت (`last_timestamp`) في الدفعة الحالية.
  • د) بقسمة عدد الرسائل المستلمة على معدل الإرسال.

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

الإجابة: بطرح وقت أول رسالة استقبلت (`first_timestamp`) من وقت آخر رسالة استقبلت (`last_timestamp`) في الدفعة الحالية.

الشرح: 1. يجمع البرنامج الرسائل المتعلقة بدورة ملء واحدة في `messages_stack`. 2. يستخرج الطابع الزمني للرسالة الأولى (`first_msg["timestamp"]`) والأخيرة (`last_msg["timestamp"]`). 3. يحول هذه السلاسل النصية إلى كائنات `datetime` تسمح بإجراء العمليات الحسابية. 4. عملية الطرح (`last_timestamp - first_timestamp`) تعطي `time_delta`، وهو كائن يمثل الفترة الزمنية المستغرقة للملء.

تلميح: يتم تخزين الطوابع الزمنية (Timestamps) مع كل رسالة بيانات. الحساب يعتمد على مقارنة وقت البداية ووقت النهاية.

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