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

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

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

الدرس: إنشاء رسالة JSON

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

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

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

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

📝 ملخص الصفحة

📚 إنشاء رسالة JSON والاتصال بـ MQTT

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

رسالة JSON: كائن قاموس (Dictionary) يتم تحويله إلى تنسيق JSON لنشر البيانات عبر بروتوكول MQTT.

معالج الأحداث (Event Handler): دالة يتم ربطها بحدث معين (مثل نجاح الاتصال) في مكتبة `paho.mqtt.client`.

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

```markmap

7. الرسائل في إنترنت الأشياء

تصميم وبرمجة جهاز ذكي (صفحة 273)

مشروع: إدارة النفايات الذكية

#### المشكلة: اكتظاظ سكاني يؤدي لتراكم النفايات

#### الحل: استخدام حاويات نفايات ذكية

##### ترسل تنبيه عند الامتلاء

##### تحلل البيانات لتحسين العملية

#### التنفيذ: نموذج أولي لحاوية ذكية

##### يحسب متوسط مرات الاستخدام للوصول للسعة الكاملة

##### يرسل رسالة إلى وسيط (MQTT) عند كل استخدام

##### يرسل رسالة عند الامتلاء إلى متحكم النظام

#### التقنيات المستخدمة

##### متحكم أردوينو (Arduino)

##### برمجة باستخدام بروتوكول Firmata ولغة بايثون

##### منصة MQTT (مثل EMQX) لتوزيع الرسائل

مكونات وأدوات المشروع (صفحة 274)

الترانزستور الضوئي (Phototransistor)

#### الوظيفة: كشف الضوء وتحويله لإشارات كهربائية

#### الرمز التخطيطي: رمز ترانزستور مع سهمين باتجاه القاعدة

#### المظهر الفعلي: جسم بلاستيكي صغير بثلاثة أطراف ونافذة شفافة

مستشعر الإمالة (Tilt Sensor)

#### الوظيفة: قياس درجة الميل بالنسبة للجاذبية

#### الرمز التخطيطي: دائرة تحتوي على دوائر صغيرة تمثل آلية الكرة أو الزئبق

#### المظهر الفعلي: مكون مستطيل أسود بثلاثة أطراف

النموذج الأولي باستخدام الأردوينو (صفحة 275)

آلية عمل النموذج

#### مستشعر الإمالة: يسجل حدث الفتح/الإمالة في كل مرة.

#### الترانزستور الضوئي: يعمل كمستشعر عند الوصول إلى حد معين (يعني أن الحاوية مليئة).

المكونات المطلوبة

#### لوحة أردوينو أونو R3

#### لوحة توصيل الدوائر الصغيرة (Breadboard)

#### ترانزستور ضوئي

#### مستشعر إمالة

#### مقاومتان (1 كيلو أوم)

الاتصال ببسيط EMXQ العام (صفحة 276)

خطوات التثبيت والاتصال

#### 1. تثبيت تطبيق MQTTX

##### زيارة موقع: https://mqttx.app/

##### تنزيل أحدث إصدار وتشغيل المثبت

#### 2. تكوين الاتصال بالوسيط (EMQX)

##### فتح تطبيق MQTTX وإنشاء اتصال جديد

##### إدخال بيانات الاتصال:

###### الاسم (Name): مثال: desktop_connection

###### المضيف (Host): mqtt://broker.emqx.io

###### المنفذ (Port): 1883

دائرة الأردوينو (صفحة 277)

تثبيت المكونات

#### 1. لوحة أردوينو أونو R3

#### 2. لوحة توصيل الدوائر الصغيرة (Breadboard)

#### 3. مستشعر الضوء (Phototransistor)

#### 4. مستشعر الإمالة بأربعة أطراف (4-pin Tilt Sensor)

#### 5. مقاومتان (Resistor)

توصيل المكونات (صفحة 278)

توصيل الترانزستور الضوئي

#### 1. الباعث (Emitter) → الطرف التناظري A0 (سلك أصفر)

#### 2. المقاومة: طرف مع الباعث، والطرف الآخر → العمود السالب للوحة

#### 3. 5V من الأردوينو → المقاومة الموجبة للوحة (سلك أحمر)

#### 4. GND من الأردوينو → العمود السالب للوحة (سلك أسود)

#### 5. المجمع (Collector) → العمود الموجب للوحة

توصيل مستشعر الإمالة

#### 1. المقاومة الثانية → الطرف الثاني للمستشعر

#### 2. الطرف الثاني للمستشعر → الطرف الرقمي 3 للأردوينو (سلك أحمر)

#### 3. الطرف الرابع للمستشعر → العمود الموجب للوحة (سلك أحمر)

#### 4. المقاومة: طرف → العمود السالب للوحة (سلك أسود)

الدائرة بشكلها النهائي (صفحة 279)

الشكل النهائي للدائرة

#### شكل 7.16: مخطط تخطيطي للدائرة الكاملة

##### يوضح لوحة أردوينو أونو متصلة بلوحة توصيل

##### يظهر المكونات: مقاومة، LED، ترانزستور

##### يظهر أسلاك التوصيل (أحمر، أصفر، أخضر، أسود، برتقالي)

#### شكل 7.17: صورة فعلية للدائرة

##### تمثل الشكل الحقيقي للدائرة عند بنائها

##### تظهر المكونات نفسها في الواقع

#### شكل 7.18: توصيل الأطراف بالمكونات

##### يوضح كيفية توصيل مكونات محددة بأطراف الأردوينو

##### يظهر مكونًا مربعًا أسود

##### يظهر مكونًا دائريًا موصولًا بالطرف D3

##### يظهر مكونًا دائريًا موصولًا بالطرف A0

برمجة الأردوينو (صفحة 280)

إعداد بيئة البرمجة

#### 1. تشغيل بروتوكول StandardFirmata على الأردوينو

#### 2. تثبيت حزمة paho-mqtt في بايثون

##### الأمر: pip install paho-mqtt

#### 3. إنشاء ملف بايثون جديد (mqtt_arduino.py)

#### 4. استيراد المكتبات المطلوبة

##### datetime: لإنشاء طوابع زمنية

##### time: للتحكم في سير البرنامج

##### json: للعمل مع كائنات JSON

##### pyfirmata: للتواصل مع الأردوينو

##### paho.mqtt.client: لإنشاء عميل MQTT

#### 5. تعريف متغيرات عميل MQTT

##### CLIENT_ID: معرف العميل (مثال: "PUBLISHER_01")

##### MQTT_BROKER: عنوان الوسيط (مثال: "broker.emqx.io")

##### TOPIC: اسم الموضوع (مثال: "waste/drops")

##### PORT: منفذ الخادم الافتراضي (1883)

##### FLAG_CONNECTED: متغير إشارة للاتصال

تهيئة الاتصال وبرمجة المتغيرات (صفحة 281)

تهيئة الاتصال بالأردوينو

#### استخدام مكتبة pyfirmata للاتصال عبر منفذ معين (مثل COM4)

#### تحديد أطراف المستشعرات:

##### مستشعر الإضاءة: الطرف التناظري A0

##### مستشعر الإمالة: الطرف الرقمي 3

إنشاء متغيرات المشروع

#### can_full: متغير منطقي (True/False) يحدد ما إذا كانت الحاوية ممتلئة.

#### garbage_drops: عداد لتتبع عدد مرات الاستخدام (الإمالة).

إنشاء دالة لإعادة التعيين

#### reset_can(): تعيد تعيين متغيري can_full و garbage_drops إلى القيم الافتراضية عند امتلاء الحاوية.

إنشاء رسالة JSON (صفحة 282)

خطوات إنشاء الدالة publish_message()

#### 1. إنشاء متغير timestamp بتنسيق الوقت (مثال: "%H:%M:%S")

#### 2. إنشاء كائن قاموس (Dictionary) يحتوي على:

##### timestamp

##### garbage_drops

##### can_full

#### 3. تحويل القاموس إلى كائن JSON باستخدام json.dumps()

#### 4. نشر الرسالة إلى الموضوع المشترك (مثال: "waste/drops") عبر client.publish()

#### 5. التعامل مع الأخطاء المحتملة أثناء النشر

الاتصال بـ MQTT (صفحة 282)

إنشاء دالة معالج الأحداث on_connect()

#### الوظيفة: إرسال رسالة تأكيد إلى الواجهة الطرفية (Terminal) حول نجاح الاتصال أو فشله.

#### الوسيط rc: يرسل من خلال مكتبة paho ليعرض حالة الاتصال.

##### إذا كان rc == 0: الاتصال ناجح.

##### إذا كان rc != 0: الاتصال فاشل.

```

