الاتصال في شبكة إنترنت الأشياء | الوحدة الثامنة | الدرس الثاني

الاتصال في شبكة إنترنت الأشياء هو عنوان الدرس الثاني من الوحدة الثامنة التي تحمل اسم “محاكاة شبكة مستشعرات إنترنت الأشياء اللاسلكية” مقرر “إنترنت الأشياء 2-1” الفصل الدراسي الثالث.
ستتعرف في هذا الموضوع على كيفية تكوين الاتصال بين الأجهزة في إنترنت الأشياء، والتعرُّف على العُقد ووظائفها، وكيفية إنشاء مشروع لمحاكاة نظام مراقبة الحرائق في المصانع، وكذلك إضافة العقد الطرفية وإنشاء المقاطع البرمجية لتشغيل العُقد.
لذا قم بقراءة نواتج التعلُّم بعناية، ثم أعد قراءتها وتأكَّد من تحصيل كافة محتوياتها بعد انتهائك من دراسة الموضوع.
أهداف التعلُّم
- معرفة تكوين الاتصال بين الأجهزة في إنترنت الأشياء.
- معرفة العُقد ووظائفها.
- إنشاء مشروع لمحاكاة نظام مراقبة الحرائق في المصانع.
- إضافة العُقد الطرفية.
- إنشاء المقاطع البرمجية لتشغيل العُقد.
هيا لنبدأ!
الاتصال بين الأجهزة (Communication between Devices)
تتكون شبكة إنترنت الأشياء من العديد من الأجهزة التي تُرسل وتستقبل البيانات بي بعضها.
تتمايز هذه الأجهزة في إمكانياتها المختلفة:
- النطاق.
- عرض النطاق الترددي للبيانات.
- استهلاكها للطاقة.
وبالتالي تقوم بتشغيل مجموعات مختلفة من الأوامر لتوفير العديد من الوظائف.
لمعرفة المزيد من المعلومات عن الاتصال بين الأجهزة في شبكة إنترنت الأشياء، قم بالاطلاع على الرابط التالي:
نظرة عامة وتعريف الاتصال بإنترنت الأشياء – QalamCode
مراقبة الحريق والتحذيرات (Fire Surveillance and Notification)
سننشئ في هذا الدرس مشروعًا يُحاكي نظام مراقبة الحرائق في المصانع.
سيتم في هذه المحاكة إنشاء حرائق عشوائية في مصنع، وسيبلغ النظام وحدة التحكم الرئيسة بالمصنع عن القطاع الذي توجد في الحريق.
سيتم تنفيذ لك باستخدام مجموعة متنوعة من العقد ذات الوظائف المختلفة التي ستتواصل مع بعضها لتمرير الرسالة بدءًا من العقد الطرفية (Edge) مرورًا بالعقد الوسطى .(Proxies)
لتصل أخيرًا إلى العقدة الداخلية: المتحكم الرئيس (main controller).
العُقد ووظائفها (The Nodes and Their Functions)
ستستخدم 3 أنواع من العقد في مشروعك لتمثيل قطاعات المصنع المختلفة:
- قد يحدث حريق في الأطراف (Edges) وسيتم تحديده بواسطة مولد أرقام عشوائي. في هذه الحالات:
- ستطبع العقدة رسالة ذاتية وترسل رسالة مختلفة تحتوي على رقم القطاع إلى عقدة الوسطى (Proxy) المجاورة لها، ثم ستسكن لمدة زمنية محددة.
- سيقرأ الوكلاء أي رسائل قد تلقوها ويعيدونها إلى وحدة المتحكم الرئيسة (main controller) كما قد يقومون بطباعة رسالة ذاتية لإبلاغ المستخدم بما يقومون به.
- تقوم وحدة المتحكم الرئيسة أيضًا بقراءة أي رسائل قد تكون تلقتها، وتطبع الرسائل التي أُنشأت بواسطة العقد الطرفية التي تُخبر المستخدم بالحريق.
لنبدأ بإنشاء مشروع جديد:
لإنشاء مشروع جديد:
- اضغط على New Project (مشروع جديد) من شريط الأدوات.
- اختر الموقع الذي تريد تخزين المشروع فيه، ثم اكتب “Fire Surveillance and Notification” في حقل File name (اسم الملف).
- اضغط على Save (حفظ).
ابدأ بإنشاء شبكة العُقدة بإضافة وحدة المُتحكم الرئيسة والوسطى:
لإدراج وحدة المُتحكم وعُقد الوسطى:
- اضغط على IoT Node (عُقدة إنترنت الأشياء) من شريط Toolbar (الأدوات).
- اضغط على الخريطة لإضافة العُقدة.
- اضغط على All (الكل) من شريط State (الحالة).
- ضع عُقدتين أخريين على يسار ويمين العُقدة الأولى، وداخل دائرتها الخارجية.
اضغط على Esc في لوحة المفاتيح.
لاحظ أن
إذا لم يتم وضع العُقد داخل نصف قطر وحدة المُتحكم، فلن تتمكَّن من الاتصال. وللتغلُّب على ذلك اسحبها وأفلتها بالقرب من وحدة المُتحكم حتى يظهر سهم ثنائي الاتّجاه يربط بين العُقدتين.
تابع بإضافة العُقد الطرفية:
لإدراج العُقد الطرفية:
- اضغط على IoT Node (عُقدة إنترنت الأشياء) من شريط Toolbar (الأدوات).
- ضع عُقدتين على كل proxy node (عُقدة الوسطى)، وذلك داخل دائرتها الخارجية، ولكن خارج نطاق أي عُقدة أخرى.
- اضغط على All (الكل) من شريط الحالة.
اضغط على Esc في لوحة المفاتيح.
إنشاء المقاطع البرمجية (Creating the Scripts)
ستتعرَّف الآن على المقاطع البرمجية التي ستقوم بتشغيل العُقد.
أولاً: برمجة العقد الطرفية
في البداية، أضف المكتبات اللازمة.
تأخذ دالة توليد الأرقام العشرية randint() عددين صحيحين كوسيطين.
وتعيد عددًا صحيحًا عشوائيًا داخل نطاق هذين العددين.
وفي الحالة السابقة ستُنشئ randint(1, 6) عددًا صحيحًا بشكل عشوائي بين قيمة 6،1.
سيتم استخدام الرقم ليمثل القطاع الذي قد يندلع فيه الحريق كل فترة زمنية, وسيتم تخزين العدد الصحيح في متغير fire.
إذا افترضنا أن دالة randint() ستُرجع الرقم1، فستكون النيران قد اندلعت افتراضيًا في هذا القطاع.
سيتحقق البرنامج مما إذا كانت قيمة المتغير fire تساوي 1 وإذا كان الأمر كذلك.
فسيتم تشغيل سلسة من الأوامر بما فيها طباعة الرسائل “fire!” (حريق) على العقدة نفسها.
وإرسال رسالة تحتوي على معرف القطاع الخاص بها إلى العقد الوسطى (Proxy node) المجاورة لها.
إن مُعرف القطاع هو نفسه رقم مُعرف العقدة، وهو عدد صحيح فريد.
إذا كان معرف القطاع 5 فستكون الرسالة المرسلة “FIRE IN SECTOR 5”.
يُمكن إرجاع مُعرف العقدة وبالتالي القطاع بواسطة الدالة ld().
يتم ارجاع المُعرف كرقم، لذلك يجب تحويله إلى نوع نص قبل أن يتم ربطه بالرسالة المتبقية.
يمكن للعقد إرسال البيانات لبعضها باستخدام دالة send(). تستخدم الدالة وسيطا واحدًا فقط وهو نص الرسالة الذي يقوم ببثه إلى جميع العقد داخل نطاقها.
إذا أنتجت دالة توليد الأرقام العشوائية أي عدد صحيح آخر (في حالتنا أي رقم من 2 إلى 6) فلا يوجد حريق في القطاع.
يتعين على العقدة ببساطة طباعة نص ذاتي فارغ لمسح أي نص مطبوع مسبقًا.
في الختام ستسكن العقدة لفترة زمنية عشوائية، وذلك لمحاكاة عشوائية الأحداث في الحياة الواقعية.
سيتحقق ذلك باستخدام دالة uniform() التي تعمل مثل دالة randint()
ولكنها تنتج أعدادًا حقيقة وليس فقط أعدادًا صحيحة. ستتراوح فترة السكون في هذا المشروع بين 1 – 4 ثواني.
المقطع البرمجي النهائي (edge.py)
Complete Code (edge.py)
بإمكانك مراجعة محتوى موضوع “الاتصال في شبكة إنترنت الأشياء” من بدايته وحتى هذه النقطة، من خلال الرابط التالي:
ثانيًا: برمجة العُقدة الوسطى
عند استقبال العقدة للبيانات، يتم تخزينها في المُخزن المؤقت (buffer) الخاص بها حتى قراءتها.
ولذلك يجب التحقق من حجم المخزن المؤقت في البداية حيث يجب أن تكون أكبر من صفر (غير فارغ).
يُمكن إرجاع المخزن المؤقت بواسطة الدالة bufferSize().
يمكن بعد ذلك قراءة البيانات المستقبلة باستخدام الدالة read(). بعد قراءة الرسالة يتم تخزينها في رسالة المتغير. تقوم العقدة أيضًا بطباعة رسالة “FORWARDING..”. لتوضح أتها تعيد توجيه الرسالة إلى وحدة التحكم الرئيسة.
كما هو الحال في البرنامج السابق، سيتم إرسال الرسالة المخزنة في المتغير إلى وحدة المتحكم الرئيسة باستخدام دالة send().
وهذه المرة ، بصرف النظر عن الرسالة، سيستلزم الأمر وسيطة إضافية وهي مُعرف العقدة المستقبلية (Node ID).
نظرًا لكون الرسالة خاصة بعقدة واحدة وبمعرف محدد فلا يلزم بث الرسالة بل يمكن بدلاً من ذلك أن تكون أحادية الرسائل (أي تُرسل إلى عقدة واحدة فقط).
في الحالة السابقة تم إضافة وحدة المتحكم الرئيسة أولاً، وبالتالي يكون لها مُعرف مساويًا 1.
بعد ذلك، سوف تسكن العقدة لمدة ثانية واحدة لمنح المستخدم وقتًا كافيًا لقراءة الرسالة التوضيحية المطبوعة على العقدة، ثم ستقوم العقدة بمسح الرسالة وذلك بطباعة نص فارغ.
ينتهي المقطع البرمجي بسكون العقدة لفترة زمنية صغيرة جدًا (جزء من مائة من الثانية)، مما يمنحها القدرة على الاستجابة في حال تلقيها الكثير من البيانات.
المقطع البرمجي النهائي (proxy.py)
Complete code (proxy.py)
ثالثًا: برمجة وحدة المُتحكم
يتشابه المقطع البرمجي لوحدة المتحكم نوعًا ما مع برامج العقد الوسطى.
فهو يفحص المخزن المؤقت، ويقرأ الرسالة المستلمة.
ولكن الرسالة الذاتية المطبوعة هي نفس الرسالة التي تم إنشاؤها في الأصل بواسطة عقدة الطرفية (edge node).
بعد ذلك كما حدث في العقد الوسطى ستسكن وحدة المتحكم، ولكن لمدة ثانيتين هذه المرة ثم ستطبع نصً فارغًا.
وفي الختام ستسكن لفترة قصيرة بنفس الطريقة التي حدثت مع العقدة الوسطى.
المقطع البرمجي النهائي (proxy.py)
Complete code (proxy.py)
الآن وبعد أن تعرَّفت على وظيفة المقاطع البرمجية. تابع عملك وقم بإنشائها.
لإنشاء البرنامج وتطبيقه على عُقدة وحدة المُتحكم:
لإنشاء المقطع البرمجي:
- اضغط على بايثون في شريط الأدوات.
- اكتب أوامر بايثون البرمجة في الحقل الفارغ.
- اكتب controller (وحدة المُتحكم) في حقل File name (اسم الملف).
- اضغط على Save (حفظ).
- أغلق نافذة محرر بايثون النصي.
لإدراج البرنامج:
- اضغط على العُقدة.
- اضغط على علامة تبويب Device Parameters (مُعامِلات الجهاز) في قائمة Parameters (المُعامِلات).
- اضغط على صندوق Script file (ملف المقطع البرمجي).
- من القائمة المنسدلة، اختر ملف py واضغط على الزر الموجود على اليمين لإدراج المقطع البرمجي في العُقدة.
- اضغط على Save Project (حفظ المشروع) من Toolbar (شريط الأدوات).
أنشئ المقاطع البرمجية الأخرى بنفس الطريقة، وانسخ أوامرها وطبقّها على العُقد المقابلة لها، بحيث تحتوي جميع العُقد على المقطع البرمجي.
عند الانتهاء، اضغط على Run IoT Simulation (تشغيل محاكاة إنترنت الأشياء) من شريط الأدوات.
لاحظ أنه نظرًا لاستخدامك مُولدات أرقام عشوائية، فقد تشتعل حرائق في بعض القطاعات الموجودة على الأطراف أكثر من غيرها والتي قد لا تشتعل فيها حرائق على الإطلاق.
لاحظ أن
عليك استخدام أسماء نصية مُعبرة وواضحة للمقاطع البرمجية مثل edge.py وproxy.py.
بإمكانك مراجعة محتوى موضوع “الاتصال في شبكة إنترنت الأشياء” بدايةً من عنوان “ثانيًا: برمجة العُقدة الوسطى” وحتى نهاية الموضوع، من خلال الرابط التالي:
اختبر تحصيلك لمحتوى الموضوع من خلال الرابط التالي:
الواجب الإلكتروني
إلى هنا يكون قد انتهى موضوع “الاتصال في شبكة إنترنت الأشياء”، لا تنسوا مراجعة نواتج التعلُّم أعلى المقال، وانتظرونا في الموضوع القادم!