You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
461 lines
39 KiB
461 lines
39 KiB
# <div dir="rtl">قم بتوصيل جهازك بالإنترنت</div>
|
|
|
|
![A sketchnote overview of this lesson](../../../../sketchnotes/lesson-4.jpg)
|
|
> Sketchnote by [Nitya Narasimhan](https://github.com/nitya). Click the image for a larger version.
|
|
|
|
## <div dir="rtl">اختبار ما قبل المحاضرة</div>
|
|
[اختبار ما قبل المحاضرة](https://brave-island-0b7c7f50f.azurestaticapps.net/quiz/7)
|
|
|
|
## <div dir="rtl">المقدمة</div>
|
|
|
|
<div dir="rtl">
|
|
يرمز ** I ** in IoT إلى ** الإنترنت ** - الاتصال السحابي والخدمات التي تتيح الكثير من ميزات أجهزة إنترنت الأشياء ، من جمع القياسات من المستشعرات المتصلة بالجهاز ، إلى إرسال الرسائل للتحكم في المشغلات . تتصل أجهزة إنترنت الأشياء عادةً بخدمة سحابية واحدة لإنترنت الأشياء باستخدام بروتوكول اتصال قياسي ، وهذه الخدمة متصلة ببقية تطبيق إنترنت الأشياء الخاص بك ، بدءًا من خدمات الذكاء الاصطناعي لاتخاذ قرارات ذكية حول بياناتك ، إلى تطبيقات الويب للتحكم أو إعداد التقارير.
|
|
|
|
> 🎓 البيانات التي يتم جمعها من أجهزة الاستشعار وإرسالها إلى السحابة تسمى القياس عن بعد.
|
|
|
|
يمكن لأجهزة إنترنت الأشياء استقبال الرسائل من السحابة. غالبًا ما تحتوي الرسائل على أوامر - وهي إرشادات لتنفيذ إجراء إما داخليًا (مثل إعادة التشغيل أو تحديث البرامج الثابتة) ، أو باستخدام مشغل (مثل تشغيل الضوء).
|
|
|
|
يقدم هذا الدرس بعض بروتوكولات الاتصال التي يمكن أن تستخدمها أجهزة إنترنت الأشياء للاتصال بالسحابة وأنواع البيانات التي قد ترسلها أو تتلقاها. ستحصل أيضًا على تدريب عملي مع كليهما ، وإضافة التحكم في الإنترنت إلى ضوء الليل ، ونقل منطق التحكم في LED إلى كود "السيرفر" الذي يعمل محليًا.
|
|
|
|
سنغطي في هذا الدرس:
|
|
|
|
* [بروتوكولات الاتصال](#communication-protocols)
|
|
* [النقل عن بعد لخدمة وضع الرسائل في قائمة انتظار (MQTT)](#message-queueing-telemetry-transport-mqtt)
|
|
* [القياس عن بعد](#telemetry)
|
|
* [أوامر](#commands)
|
|
|
|
## بروتوكولات الاتصال
|
|
|
|
هناك عدد من بروتوكولات الاتصال الشائعة التي تستخدمها أجهزة إنترنت الأشياء للاتصال بالإنترنت. الأكثر شيوعًا يعتمد على نشر / اشتراك الرسائل عبر نوع من الوسطاء. تتصل أجهزة إنترنت الأشياء بالوسيط وتنشر التتبع عن بعد والاشتراك في الأوامر. تتصل الخدمات السحابية أيضًا بالوسيط وتشترك في جميع رسائل التتبع عن بُعد وتنشر الأوامر إما على أجهزة محددة أو إلى مجموعات من الأجهزة.
|
|
|
|
![IoT devices connect to a broker and publish telemetry and subscribe to commands. Cloud services connect to the broker and subscribe to all telemetry and send commands to specific devices.](../../../../images/pub-sub.png)
|
|
|
|
MQTT هو بروتوكول الاتصال الأكثر شيوعًا لأجهزة إنترنت الأشياء ويتم تناوله في هذا الدرس. تشمل البروتوكولات الأخرى AMQP و HTTP / HTTPS.
|
|
|
|
## نقل القياس عن بُعد لخدمة وضع الرسائل في قائمة انتظار (MQTT)
|
|
|
|
<a href="http://mqtt.org">MQTT</a> هو بروتوكول مراسلة قياسي خفيف الوزن ومفتوح يمكنه إرسال الرسائل بين الأجهزة. تم تصميمه في عام 1999 لمراقبة خطوط أنابيب النفط ، قبل طرحه كمعيار مفتوح بعد 15 عامًا من قبل شركة IBM.
|
|
|
|
MQTT لديها وسيط واحد وعملاء متعددين. يتصل جميع العملاء بالوسيط ، ويقوم الوسيط بتوجيه الرسائل إلى العملاء المعنيين. يتم توجيه الرسائل باستخدام موضوعات محددة ، بدلاً من إرسالها مباشرة إلى عميل فردي. يمكن للعميل النشر في موضوع ، وسيتلقى أي عميل يشترك في هذا الموضوع الرسالة.
|
|
|
|
![IoT device publishing telemetry on the /telemetry topic, and the cloud service subscribing to that topic](../../../../images/mqtt.png)
|
|
|
|
|
|
✅ قم ببعض البحث. إذا كان لديك الكثير من أجهزة إنترنت الأشياء ، كيف يمكنك التأكد من أن وسيط MQTT الخاص بك يمكنه التعامل مع جميع الرسائل؟
|
|
|
|
### قم بتوصيل جهاز إنترنت الأشياء الخاص بك بـ MQTT
|
|
|
|
الجزء الأول من إضافة التحكم في الإنترنت إلى ضوء الليل الخاص بك هو توصيله بوسيط MQTT.
|
|
|
|
#### مهمة
|
|
|
|
قم بتوصيل جهازك بوسيط MQTT.
|
|
|
|
في هذا الجزء من الدرس ، ستقوم بتوصيل ضوء إنترنت الأشياء الخاص بك بالإنترنت للسماح بالتحكم فيه عن بُعد. لاحقًا في هذا الدرس ، سيرسل جهاز إنترنت الأشياء الخاص بك رسالة قياس عن بُعد عبر MQTT إلى وسيط MQTT عام بمستوى خفيف ، حيث سيتم التقاطه بواسطة بعض كود السيرفر الذي ستكتبه. سيتحقق هذا الرمز من مستوى الضوء ويرسل رسالة أوامر إلى الجهاز تخبره بتشغيل أو إيقاف تشغيل مؤشر LED.
|
|
|
|
يمكن أن تكون حالة الاستخدام في العالم الحقيقي لمثل هذا الإعداد هي جمع البيانات من مستشعرات ضوئية متعددة قبل اتخاذ قرار بتشغيل الأضواء ، في موقع به الكثير من الأضواء ، مثل الملعب. يمكن أن يؤدي ذلك إلى إيقاف تشغيل الأضواء إذا تم تغطية مستشعر واحد فقط بواسطة السحب أو الطائر ، لكن أجهزة الاستشعار الأخرى اكتشفت ضوءًا كافيًا.
|
|
|
|
✅ ما المواقف الأخرى التي تتطلب تقييم البيانات من أجهزة استشعار متعددة قبل إرسال الأوامر؟
|
|
|
|
بدلاً من التعامل مع تعقيدات إعداد وسيط MQTT كجزء من هذه المهمة ، يمكنك استخدام سيرفر اختبار عام يقوم بتشغيل <a href="https://www.mosquitto.org">Eclipse Mosquitto</a> ، وسيط MQTT مفتوح المصدر. وسيط الاختبار هذا متاح للجمهور على <a href="https://test.mosquitto.org">test.mosquitto.org</a> ، ولا يتطلب إعداد حساب ، مما يجعله أداة رائعة لاختبار عملاء وخوادم MQTT.
|
|
|
|
> 💁 وسيط الاختبار هذا عام وغير آمن. يمكن لأي شخص أن يستمع إلى ما تنشره ، لذا لا ينبغي استخدامه مع أي بيانات تحتاج إلى الحفاظ على خصوصيتها
|
|
|
|
![A flow chart of the assignment showing light levels being read and checked, and the LED begin controlled](../../../../images/assignment-1-internet-flow.png)
|
|
|
|
اتبع الخطوة ذات الصلة أدناه لتوصيل جهازك بوسيط MQTT:
|
|
|
|
* [Arduino - Wio Terminal](wio-terminal-mqtt.md)
|
|
* [كمبيوتر ذو لوحة واحدة - Raspberry Pi/Virtual IoT device](single-board-computer-mqtt.md)
|
|
|
|
### الغوص بشكل أعمق في MQTT
|
|
|
|
يمكن أن تحتوي الموضوعات على تسلسل هرمي ، ويمكن للعملاء الاشتراك في مستويات مختلفة من التسلسل الهرمي باستخدام أحرف البدل. على سبيل المثال ، يمكنك إرسال رسائل قياس درجة الحرارة عن بُعد إلى الموضوع `/ القياس عن بُعد / درجة الحرارة` ورسائل الرطوبة إلى الموضوع` / القياس عن بُعد / الرطوبة` ، ثم في تطبيق السحابة الخاص بك ، اشترك في `/ القياس عن بُعد / *` الموضوع لتلقي كلا الموضوعين رسائل قياس درجة الحرارة والرطوبة.
|
|
|
|
يمكن إرسال الرسائل بجودة الخدمة (QoS) ، والتي تحدد ضمان استلام الرسالة.
|
|
|
|
* مرة واحدة على الأكثر - يتم إرسال الرسالة مرة واحدة فقط ولا يتخذ العميل والوسيط أي خطوات إضافية للإقرار بالتسليم (إطلاق النار والنسيان).
|
|
* مرة واحدة على الأقل - أعاد المرسل محاولة إرسال الرسالة عدة مرات حتى استلام الإقرار (تسليم مُعترف به).
|
|
* مرة واحدة بالضبط - يشترك المرسل والمتلقي في مصافحة ثنائية المستوى لضمان استلام نسخة واحدة فقط من الرسالة (تسليم مضمون).
|
|
|
|
✅ ما المواقف التي قد تتطلب رسالة تسليم مضمونة على النار ونسيان الرسالة؟
|
|
|
|
على الرغم من أن الاسم هو خدمة "وضع الرسائل في قائمة انتظار" (الأحرف الأولى من MQTT) ، إلا أنها لا تدعم قوائم انتظار الرسائل بالفعل. هذا يعني أنه في حالة قطع اتصال العميل ، فلن يتلقى الرسائل التي تم إرسالها أثناء قطع الاتصال بعد إعادة الاتصال ، باستثناء تلك الرسائل التي بدأ بالفعل معالجتها باستخدام عملية QoS. يمكن أن تحتوي الرسائل على علامة محتجزة عليها. إذا تم تعيين هذا ، فسيقوم وسيط MQTT بتخزين آخر رسالة تم إرسالها حول موضوع بهذه العلامة ، وإرسالها إلى أي عملاء اشتركوا لاحقًا في الموضوع. بهذه الطريقة ، سيحصل العملاء دائمًا على أحدث رسالة.
|
|
|
|
يدعم MQTT أيضًا وظيفة البقاء على قيد الحياة التي تتحقق مما إذا كان الاتصال لا يزال على قيد الحياة أثناء الفجوات الطويلة بين الرسائل.
|
|
|
|
> 🦟 <a href="https://mosquitto.org">Mosquitto from the Eclipse Foundation</a> لديه وسيط MQTT مجاني يمكنك تشغيله بنفسك لتجربة MQTT ، جنبًا إلى جنب مع وسيط MQTT عام يمكنك استخدامه لاختبار الكود الخاص بك ، والذي يتم استضافته في <a href="https://test.mosquitto.org">test.mosquitto.org</a>).
|
|
|
|
يمكن أن تكون اتصالات MQTT عامة ومفتوحة أو مشفرة ومؤمنة باستخدام أسماء المستخدمين وكلمات المرور أو الشهادات.
|
|
|
|
> 💁 يتصل MQTT عبر TCP / IP ، وهو نفس بروتوكول الشبكة الأساسي مثل HTTP ، ولكن على منفذ مختلف. يمكنك أيضًا استخدام MQTT عبر مآخذ الويب للتواصل مع تطبيقات الويب التي تعمل في مستعرض ، أو في المواقف التي تحظر فيها جدران الحماية أو قواعد الشبكات الأخرى اتصالات MQTT القياسية.
|
|
|
|
## القياس عن بعد
|
|
|
|
كلمة القياس عن بعد مشتقة من جذور يونانية تعني القياس عن بعد. القياس عن بعد هو عملية جمع البيانات من أجهزة الاستشعار وإرسالها إلى السحابة.
|
|
|
|
> 💁 تم اختراع أحد أقدم أجهزة القياس عن بعد في فرنسا عام 1874 وأرسل الطقس في الوقت الفعلي وأعماق الثلوج من مونت بلانك إلى باريس. استخدمت الأسلاك المادية لأن التقنيات اللاسلكية لم تكن متوفرة في ذلك الوقت.
|
|
|
|
لنلق نظرة على مثال منظم الحرارة الذكي من الدرس 1.
|
|
|
|
![An Internet connected thermostat using multiple room sensors](../../../../images/telemetry.png)
|
|
|
|
يحتوي منظم الحرارة على مستشعرات لدرجة الحرارة لجمع القياس عن بعد. من المرجح أن يحتوي على مستشعر درجة حرارة واحد مدمج ، وقد يتصل بأجهزة استشعار درجة حرارة خارجية متعددة عبر بروتوكول لاسلكي مثل <a href="https://wikipedia.org/wiki/Bluetooth_Low_Energy">Bluetooth Low Energy</a>
|
|
|
|
مثال على بيانات القياس عن بعد التي سترسلها يمكن أن يكون:
|
|
|
|
| الاسم | القيمة | الوصف |
|
|
| ---- | ----- | ----------- |
|
|
| "درجة حرارة الحرارة" | 18 درجة مئوية | درجة الحرارة المقاسة بواسطة مستشعر درجة الحرارة المدمج في منظم الحرارة |
|
|
| "درجة حرارة غرفة المعيشة" | 19 درجة مئوية | تم قياس درجة الحرارة بواسطة مستشعر درجة الحرارة عن بعد والذي تم تسميته "غرفة المعيشة" لتحديد الغرفة الموجودة بها |
|
|
| "حجرة النوم" | 21 درجة مئوية | تم قياس درجة الحرارة بواسطة جهاز استشعار درجة الحرارة عن بعد والذي تم تسميته "غرفة نوم" لتحديد الغرفة الموجودة بها |
|
|
|
|
يمكن للخدمة السحابية بعد ذلك استخدام بيانات القياس عن بُعد هذه لاتخاذ قرارات حول الأوامر التي يجب إرسالها للتحكم في التسخين.
|
|
|
|
### إرسال القياس عن بعد من جهاز إنترنت الأشياء الخاص بك
|
|
|
|
الجزء التالي في إضافة التحكم في الإنترنت إلى ضوء الليل هو إرسال مقياس مستوى الضوء إلى وسيط MQTT حول موضوع القياس عن بُعد.
|
|
|
|
#### مهمة
|
|
|
|
أرسل قياس مستوى الضوء إلى وسيط MQTT.
|
|
|
|
يتم إرسال البيانات بترميز JSON - اختصار لـ JavaScript Object Notation ، وهو معيار لتشفير البيانات في النص باستخدام أزواج المفاتيح / القيمة.
|
|
|
|
✅ إذا لم تكن قد صادفت JSON من قبل ، فيمكنك معرفة المزيد عنها على <a href="https://www.json.org/">JSON.org documentation</a>
|
|
|
|
اتبع الخطوة ذات الصلة أدناه لإرسال بيانات القياس من جهازك إلى وسيط MQTT:
|
|
|
|
* [Arduino - Wio Terminal](wio-terminal-telemetry.md)
|
|
* [كمبيوتر ذو لوحة واحدة - Raspberry Pi/Virtual IoT device](single-board-computer-telemetry.md)
|
|
|
|
### تلقي القياس عن بعد من وسيط MQTT
|
|
|
|
ليس هناك فائدة من إرسال التتبع عن بعد إذا لم يكن هناك شيء على الطرف الآخر للاستماع إليه. يحتاج القياس عن بعد لمستوى الضوء إلى شيء يستمع إليه لمعالجة البيانات. رمز `` السيرفر '' هذا هو نوع الكود الذي ستنشره في خدمة سحابية كجزء من تطبيق إنترنت الأشياء أكبر ، ولكن هنا ستقوم بتشغيل هذا الرمز محليًا على جهاز الكمبيوتر الخاص بك (أو على Pi إذا كنت تقوم بالتشفير مباشرة هناك ). يتكون رمز السيرفر من تطبيق Python الذي يستمع إلى رسائل القياس عن بُعد عبر MQTT بمستويات الضوء. لاحقًا في هذا الدرس ، ستجعله يرد برسالة أوامر تحتوي على إرشادات لتشغيل أو إيقاف تشغيل مؤشر LED.
|
|
|
|
✅ قم ببعض البحث: ماذا يحدث لرسائل MQTT إذا لم يكن هناك مستمع؟
|
|
|
|
#### تثبيت Python و VS Code
|
|
|
|
إذا لم يكن لديك Python و VS Code مثبتًا محليًا ، فستحتاج إلى تثبيتهما لتشفير السيرفر. إذا كنت تستخدم جهازًا افتراضيًا ، أو كنت تعمل على Raspberry Pi ، فيمكنك تخطي هذه الخطوة.
|
|
|
|
##### مهمة
|
|
|
|
قم بتثبيت Python و VS Code.
|
|
1. تثبيت بايثون. راجع <a href="https://www.python.org/downloads">Python downloads page</a> للحصول على إرشادات حول تثبيت أحدث إصدار من Python.
|
|
|
|
1. قم بتثبيت Visual Studio Code (VS Code). هذا هو المحرر الذي ستستخدمه لكتابة رمز جهازك الافتراضي في Python. راجع <a href="https://code.visualstudio.com?WT.mc_id=academic-17441-jabenn">VS Code documentation</a> للحصول على إرشادات حول تثبيت VS Code.
|
|
|
|
> 💁 لك مطلق الحرية في استخدام أي محرر Python IDE أو محرر لهذه الدروس إذا كان لديك أداة مفضلة ، ولكن الدروس ستعطي إرشادات تستند إلى استخدام VS Code.
|
|
|
|
1. قم بتثبيت امتداد VS Code Pylance. هذا امتداد لـ VS Code الذي يوفر دعم لغة Python. راجع <a href="https://marketplace.visualstudio.com/items?itemName=ms-python.vscode-pylance&WT.mc_id=academic-17441-jabenn">Pylance extension documentation</a> للحصول على إرشادات حول تثبيت هذا الامتداد في VS Code.
|
|
|
|
#### تكوين بيئة Python الافتراضية
|
|
|
|
إحدى الميزات القوية في Python هي القدرة على تثبيت <a href="https://pypi.org">pip packages</a> - وهي حزم من التعليمات البرمجية كتبها أشخاص آخرون وتم نشرها على الإنترنت. يمكنك تثبيت حزمة pip على جهاز الكمبيوتر الخاص بك بأمر واحد ، ثم استخدام تلك الحزمة في التعليمات البرمجية الخاصة بك. ستستخدم النقطة لتثبيت حزمة للتواصل عبر MQTT.
|
|
|
|
بشكل افتراضي ، عندما تقوم بتثبيت حزمة تكون متاحة في كل مكان على جهاز الكمبيوتر الخاص بك ، وقد يؤدي ذلك إلى مشاكل مع إصدارات الحزمة - مثل تطبيق واحد يعتمد على إصدار واحد من الحزمة التي تتعطل عند تثبيت إصدار جديد لتطبيق مختلف. للتغلب على هذه المشكلة ، يمكنك استخدام <a href="https://docs.python.org/3/library/venv.html">Python virtual environment</a> ، وهي بالأساس نسخة من Python في مجلد مخصص ، وعند تثبيت النقطة الحزم التي يتم تثبيتها على هذا المجلد فقط.
|
|
|
|
##### مهمة
|
|
|
|
قم بتكوين بيئة Python الافتراضية وتثبيت حزم MQTT pip.
|
|
|
|
1. من المحطة الطرفية أو سطر الأوامر ، قم بتشغيل ما يلي في موقع من اختيارك لإنشاء دليل جديد والانتقال إليه:
|
|
|
|
```sh
|
|
mkdir nightlight-server
|
|
cd nightlight-server
|
|
```
|
|
1. قم الآن بتشغيل ما يلي لإنشاء بيئة افتراضية في المجلد ".venv"
|
|
|
|
```sh
|
|
python3 -m venv .venv
|
|
```
|
|
|
|
> 💁 تحتاج إلى استدعاء `python3` لإنشاء بيئة افتراضية فقط في حالة تثبيت Python 2 بالإضافة إلى Python 3 (أحدث إصدار). إذا كان لديك Python2 مثبتًا ، فإن استدعاء `python` سيستخدم Python 2 بدلاً من Python 3
|
|
|
|
1. تفعيل البيئة الافتراضية:
|
|
|
|
* على نظام التشغيل Windows:
|
|
|
|
</div>
|
|
|
|
|
|
.venv\Scripts\activate.bat
|
|
|
|
<div dir="rtl">
|
|
* على نظام macOS أو Linux ، قم بتشغيل:
|
|
</div>
|
|
|
|
|
|
source ./.venv/bin/activate
|
|
|
|
|
|
<div dir="rtl">
|
|
1. بمجرد تنشيط البيئة الافتراضية ، سيقوم الأمر الافتراضي "python" بتشغيل إصدار Python الذي تم استخدامه لإنشاء البيئة الافتراضية. قم بتشغيل ما يلي للحصول على الإصدار:
|
|
</div>
|
|
|
|
|
|
python --version
|
|
|
|
<div dir="rtl">
|
|
سيكون الإخراج مشابهًا لما يلي:
|
|
</div>
|
|
|
|
|
|
(.venv) ➜ nightlight-server python --version
|
|
Python 3.9.1
|
|
|
|
<div dir="rtl">
|
|
> 💁 قد يكون إصدار Python الخاص بك مختلفًا - طالما أنه الإصدار 3.6 أو أعلى فأنت جيد. إذا لم يكن كذلك ، فاحذف هذا المجلد ، وقم بتثبيت إصدار أحدث من Python وحاول مرة أخرى.
|
|
|
|
1. قم بتشغيل الأوامر التالية لتثبيت حزمة pip لـ <a href="https://pypi.org/project/paho-mqtt/">Paho-MQTT</a> ، مكتبة MQTT شائعة.
|
|
</div>
|
|
|
|
|
|
pip install paho-mqtt
|
|
|
|
<div dir="rtl">
|
|
سيتم تثبيت حزمة النقطة هذه في البيئة الافتراضية فقط ، ولن تكون متاحة خارج هذا النطاق.]
|
|
|
|
#### اكتب كود السيرفر
|
|
|
|
يمكن الآن كتابة رمز السيرفر بلغة بايثون.
|
|
|
|
##### مهمة
|
|
|
|
اكتب كود السيرفر.
|
|
|
|
1. من المحطة الطرفية أو سطر الأوامر ، قم بتشغيل ما يلي داخل البيئة الافتراضية لإنشاء ملف Python يسمى "app.py":
|
|
|
|
* من تشغيل Windows:
|
|
|
|
|
|
type nul > app.py
|
|
|
|
|
|
* على نظام macOS أو Linux ، قم بتشغيل:
|
|
|
|
|
|
touch app.py
|
|
|
|
|
|
1. افتح المجلد الحالي في VS Code:
|
|
|
|
```sh
|
|
code .
|
|
```
|
|
|
|
1. عند إطلاق VS Code ، سيتم تنشيط بيئة Python الافتراضية. سيتم الإبلاغ عن ذلك في شريط الحالة السفلي:
|
|
|
|
![VS Code showing the selected virtual environment](../../../../images/vscode-virtual-env.png)
|
|
|
|
1. إذا كان VS Code Terminal قيد التشغيل بالفعل عند بدء تشغيل VS Code ، فلن يتم تنشيط البيئة الافتراضية فيه. أسهل ما يمكنك فعله هو قتل المحطة باستخدام زر ** Kill the active terminalary **:
|
|
|
|
|
|
![VS Code Kill the active terminal instance button](../../../../images/vscode-kill-terminal.png)
|
|
|
|
1. قم بتشغيل VS Code Terminal الجديدة عن طريق تحديد * Terminal -> New Terminal ، أو الضغط على `` CTRL + ''. ستحمل المحطة الجديدة البيئة الافتراضية ، وستظهر المكالمة لتنشيط هذا في الجهاز. سيكون اسم البيئة الافتراضية (`.venv`) أيضًا في الموجه:
|
|
|
|
```output
|
|
➜ nightlight source .venv/bin/activate
|
|
(.venv) ➜ nightlight
|
|
```
|
|
|
|
1. افتح ملف `app.py` من مستكشف VS Code وأضف الكود التالي:
|
|
</div>
|
|
|
|
|
|
import json
|
|
import time
|
|
|
|
import paho.mqtt.client as mqtt
|
|
|
|
id = '<ID>'
|
|
|
|
client_telemetry_topic = id + '/telemetry'
|
|
client_name = id + 'nightlight_server'
|
|
|
|
mqtt_client = mqtt.Client(client_name)
|
|
mqtt_client.connect('test.mosquitto.org')
|
|
|
|
mqtt_client.loop_start()
|
|
|
|
def handle_telemetry(client, userdata, message):
|
|
payload = json.loads(message.payload.decode())
|
|
print("Message received:", payload)
|
|
|
|
mqtt_client.subscribe(client_telemetry_topic)
|
|
mqtt_client.on_message = handle_telemetry
|
|
|
|
while True:
|
|
time.sleep(2)
|
|
|
|
|
|
<div dir="rtl">
|
|
|
|
استبدل `<ID>` في السطر 6 بالمعرف الفريد الذي استخدمته عند إنشاء رمز جهازك.
|
|
|
|
⚠️ هذا ** يجب ** أن يكون هو نفس المعرف الذي استخدمته على جهازك ، وإلا فلن يشترك رمز السيرفر أو ينشر في الموضوع الصحيح.
|
|
|
|
ينشئ هذا الرمز عميل MQTT باسم فريد ، ويتصل بالوسيط * test.mosquitto.org *. ثم تبدأ حلقة معالجة يتم تشغيلها في سلسلة رسائل خلفية تستمع للرسائل حول أي موضوع مشترك.
|
|
|
|
يشترك العميل بعد ذلك في الرسائل المتعلقة بموضوع التتبع عن بُعد ، ويحدد الوظيفة التي يتم استدعاؤها عند تلقي رسالة. عندما يتم تلقي رسالة القياس عن بعد ، يتم استدعاء وظيفة "handle_telemetry" ، وطباعة الرسالة المستلمة إلى وحدة التحكم.
|
|
|
|
أخيرًا ، تحافظ حلقة لا نهائية على تشغيل التطبيق. يستمع عميل MQTT إلى الرسائل الموجودة على مؤشر ترابط في الخلفية ويعمل طوال الوقت الذي يتم فيه تشغيل التطبيق الرئيسي.
|
|
|
|
1. من محطة VS Code ، قم بتشغيل ما يلي لتشغيل تطبيق Python:
|
|
|
|
```sh
|
|
python app.py
|
|
```
|
|
|
|
سيبدأ التطبيق في الاستماع إلى الرسائل من جهاز إنترنت الأشياء.
|
|
|
|
1. تأكد من تشغيل جهازك وإرسال رسائل القياس عن بُعد. اضبط مستويات الإضاءة التي اكتشفها جهازك الفعلي أو الافتراضي. ستتم طباعة الرسائل التي يتم استلامها على الجهاز.
|
|
</div>
|
|
|
|
|
|
(.venv) ➜ nightlight-server python app.py
|
|
Message received: {'light': 0}
|
|
Message received: {'light': 400}
|
|
|
|
|
|
<div dir="rtl">
|
|
يجب تشغيل ملف app.py في البيئة الافتراضية لضوء الليل لملف app.py في البيئة الافتراضية لسيرفر ضوء الليل لتلقي الرسائل التي يتم إرسالها.
|
|
|
|
</div>
|
|
|
|
> 💁 يمكنك العثور على هذا الرمز في المجلد [code-server/server](code-server/server).
|
|
|
|
<div dir="rtl">
|
|
|
|
|
|
### كم مرة يجب إرسال القياس عن بُعد؟
|
|
|
|
أحد الاعتبارات المهمة في القياس عن بُعد هو كم مرة يتم قياس البيانات وإرسالها؟ الجواب هو، فإنه يعتمد. إذا كنت تقيس كثيرًا ، يمكنك الاستجابة بشكل أسرع للتغييرات في القياسات ، لكنك تستخدم المزيد من الطاقة وعرض النطاق الترددي وتوليد المزيد من البيانات وتحتاج إلى المزيد من موارد السحابة للمعالجة. تحتاج إلى القياس في كثير من الأحيان بما فيه الكفاية ، ولكن ليس في كثير من الأحيان.
|
|
|
|
بالنسبة إلى منظم الحرارة ، ربما يكون القياس كل بضع دقائق أكثر من كافٍ لأن درجات الحرارة لا تتغير كثيرًا. إذا قمت بالقياس مرة واحدة فقط في اليوم ، فقد ينتهي بك الأمر بتسخين منزلك لدرجات حرارة الليل في منتصف يوم مشمس ، بينما إذا قمت بقياس كل ثانية ، فستحصل على الآلاف من قياسات درجة الحرارة المكررة غير الضرورية التي ستؤثر على سرعة الإنترنت للمستخدمين وعرض النطاق الترددي (مشكلة للأشخاص الذين لديهم خطط نطاق ترددي محدود) ، استخدم المزيد من الطاقة التي يمكن أن تكون مشكلة للأجهزة التي تعمل بالبطاريات مثل أجهزة الاستشعار عن بعد ، وزيادة تكلفة معالجة موارد الحوسبة السحابية وتخزينها.
|
|
|
|
إذا كنت تراقب بيانات حول قطعة من الآلات في مصنع قد تتسبب في حدوث أضرار كارثية وملايين الدولارات في الإيرادات المفقودة ، فقد يكون القياس عدة مرات في الثانية ضروريًا. من الأفضل إهدار النطاق الترددي بدلاً من تخطي القياس عن بُعد الذي يشير إلى أن الجهاز يحتاج إلى التوقف والإصلاح قبل أن ينكسر.
|
|
|
|
> 💁 في هذه الحالة ، قد تفكر في امتلاك جهاز حافة لمعالجة القياس عن بُعد أولاً لتقليل الاعتماد على الإنترنت.
|
|
|
|
### فقدان الاتصال
|
|
|
|
قد تكون اتصالات الإنترنت غير موثوقة ، مع حدوث حالات انقطاع شائعة. ما الذي يجب أن يفعله جهاز إنترنت الأشياء في ظل هذه الظروف - هل يفقد البيانات ، أم يجب أن يخزنها حتى يتم استعادة الاتصال؟ مرة أخرى ، الجواب يعتمد.
|
|
|
|
بالنسبة إلى منظم الحرارة ، من المحتمل أن تُفقد البيانات بمجرد إجراء قياس درجة حرارة جديد. لا يهتم نظام التدفئة بأنه قبل 20 دقيقة كانت 20.5 درجة مئوية إذا كانت درجة الحرارة الآن 19 درجة مئوية ، فإن درجة الحرارة الآن هي التي تحدد ما إذا كان يجب تشغيل التدفئة أو إيقاف تشغيلها.
|
|
|
|
بالنسبة للآلات ، قد ترغب في الاحتفاظ بالبيانات ، خاصة إذا تم استخدامها للبحث عن الاتجاهات. هناك نماذج للتعلم الآلي يمكنها اكتشاف الحالات الشاذة في تدفقات البيانات من خلال النظر في البيانات من فترة زمنية محددة (مثل الساعة الأخيرة) واكتشاف البيانات الشاذة. غالبًا ما يستخدم هذا للصيانة التنبؤية ، والبحث عن مؤشرات على أن شيئًا ما قد ينكسر قريبًا حتى تتمكن من إصلاحه أو استبداله قبل حدوث ذلك. قد ترغب في إرسال كل جزء من القياس عن بُعد لجهاز ما حتى يمكن معالجته لاكتشاف الشذوذ ، لذلك بمجرد أن يتمكن جهاز إنترنت الأشياء من إعادة الاتصال ، سيرسل جميع عمليات القياس عن بُعد التي تم إنشاؤها أثناء انقطاع الإنترنت.
|
|
|
|
يجب أن يفكر مصممو أجهزة إنترنت الأشياء أيضًا في إمكانية استخدام جهاز إنترنت الأشياء أثناء انقطاع الإنترنت أو فقدان الإشارة بسبب الموقع. يجب أن يكون منظم الحرارة الذكي قادرًا على اتخاذ بعض القرارات المحدودة للتحكم في التدفئة إذا لم يتمكن من إرسال القياس عن بُعد إلى السحابة بسبب انقطاع التيار.
|
|
|
|
[![This ferrari got bricked because someone tried to upgrade it underground where there's no cell reception](../../../../images/bricked-car.png)](https://twitter.com/internetofshit/status/1315736960082808832)
|
|
|
|
|
|
لكي يتعامل MQTT مع فقدان الاتصال ، يجب أن يكون رمز الجهاز والسيرفر مسؤولين عن ضمان تسليم الرسائل إذا لزم الأمر ، على سبيل المثال من خلال المطالبة بالرد على جميع الرسائل المرسلة برسائل إضافية في موضوع الرد ، وإذا لم يكن الأمر كذلك يتم وضعها في قائمة الانتظار يدويًا ليتم إعادة تشغيلها لاحقًا.
|
|
|
|
## الأوامر
|
|
|
|
الأوامر هي رسائل ترسلها السحابة إلى جهاز ، وتطلب منه القيام بشيء ما. في معظم الأوقات ، يتضمن ذلك تقديم نوع من الإخراج عبر مشغل ، ولكن يمكن أن يكون تعليمات للجهاز نفسه ، مثل إعادة التشغيل ، أو جمع بيانات قياس عن بعد إضافية وإعادتها كرد فعل على الأمر.
|
|
|
|
![An Internet connected thermostat receiving a command to turn on the heating](../../../../images/commands.png)
|
|
|
|
يمكن أن يتلقى منظم الحرارة أمرًا من السحابة لتشغيل التدفئة. استنادًا إلى بيانات القياس عن بُعد من جميع أجهزة الاستشعار ، إذا قررت الخدمة السحابية تشغيل التسخين ، فإنها ترسل الأمر ذي الصلة.
|
|
|
|
### إرسال أوامر إلى وسيط MQTT
|
|
|
|
تتمثل الخطوة التالية في ضوء الليل الذي يتم التحكم فيه عبر الإنترنت في أن يرسل رمز السيرفر أمرًا إلى جهاز إنترنت الأشياء للتحكم في الضوء استنادًا إلى مستويات الضوء التي يستشعرها.
|
|
|
|
1. افتح رمز السيرفر في VS Code
|
|
|
|
1. أضف السطر التالي بعد إعلان "client_telemetry_topic" لتحديد الموضوع الذي تريد إرسال الأوامر إليه:
|
|
</div>
|
|
|
|
|
|
server_command_topic = id + '/commands'
|
|
|
|
|
|
<div dir="rtl">
|
|
1. أضف الكود التالي إلى نهاية وظيفة `handle_telemetry`:
|
|
|
|
|
|
command = { 'led_on' : payload['light'] < 300 }
|
|
print("Sending message:", command)
|
|
|
|
client.publish(server_command_topic, json.dumps(command))
|
|
|
|
يرسل هذا رسالة JSON إلى موضوع الأمر مع ضبط قيمة `led_on` على صواب أو خطأ اعتمادًا على ما إذا كان الضوء أقل من 300 أم لا. إذا كان الضوء أقل من 300 ، فسيتم إرسال true لإرشاد الجهاز إلى تشغيل مؤشر LED.
|
|
|
|
1. قم بتشغيل الكود كما كان من قبل
|
|
|
|
1. اضبط مستويات الضوء التي اكتشفها جهازك الفعلي أو الافتراضي. ستتم كتابة الرسائل التي يتم استلامها والأوامر التي يتم إرسالها إلى الجهاز:
|
|
</div>
|
|
|
|
|
|
(.venv) ➜ nightlight-server python app.py
|
|
Message received: {'light': 0}
|
|
Sending message: {'led_on': True}
|
|
Message received: {'light': 400}
|
|
Sending message: {'led_on': False}
|
|
|
|
|
|
<div dir="rtl">
|
|
> 💁 يتم إرسال الأوامر والقياس عن بعد في موضوع واحد لكل منهما. هذا يعني أن التتبع عن بُعد من أجهزة متعددة سيظهر في نفس موضوع القياس عن بُعد ، وستظهر أوامر لأجهزة متعددة في نفس موضوع الأوامر. إذا كنت تريد إرسال أمر إلى جهاز معين ، فيمكنك استخدام مواضيع متعددة ، مسماة بمعرف جهاز فريد ، مثل `/ commands / device1` ،` / commands / device2`. بهذه الطريقة يمكن للجهاز الاستماع إلى الرسائل المخصصة لهذا الجهاز فقط.
|
|
|
|
</div>
|
|
|
|
> 💁 يمكنك العثور على هذا الرمز في مجلد [code-commands/server](code-commands/server).
|
|
|
|
### التعامل مع الأوامر على جهاز إنترنت الأشياء
|
|
|
|
الآن بعد أن تم إرسال الأوامر من السيرفر ، يمكنك الآن إضافة رمز إلى جهاز إنترنت الأشياء للتعامل معها والتحكم في مؤشر LED.
|
|
|
|
اتبع الخطوة ذات الصلة أدناه للاستماع إلى أوامر وسيط MQTT:
|
|
|
|
* [Arduino - Wio Terminal](wio-terminal-commands.md)
|
|
* [Single-board computer - Raspberry Pi/Virtual IoT device](single-board-computer-commands.md)
|
|
|
|
|
|
بمجرد كتابة هذا الرمز وتشغيله ، جرب تغيير مستويات الضوء. شاهد الإخراج من السيرفر والجهاز ، وشاهد مؤشر LED وأنت تغير مستويات الإضاءة.
|
|
|
|
### فقدان الاتصال
|
|
|
|
ما الذي يجب أن تفعله الخدمة السحابية إذا احتاجت إلى إرسال أمر إلى جهاز إنترنت الأشياء غير متصل؟ مرة أخرى ، الجواب يعتمد.
|
|
|
|
إذا تجاوز الأمر الأخير أمرًا سابقًا ، فمن المحتمل أن يتم تجاهل الأوامر السابقة. إذا أرسلت خدمة سحابية أمرًا لتشغيل التسخين ، ثم أرسلت أمرًا لإيقاف تشغيله ، فيمكن عندئذٍ تجاهل الأمر on وعدم الاستياء.
|
|
|
|
إذا كانت الأوامر بحاجة إلى المعالجة بالتسلسل ، مثل تحريك ذراع الروبوت لأعلى ، ثم أغلق أداة الإمساك ثم يلزم إرسالها بالترتيب بمجرد استعادة الاتصال.
|
|
|
|
✅ كيف يمكن للجهاز أو رمز السيرفر ضمان إرسال الأوامر دائمًا ومعالجتها بالترتيب عبر MQTT إذا لزم الأمر؟
|
|
|
|
---
|
|
|
|
## 🚀 التحدي
|
|
|
|
كان التحدي في الدروس الثلاثة الأخيرة هو سرد أكبر عدد ممكن من أجهزة إنترنت الأشياء الموجودة في منزلك أو مدرستك أو مكان عملك وتحديد ما إذا كانت مبنية على وحدات تحكم دقيقة أو أجهزة كمبيوتر أحادية اللوحة ، أو حتى مزيج من الاثنين ، وفكر في الأمر. ما هي أجهزة الاستشعار والمحركات التي يستخدمونها.
|
|
|
|
بالنسبة لهذه الأجهزة ، فكر في الرسائل التي قد يرسلونها أو يستقبلونها. ما هو القياس عن بعد الذي يرسلونه؟ ما هي الرسائل أو الأوامر التي قد يتلقونها؟ هل تعتقد أنهم آمنون؟
|
|
|
|
## مسابقة ما بعد المحاضرة
|
|
|
|
[مسابقة ما بعد المحاضرة](https://brave-island-0b7c7f50f.azurestaticapps.net/quiz/8)
|
|
|
|
## مراجعة ودراسة ذاتية
|
|
|
|
اقرأ المزيد عن MQTT على <a href="https://www.mosquitto.org">MQTT Wikipedia page</a>.
|
|
|
|
حاول تشغيل وسيط MQTT بنفسك باستخدام <a href="https://wikipedia.org/wiki/MQTT">Mosquitto</a> والاتصال به من جهاز إنترنت الأشياء ورمز السيرفر.
|
|
|
|
> 💁 تلميح - لا يسمح Mosquitto افتراضيًا بالاتصالات المجهولة (التي تتصل بدون اسم مستخدم وكلمة مرور) ، ولا تسمح بالاتصالات من خارج الكمبيوتر الذي يعمل عليه.
|
|
> يمكنك إصلاح هذا باستخدام<a href="https://www.mosquitto.org/man/mosquitto-conf-5.html"> `mosquitto.conf` config file </a> بما يلي:
|
|
>
|
|
> ```sh
|
|
> listener 1883 0.0.0.0
|
|
> allow_anonymous true
|
|
>
|
|
|
|
## الواجب
|
|
|
|
[قارن بين MQTT وبروتوكولات الاتصال الأخرى](assignment.md) |