نقاط مهمة

  • دالة `publish_message()` تقوم بإنشاء طابع زمني، ثم تجمع البيانات في قاموس، ثم تحوله إلى JSON قبل نشره عبر MQTT.
  • دالة `on_connect()` هي معالج حدث يتم استدعاؤه تلقائيًا عند محاولة الاتصال بالوسيط، وتستخدم الوسيط `rc` لتحديد نجاح العملية.
  • الوسيط `rc` في دالة `on_connect` يأتي من مكتبة `paho.mqtt.client` للإشارة إلى نتيجة محاولة الاتصال.

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

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

إنشاء رسالة JSON

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

قم بإنشاء الدالة الآتية لإرسال رسالة للعميل تفيد بأنه تم استخدامخدام الحاوية. ستقوم أولاً بإنشاء متغير باسم timestamp لتسجيل الوقت، وإنشاء كائن قاموس Dictionary بالخصائص timestamp و garbage_drops و can_full.، ثم ستقوم بتحويل هذا القاموس إلى كائن JSON، ثم نشره إلى كائن مشترك "waste/drops" من خلال العميل.

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

def publish_message(): global garbage_drops # Access garbage_drops variable global can_full # Access can_full variable # Create a custom format for the timestamp timestamp = str(datetime.now().strftime("%H:%M:%S")) msg_dictionary = { # Creating the JSON object "timestamp": timestamp, "garbage_drops": garbage_drops, "can_full": can_full } msg = json.dumps(msg_dictionary) # Convert dictionary to JSON try: result = client.publish(TOPIC, msg) # Publish message except: print("There was an error while publishing the message") time.sleep(2)

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

إنشاء تنسيق يتناسب مع بيانات الوقت.

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

إنشاء كائن قاموس JSON لإرسال البيانات.

الاتصال بـ MQTT

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

قم بإنشاء دالة معالج الأحداث الآتية، والتي ستطيع رسالة تأكيد إلى الواجهة الطرفية Terminal حول نجاح الاتصال أو فشله. وسيطات الدالة هي وسيطات افتراضية تستخدم لربط هذه الدالة بمعالج الأحداث المناسب الذي توفره مكتبة paho.mqtt.client.

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

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!")

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

هذا المتغير يرسل من خلال مكتبة paho ليظهر حالة الاتصال.

نوع: METADATA

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

نوع: METADATA

282

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

--- SECTION: إنشاء رسالة JSON --- قم بإنشاء الدالة الآتية لإرسال رسالة للعميل تفيد بأنه تم استخدامخدام الحاوية. ستقوم أولاً بإنشاء متغير باسم timestamp لتسجيل الوقت، وإنشاء كائن قاموس Dictionary بالخصائص timestamp و garbage_drops و can_full.، ثم ستقوم بتحويل هذا القاموس إلى كائن JSON، ثم نشره إلى كائن مشترك "waste/drops" من خلال العميل. def publish_message(): global garbage_drops # Access garbage_drops variable global can_full # Access can_full variable # Create a custom format for the timestamp timestamp = str(datetime.now().strftime("%H:%M:%S")) msg_dictionary = { # Creating the JSON object "timestamp": timestamp, "garbage_drops": garbage_drops, "can_full": can_full } msg = json.dumps(msg_dictionary) # Convert dictionary to JSON try: result = client.publish(TOPIC, msg) # Publish message except: print("There was an error while publishing the message") time.sleep(2) إنشاء تنسيق يتناسب مع بيانات الوقت. إنشاء كائن قاموس JSON لإرسال البيانات. --- SECTION: الاتصال بـ MQTT --- قم بإنشاء دالة معالج الأحداث الآتية، والتي ستطيع رسالة تأكيد إلى الواجهة الطرفية Terminal حول نجاح الاتصال أو فشله. وسيطات الدالة هي وسيطات افتراضية تستخدم لربط هذه الدالة بمعالج الأحداث المناسب الذي توفره مكتبة paho.mqtt.client. 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!") هذا المتغير يرسل من خلال مكتبة paho ليظهر حالة الاتصال. وزارة التعليم 2025 - 1447 282

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

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

ما الغرض الرئيسي من الدالة `publish_message()` في سياق إنترنت الأشياء كما ورد في المثال؟

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

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

الإجابة: إنشاء رسالة JSON تحتوي على بيانات الحاوية (الوقت، عدد القمامة، حالة الامتلاء) ونشرها عبر بروتوكول MQTT.

الشرح: 1. تسجيل الطابع الزمني. 2. إنشاء قاموس (Dictionary) يحتوي على البيانات. 3. تحويل القاموس إلى تنسيق JSON. 4. نشر الرسالة JSON إلى موضوع (Topic) محدد عبر عميل MQTT.

تلميح: تتضمن الدالة خطوات لتحويل البيانات إلى تنسيق قابل للإرسال عبر الشبكة.

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

ما هي الخطوة التي تلي إنشاء القاموس (Dictionary) مباشرة في عملية إنشاء رسالة JSON للنشر عبر MQTT كما في المثال؟

  • أ) تشفير الرسالة باستخدام مفتاح خاص.
  • ب) تخزين القاموس في قاعدة بيانات SQLite.
  • ج) تحويل القاموس إلى سلسلة نصية بتنسيق JSON باستخدام الدالة `json.dumps()`.
  • د) إرسال القاموس مباشرة إلى الطابعة.

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

الإجابة: تحويل القاموس إلى سلسلة نصية بتنسيق JSON باستخدام الدالة `json.dumps()`.

الشرح: بعد إنشاء القاموس `msg_dictionary`، يجب تحويله إلى تنسيق JSON قياسي باستخدام دالة مثل `json.dumps()` قبل إمكانية نشره عبر بروتوكول MQTT.

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

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

ما الذي يشير إليه الرمز `rc` في دالة معالج الاتصال `on_connect` في مكتبة paho-mqtt؟

  • أ) معدل نقل البيانات (Rate of Communication) بالبايت في الثانية.
  • ب) رمز النتيجة (Result Code) الذي يوضح نجاح أو فشل محاولة الاتصال بخادم MQTT.
  • ج) رقم المنفذ (Port Number) المستخدم للاتصال.
  • د) مستوى جودة الخدمة (Quality of Service) للرسالة.

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

الإجابة: رمز النتيجة (Result Code) الذي يوضح نجاح أو فشل محاولة الاتصال بخادم MQTT.

الشرح: الرمز `rc` (اختصار لـ return code) هو وسيط تُرجعه المكتبة. القيمة 0 تعني نجاح الاتصال، بينما أي قيمة أخرى تشير إلى نوع معين من الفشل.

تلميح: يتم فحص قيمته لتحديد ما إذا كان الاتصال ناجحاً.

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

ما هو الشرط الذي يجب تحققه داخل دالة `on_connect` للإعلان عن نجاح الاتصال بخادم MQTT؟

  • أ) أن تكون قيمة الوسيط `flags` أكبر من 10.
  • ب) أن تكون قيمة الوسيط `rc` مساوية للصفر (rc == 0).
  • ج) أن يكون المتغير `client` غير فارغ (None).
  • د) أن تكون قيمة الوسيط `userdata` مساوية لـ "connected".

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

الإجابة: أن تكون قيمة الوسيط `rc` مساوية للصفر (rc == 0).

الشرح: تُرجع مكتبة paho-mqtt قيمة `rc` (رمز النتيجة). وفقاً للتوثيق القياسي، القيمة 0 تعني أن الاتصال تم بنجاح. لذلك، الشرط `if rc == 0:` هو الفحص المعياري لنجاح الاتصال.

تلميح: يتم استخدام عامل المقارنة للتحقق من المساواة.

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