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.
IoT-For-Beginners/translations/ar/1-getting-started/lessons/4-connect-internet/README.md

466 lines
42 KiB

<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "71b5040e0b3472f1c0949c9b55f224c0",
"translation_date": "2025-08-26T23:12:54+00:00",
"source_file": "1-getting-started/lessons/4-connect-internet/README.md",
"language_code": "ar"
}
-->
# قم بتوصيل جهازك بالإنترنت
![رسم توضيحي لهذا الدرس](../../../../../translated_images/lesson-4.7344e074ea68fa545fd320b12dce36d72dd62d28c3b4596cb26cf315f434b98f.ar.jpg)
> رسم توضيحي بواسطة [نيتيا ناراسيمهان](https://github.com/nitya). اضغط على الصورة للحصول على نسخة أكبر.
تم تدريس هذا الدرس كجزء من سلسلة [Hello IoT](https://youtube.com/playlist?list=PLmsFUfdnGr3xRts0TIwyaHyQuHaNQcb6-) من [Microsoft Reactor](https://developer.microsoft.com/reactor/?WT.mc_id=academic-17441-jabenn). تم تقديم الدرس في شكل فيديوهين - درس مدته ساعة واحدة، وساعة أخرى للإجابة على الأسئلة والتعمق في أجزاء من الدرس.
[![الدرس 4: قم بتوصيل جهازك بالإنترنت](https://img.youtube.com/vi/O4dd172mZhs/0.jpg)](https://youtu.be/O4dd172mZhs)
[![الدرس 4: قم بتوصيل جهازك بالإنترنت - ساعات المكتب](https://img.youtube.com/vi/j-cVCzRDE2Q/0.jpg)](https://youtu.be/j-cVCzRDE2Q)
> 🎥 اضغط على الصور أعلاه لمشاهدة الفيديوهات
## اختبار ما قبل المحاضرة
[اختبار ما قبل المحاضرة](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/7)
## المقدمة
الحرف **I** في IoT يشير إلى **الإنترنت** - الاتصال السحابي والخدمات التي تمكن العديد من ميزات أجهزة إنترنت الأشياء، بدءًا من جمع القياسات من المستشعرات المتصلة بالجهاز، إلى إرسال الرسائل للتحكم في المشغلات. عادةً ما تتصل أجهزة إنترنت الأشياء بخدمة سحابية واحدة باستخدام بروتوكول اتصال قياسي، وتكون هذه الخدمة متصلة ببقية تطبيق إنترنت الأشياء الخاص بك، بدءًا من خدمات الذكاء الاصطناعي لاتخاذ قرارات ذكية بناءً على بياناتك، إلى تطبيقات الويب للتحكم أو الإبلاغ.
> 🎓 البيانات التي يتم جمعها من المستشعرات وإرسالها إلى السحابة تُسمى القياسات عن بُعد (Telemetry).
يمكن لأجهزة إنترنت الأشياء استقبال رسائل من السحابة. غالبًا ما تحتوي هذه الرسائل على أوامر - أي تعليمات لتنفيذ إجراء إما داخليًا (مثل إعادة التشغيل أو تحديث البرنامج الثابت)، أو باستخدام مشغل (مثل تشغيل الضوء).
يقدم هذا الدرس بعض بروتوكولات الاتصال التي يمكن لأجهزة إنترنت الأشياء استخدامها للاتصال بالسحابة، وأنواع البيانات التي قد ترسلها أو تستقبلها. ستتعامل أيضًا مع هذه البروتوكولات عمليًا، حيث ستضيف التحكم عبر الإنترنت إلى مصباحك الليلي، وتنقل منطق التحكم في LED إلى كود "الخادم" الذي يعمل محليًا.
في هذا الدرس سنتناول:
* [بروتوكولات الاتصال](../../../../../1-getting-started/lessons/4-connect-internet)
* [نقل القياسات عن بُعد عبر الرسائل (MQTT)](../../../../../1-getting-started/lessons/4-connect-internet)
* [القياسات عن بُعد](../../../../../1-getting-started/lessons/4-connect-internet)
* [الأوامر](../../../../../1-getting-started/lessons/4-connect-internet)
## بروتوكولات الاتصال
هناك عدد من بروتوكولات الاتصال الشائعة التي تستخدمها أجهزة إنترنت الأشياء للتواصل مع الإنترنت. الأكثر شيوعًا تعتمد على الرسائل بنظام النشر/الاشتراك عبر وسيط معين. تتصل أجهزة إنترنت الأشياء بالوسيط وتنشر القياسات عن بُعد وتُشترك في الأوامر. كما تتصل الخدمات السحابية بالوسيط وتُشترك في جميع رسائل القياسات عن بُعد وتنشر الأوامر إما لأجهزة معينة أو لمجموعات من الأجهزة.
![أجهزة إنترنت الأشياء تتصل بوسيط وتنشر القياسات عن بُعد وتُشترك في الأوامر. الخدمات السحابية تتصل بالوسيط وتُشترك في جميع القياسات وترسل الأوامر إلى أجهزة معينة.](../../../../../translated_images/pub-sub.7c7ed43fe9fd15d4e1f81a3fd95440413c457acd9bcbe9a43341e30e88db5264.ar.png)
MQTT هو البروتوكول الأكثر شيوعًا لأجهزة إنترنت الأشياء ويتم تناوله في هذا الدرس. تشمل البروتوكولات الأخرى AMQP وHTTP/HTTPS.
## نقل القياسات عن بُعد عبر الرسائل (MQTT)
[MQTT](http://mqtt.org) هو بروتوكول رسائل مفتوح وخفيف الوزن يمكنه إرسال الرسائل بين الأجهزة. تم تصميمه في عام 1999 لمراقبة خطوط أنابيب النفط، قبل أن يتم إصداره كمعيار مفتوح بعد 15 عامًا بواسطة IBM.
يحتوي MQTT على وسيط واحد وعدة عملاء. يتصل جميع العملاء بالوسيط، ويقوم الوسيط بتوجيه الرسائل إلى العملاء المعنيين. يتم توجيه الرسائل باستخدام مواضيع مسماة، بدلاً من إرسالها مباشرة إلى عميل معين. يمكن للعميل النشر في موضوع معين، وأي عملاء يشتركون في هذا الموضوع سيتلقون الرسالة.
![جهاز إنترنت الأشياء ينشر القياسات عن بُعد في موضوع /telemetry، وخدمة السحابة تشترك في هذا الموضوع](../../../../../translated_images/mqtt.cbf7f21d9adc3e17548b359444cc11bb4bf2010543e32ece9a47becf54438c23.ar.png)
✅ قم ببعض البحث. إذا كان لديك العديد من أجهزة إنترنت الأشياء، كيف يمكنك ضمان أن وسيط MQTT يمكنه التعامل مع جميع الرسائل؟
### قم بتوصيل جهاز إنترنت الأشياء الخاص بك بـ MQTT
الجزء الأول من إضافة التحكم عبر الإنترنت إلى مصباحك الليلي هو توصيله بوسيط MQTT.
#### المهمة
قم بتوصيل جهازك بوسيط MQTT.
في هذا الجزء من الدرس، ستقوم بتوصيل مصباحك الليلي بالإنترنت للسماح بالتحكم فيه عن بُعد. لاحقًا في هذا الدرس، سيرسل جهاز إنترنت الأشياء الخاص بك رسالة قياسات عن بُعد عبر MQTT إلى وسيط MQTT عام مع مستوى الضوء، حيث سيتم التقاطها بواسطة كود خادم ستكتبه. هذا الكود سيتحقق من مستوى الضوء ويرسل رسالة أمر إلى الجهاز تخبره بتشغيل أو إطفاء LED.
يمكن أن يكون الاستخدام الواقعي لهذا الإعداد هو جمع البيانات من مستشعرات ضوء متعددة قبل اتخاذ قرار بتشغيل الأضواء، في موقع يحتوي على العديد من الأضواء، مثل ملعب. يمكن أن يمنع هذا تشغيل الأضواء إذا كان مستشعر واحد فقط مغطى بالغيوم أو طائر، بينما المستشعرات الأخرى تكتشف ما يكفي من الضوء.
✅ ما هي الحالات الأخرى التي قد تتطلب تقييم البيانات من مستشعرات متعددة قبل إرسال الأوامر؟
بدلاً من التعامل مع تعقيدات إعداد وسيط MQTT كجزء من هذه المهمة، يمكنك استخدام خادم اختبار عام يعمل بـ [Eclipse Mosquitto](https://www.mosquitto.org)، وهو وسيط MQTT مفتوح المصدر. هذا الوسيط التجريبي متاح للجمهور على [test.mosquitto.org](https://test.mosquitto.org)، ولا يتطلب إعداد حساب، مما يجعله أداة رائعة لاختبار عملاء وخوادم MQTT.
> 💁 هذا الوسيط التجريبي عام وغير آمن. يمكن لأي شخص الاستماع إلى ما تنشره، لذا لا ينبغي استخدامه مع أي بيانات تحتاج إلى الحفاظ على خصوصيتها.
![مخطط تدفق المهمة يظهر مستويات الضوء التي يتم قراءتها وفحصها، والتحكم في LED](../../../../../translated_images/assignment-1-internet-flow.3256feab5f052fd273bf4e331157c574c2c3fa42e479836fc9c3586f41db35a5.ar.png)
اتبع الخطوة المناسبة أدناه لتوصيل جهازك بوسيط MQTT:
* [Arduino - Wio Terminal](wio-terminal-mqtt.md)
* [كمبيوتر أحادي اللوحة - Raspberry Pi/جهاز إنترنت الأشياء الافتراضي](single-board-computer-mqtt.md)
### نظرة أعمق على MQTT
يمكن أن تحتوي المواضيع على تسلسل هرمي، ويمكن للعملاء الاشتراك في مستويات مختلفة من التسلسل باستخدام الرموز العامة. على سبيل المثال، يمكنك إرسال رسائل قياسات درجة الحرارة إلى موضوع `/telemetry/temperature` ورسائل الرطوبة إلى موضوع `/telemetry/humidity`، ثم في تطبيق السحابة الخاص بك الاشتراك في موضوع `/telemetry/*` لتلقي كل من رسائل درجة الحرارة والرطوبة.
يمكن إرسال الرسائل بجودة خدمة (QoS)، والتي تحدد ضمان استلام الرسالة.
* مرة واحدة فقط - يتم إرسال الرسالة مرة واحدة فقط ولا يتخذ العميل والوسيط أي خطوات إضافية لتأكيد التسليم (إرسال ونسيان).
* مرة واحدة على الأقل - يتم إعادة محاولة إرسال الرسالة بواسطة المرسل عدة مرات حتى يتم استلام التأكيد (تسليم مؤكد).
* مرة واحدة فقط - يتفق المرسل والمستقبل على عملية مصافحة من مستويين لضمان استلام نسخة واحدة فقط من الرسالة (تسليم مضمون).
✅ ما هي الحالات التي قد تتطلب رسالة تسليم مضمون بدلاً من رسالة إرسال ونسيان؟
على الرغم من أن الاسم هو Message Queueing (MQTT)، إلا أنه لا يدعم فعليًا قوائم الانتظار للرسائل. هذا يعني أنه إذا انقطع اتصال العميل ثم أعيد الاتصال، فلن يتلقى الرسائل التي تم إرسالها أثناء الانقطاع، باستثناء تلك الرسائل التي بدأ بالفعل في معالجتها باستخدام عملية QoS. يمكن أن تحتوي الرسائل على علامة محتفظ بها. إذا تم تعيين هذه العلامة، سيقوم وسيط MQTT بتخزين آخر رسالة تم إرسالها على موضوع بهذه العلامة، وإرسالها إلى أي عملاء يشتركون لاحقًا في الموضوع. بهذه الطريقة، سيحصل العملاء دائمًا على أحدث رسالة.
يدعم MQTT أيضًا وظيفة الحفاظ على الاتصال التي تتحقق من استمرار الاتصال خلال الفجوات الطويلة بين الرسائل.
> 🦟 [Mosquitto من مؤسسة Eclipse](https://mosquitto.org) يوفر وسيط MQTT مجاني يمكنك تشغيله بنفسك لتجربة MQTT، بالإضافة إلى وسيط MQTT عام يمكنك استخدامه لاختبار الكود الخاص بك، مستضاف على [test.mosquitto.org](https://test.mosquitto.org).
يمكن أن تكون اتصالات MQTT عامة ومفتوحة، أو مشفرة ومؤمنة باستخدام أسماء المستخدمين وكلمات المرور، أو الشهادات.
> 💁 يتواصل MQTT عبر TCP/IP، نفس بروتوكول الشبكة الأساسي مثل HTTP، ولكن على منفذ مختلف. يمكنك أيضًا استخدام MQTT عبر WebSockets للتواصل مع تطبيقات الويب التي تعمل في المتصفح، أو في الحالات التي تمنع فيها الجدران النارية أو قواعد الشبكة الأخرى اتصالات MQTT القياسية.
## القياسات عن بُعد
كلمة القياسات عن بُعد مشتقة من جذور يونانية تعني القياس عن بُعد. القياسات عن بُعد هي عملية جمع البيانات من المستشعرات وإرسالها إلى السحابة.
> 💁 أحد أقدم أجهزة القياسات عن بُعد تم اختراعه في فرنسا عام 1874 وأرسل بيانات الطقس وعمق الثلوج في الوقت الفعلي من جبل مونت بلانك إلى باريس. استخدم أسلاكًا مادية حيث لم تكن التقنيات اللاسلكية متاحة في ذلك الوقت.
لننظر مرة أخرى إلى مثال منظم الحرارة الذكي من الدرس الأول.
![منظم حرارة متصل بالإنترنت يستخدم مستشعرات متعددة في الغرف](../../../../../translated_images/telemetry.21e5d8b97649d2ebeb0f68d4b9691ab2d1f7bd629338e131465aff8a614e4d4a.ar.png)
يحتوي منظم الحرارة على مستشعرات درجة الحرارة لجمع القياسات عن بُعد. من المحتمل أن يحتوي على مستشعر درجة حرارة مدمج، وقد يتصل بمستشعرات درجة حرارة خارجية متعددة عبر بروتوكول لاسلكي مثل [Bluetooth Low Energy](https://wikipedia.org/wiki/Bluetooth_Low_Energy) (BLE).
مثال على بيانات القياسات عن بُعد التي قد يرسلها يمكن أن يكون:
| الاسم | القيمة | الوصف |
| ---- | ----- | ----------- |
| `thermostat_temperature` | 18°C | درجة الحرارة التي تم قياسها بواسطة مستشعر درجة الحرارة المدمج في منظم الحرارة |
| `livingroom_temperature` | 19°C | درجة الحرارة التي تم قياسها بواسطة مستشعر درجة حرارة خارجي تم تسميته `livingroom` لتحديد الغرفة التي يوجد بها |
| `bedroom_temperature` | 21°C | درجة الحرارة التي تم قياسها بواسطة مستشعر درجة حرارة خارجي تم تسميته `bedroom` لتحديد الغرفة التي يوجد بها |
يمكن للخدمة السحابية بعد ذلك استخدام بيانات القياسات عن بُعد لاتخاذ قرارات حول الأوامر التي يجب إرسالها للتحكم في التدفئة.
### إرسال القياسات عن بُعد من جهاز إنترنت الأشياء الخاص بك
الجزء التالي في إضافة التحكم عبر الإنترنت إلى مصباحك الليلي هو إرسال مستوى الضوء كقياسات عن بُعد إلى وسيط MQTT على موضوع القياسات عن بُعد.
#### المهمة - إرسال القياسات عن بُعد من جهاز إنترنت الأشياء الخاص بك
أرسل مستوى الضوء كقياسات عن بُعد إلى وسيط MQTT.
يتم إرسال البيانات مشفرة بصيغة JSON - اختصار لـ JavaScript Object Notation، وهو معيار لتشفير البيانات في نص باستخدام أزواج المفتاح/القيمة.
✅ إذا لم تكن قد تعاملت مع JSON من قبل، يمكنك معرفة المزيد عنه من خلال [وثائق JSON.org](https://www.json.org/).
اتبع الخطوة المناسبة أدناه لإرسال القياسات عن بُعد من جهازك إلى وسيط MQTT:
* [Arduino - Wio Terminal](wio-terminal-telemetry.md)
* [كمبيوتر أحادي اللوحة - Raspberry Pi/جهاز إنترنت الأشياء الافتراضي](single-board-computer-telemetry.md)
### استقبال القياسات عن بُعد من وسيط MQTT
لا فائدة من إرسال القياسات عن بُعد إذا لم يكن هناك شيء يستمع لها. يحتاج مستوى الضوء إلى شيء يستمع له لمعالجة البيانات. الكود "الخادم" هو نوع الكود الذي ستقوم بنشره على خدمة سحابية كجزء من تطبيق إنترنت الأشياء الأكبر، ولكن هنا ستقوم بتشغيل هذا الكود محليًا على جهاز الكمبيوتر الخاص بك (أو على Raspberry Pi إذا كنت تعمل مباشرة عليه). يتكون كود الخادم من تطبيق Python يستمع لرسائل القياسات عن بُعد عبر MQTT مع مستويات الضوء. لاحقًا في هذا الدرس ستجعله يرد برسالة أمر تحتوي على تعليمات لتشغيل أو إطفاء LED.
✅ قم ببعض البحث: ماذا يحدث لرسائل MQTT إذا لم يكن هناك مستمع؟
#### تثبيت Python وVS Code
إذا لم يكن لديك Python وVS Code مثبتين محليًا، ستحتاج إلى تثبيتهما لكتابة كود الخادم. إذا كنت تستخدم جهاز إنترنت الأشياء الافتراضي، أو تعمل على Raspberry Pi، يمكنك تخطي هذه الخطوة حيث يجب أن يكون لديك بالفعل هذه الأدوات مثبتة ومهيأة.
##### المهمة - تثبيت Python وVS Code
قم بتثبيت Python وVS Code.
1. قم بتثبيت Python. راجع [صفحة تنزيل Python](https://www.python.org/downloads/) للحصول على تعليمات تثبيت أحدث إصدار من Python.
1. قم بتثبيت Visual Studio Code (VS Code). هذا هو المحرر الذي ستستخدمه لكتابة كود الجهاز الافتراضي الخاص بك بلغة Python. راجع [وثائق VS Code](https://code.visualstudio.com?WT.mc_id=academic-17441-jabenn) للحصول على تعليمات تثبيت VS Code.
💁 يمكنك استخدام أي محرر أو بيئة تطوير متكاملة (IDE) خاصة بلغة بايثون إذا كنت تفضل أداة معينة، ولكن الدروس ستقدم التعليمات بناءً على استخدام VS Code.
1. قم بتثبيت إضافة Pylance لـ VS Code. هذه الإضافة توفر دعمًا للغة Python في VS Code. راجع [وثائق إضافة Pylance](https://marketplace.visualstudio.com/items?WT.mc_id=academic-17441-jabenn&itemName=ms-python.vscode-pylance) للحصول على تعليمات حول كيفية تثبيت هذه الإضافة في VS Code.
#### إعداد بيئة افتراضية لـ Python
من الميزات القوية في Python هي القدرة على تثبيت [حزم pip](https://pypi.org) - وهي حزم من الأكواد التي كتبها أشخاص آخرون وتم نشرها على الإنترنت. يمكنك تثبيت حزمة pip على جهازك باستخدام أمر واحد، ثم استخدام تلك الحزمة في الكود الخاص بك. ستستخدم pip لتثبيت حزمة للتواصل عبر MQTT.
بشكل افتراضي، عند تثبيت حزمة، تكون متاحة في كل مكان على جهازك، وهذا قد يؤدي إلى مشاكل في إصدارات الحزم - مثل اعتماد تطبيق معين على إصدار معين من حزمة يتعطل عند تثبيت إصدار جديد لتطبيق آخر. لتجنب هذه المشكلة، يمكنك استخدام [بيئة افتراضية لـ Python](https://docs.python.org/3/library/venv.html)، وهي في الأساس نسخة من Python في مجلد مخصص، وعند تثبيت حزم pip، يتم تثبيتها فقط في ذلك المجلد.
##### المهمة - إعداد بيئة افتراضية لـ Python
قم بإعداد بيئة افتراضية لـ Python وقم بتثبيت حزم pip الخاصة بـ MQTT.
1. من خلال الطرفية أو سطر الأوامر، قم بتشغيل الأوامر التالية في موقع من اختيارك لإنشاء مجلد جديد والانتقال إليه:
```sh
mkdir nightlight-server
cd nightlight-server
```
1. الآن قم بتشغيل الأمر التالي لإنشاء بيئة افتراضية في مجلد `.venv`:
```sh
python3 -m venv .venv
```
> 💁 تحتاج إلى استدعاء `python3` بشكل صريح لإنشاء البيئة الافتراضية في حال كان لديك Python 2 مثبتًا بالإضافة إلى Python 3 (الإصدار الأحدث). إذا كان Python 2 مثبتًا، فإن استدعاء `python` سيستخدم Python 2 بدلاً من Python 3.
1. قم بتفعيل البيئة الافتراضية:
* على Windows:
* إذا كنت تستخدم Command Prompt أو Command Prompt من خلال Windows Terminal، قم بتشغيل:
```cmd
.venv\Scripts\activate.bat
```
* إذا كنت تستخدم PowerShell، قم بتشغيل:
```powershell
.\.venv\Scripts\Activate.ps1
```
* على macOS أو Linux، قم بتشغيل:
```cmd
source ./.venv/bin/activate
```
> 💁 يجب تشغيل هذه الأوامر من نفس الموقع الذي قمت فيه بتشغيل الأمر لإنشاء البيئة الافتراضية. لن تحتاج أبدًا إلى التنقل داخل مجلد `.venv`، بل يجب دائمًا تشغيل أمر التفعيل وأي أوامر لتثبيت الحزم أو تشغيل الأكواد من المجلد الذي كنت فيه عند إنشاء البيئة الافتراضية.
1. بمجرد تفعيل البيئة الافتراضية، سيقوم الأمر الافتراضي `python` بتشغيل إصدار Python الذي تم استخدامه لإنشاء البيئة الافتراضية. قم بتشغيل الأمر التالي للحصول على الإصدار:
```sh
python --version
```
سيكون الإخراج مشابهًا لما يلي:
```output
(.venv) ➜ nightlight-server python --version
Python 3.9.1
```
> 💁 قد يكون إصدار Python الخاص بك مختلفًا - طالما أنه الإصدار 3.6 أو أعلى، فأنت بخير. إذا لم يكن كذلك، قم بحذف هذا المجلد، وقم بتثبيت إصدار أحدث من Python وحاول مرة أخرى.
1. قم بتشغيل الأوامر التالية لتثبيت حزمة pip الخاصة بـ [Paho-MQTT](https://pypi.org/project/paho-mqtt/)، وهي مكتبة MQTT شائعة.
```sh
pip install paho-mqtt
```
سيتم تثبيت هذه الحزمة فقط في البيئة الافتراضية، ولن تكون متاحة خارجها.
#### كتابة كود الخادم
يمكن الآن كتابة كود الخادم باستخدام Python.
##### المهمة - كتابة كود الخادم
قم بكتابة كود الخادم.
1. من خلال الطرفية أو سطر الأوامر، قم بتشغيل الأمر التالي داخل البيئة الافتراضية لإنشاء ملف Python يسمى `app.py`:
* على Windows، قم بتشغيل:
```cmd
type nul > app.py
```
* على macOS أو Linux، قم بتشغيل:
```cmd
touch app.py
```
1. افتح المجلد الحالي في VS Code:
```sh
code .
```
1. عند تشغيل VS Code، سيتم تفعيل البيئة الافتراضية لـ Python. سيتم الإبلاغ عن ذلك في شريط الحالة السفلي:
![VS Code showing the selected virtual environment](../../../../../translated_images/vscode-virtual-env.8ba42e04c3d533cf677e16cbe5ed9a3b80f62c6964472dc84b6f940800f0909f.ar.png)
1. إذا كانت الطرفية في VS Code تعمل بالفعل عند بدء تشغيل VS Code، فلن يتم تفعيل البيئة الافتراضية فيها. أسهل شيء يمكنك فعله هو إغلاق الطرفية باستخدام زر **Kill the active terminal instance**:
![VS Code Kill the active terminal instance button](../../../../../translated_images/vscode-kill-terminal.1cc4de7c6f25ee08f423f0ead714e61d069fac1eb2089e97b8a7bbcb3d45fe5e.ar.png)
1. قم بتشغيل طرفية جديدة في VS Code عن طريق اختيار *Terminal -> New Terminal*، أو الضغط على `` CTRL+` ``. ستقوم الطرفية الجديدة بتحميل البيئة الافتراضية، مع ظهور استدعاء التفعيل في الطرفية. كما سيظهر اسم البيئة الافتراضية (`.venv`) في الموجه:
```output
➜ nightlight-server source .venv/bin/activate
(.venv) ➜ nightlight
```
1. افتح ملف `app.py` من مستكشف VS Code وأضف الكود التالي:
```python
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)
```
استبدل `<ID>` في السطر 6 بالمعرف الفريد الذي استخدمته عند إنشاء كود الجهاز.
⚠️ يجب أن يكون هذا **نفس المعرف** الذي استخدمته على جهازك، وإلا فلن يقوم كود الخادم بالاشتراك أو النشر في الموضوع الصحيح.
يقوم هذا الكود بإنشاء عميل MQTT باسم فريد، ويتصل بوسيط *test.mosquitto.org*. ثم يبدأ حلقة معالجة تعمل في خيط خلفي تستمع للرسائل على أي مواضيع مشترك فيها.
بعد ذلك، يشترك العميل في الرسائل على موضوع القياسات، ويحدد وظيفة يتم استدعاؤها عند استلام رسالة. عند استلام رسالة قياسات، يتم استدعاء وظيفة `handle_telemetry`، التي تطبع الرسالة المستلمة إلى الطرفية.
أخيرًا، تبقي حلقة لا نهائية التطبيق قيد التشغيل. يستمع عميل MQTT للرسائل في خيط خلفي ويعمل طوال الوقت الذي يكون فيه التطبيق الرئيسي قيد التشغيل.
1. من طرفية VS Code، قم بتشغيل الأمر التالي لتشغيل تطبيق Python الخاص بك:
```sh
python app.py
```
سيبدأ التطبيق في الاستماع للرسائل من جهاز IoT.
1. تأكد من أن جهازك يعمل ويرسل رسائل القياسات. قم بتغيير مستويات الضوء التي يكتشفها جهازك الفعلي أو الافتراضي. سيتم طباعة الرسائل المستلمة إلى الطرفية.
```output
(.venv) ➜ nightlight-server python app.py
Message received: {'light': 0}
Message received: {'light': 400}
```
يجب أن يكون ملف `app.py` في البيئة الافتراضية الخاصة بـ nightlight قيد التشغيل لكي يتمكن ملف `app.py` في البيئة الافتراضية الخاصة بـ nightlight-server من استلام الرسائل المرسلة.
> 💁 يمكنك العثور على هذا الكود في مجلد [code-server/server](../../../../../1-getting-started/lessons/4-connect-internet/code-server/server).
### كم مرة يجب إرسال القياسات؟
أحد الاعتبارات المهمة مع القياسات هو عدد مرات قياس البيانات وإرسالها؟ الإجابة هي - يعتمد ذلك. إذا قمت بالقياس بشكل متكرر، يمكنك الاستجابة بشكل أسرع للتغيرات في القياسات، ولكنك ستستهلك المزيد من الطاقة، والمزيد من عرض النطاق الترددي، وتولد المزيد من البيانات، وتحتاج إلى المزيد من موارد السحابة لمعالجتها. تحتاج إلى القياس بشكل كافٍ، ولكن ليس بشكل مفرط.
بالنسبة للثرموستات، قد يكون القياس كل بضع دقائق أكثر من كافٍ لأن درجات الحرارة لا تتغير كثيرًا. إذا قمت بالقياس مرة واحدة فقط في اليوم، فقد ينتهي بك الأمر بتدفئة منزلك لدرجات حرارة الليل في منتصف يوم مشمس، بينما إذا قمت بالقياس كل ثانية، فستحصل على آلاف القياسات المكررة غير الضرورية التي ستستهلك سرعة الإنترنت وعرض النطاق الترددي للمستخدم (مشكلة للأشخاص الذين لديهم خطط عرض نطاق ترددي محدودة)، وتستهلك المزيد من الطاقة، مما قد يكون مشكلة للأجهزة التي تعمل بالبطاريات مثل المستشعرات البعيدة، وتزيد من تكلفة موارد الحوسبة السحابية لمعالجتها وتخزينها.
إذا كنت تراقب البيانات حول قطعة من الآلات في مصنع، والتي إذا تعطلت قد تسبب أضرارًا كارثية وخسائر بملايين الدولارات، فقد يكون من الضروري القياس عدة مرات في الثانية. من الأفضل إهدار عرض النطاق الترددي بدلاً من تفويت قياسات تشير إلى أن الآلة تحتاج إلى التوقف والإصلاح قبل أن تتعطل.
> 💁 في هذه الحالة، قد تفكر في وجود جهاز طرفي لمعالجة القياسات أولاً لتقليل الاعتماد على الإنترنت.
### فقدان الاتصال
يمكن أن تكون اتصالات الإنترنت غير موثوقة، مع انقطاعات شائعة. ماذا يجب أن يفعل جهاز IoT في هذه الظروف - هل يجب أن يفقد البيانات، أم يجب أن يخزنها حتى يتم استعادة الاتصال؟ مرة أخرى، الإجابة هي يعتمد.
بالنسبة للثرموستات، يمكن فقدان البيانات بمجرد أخذ قياس جديد لدرجة الحرارة. نظام التدفئة لا يهتم بأن درجة الحرارة كانت 20.5°C قبل 20 دقيقة إذا كانت الآن 19°C، فالدرجة الحالية هي التي تحدد ما إذا كان يجب تشغيل التدفئة أم لا.
بالنسبة للآلات، قد ترغب في الاحتفاظ بالبيانات، خاصة إذا كانت تستخدم للبحث عن الاتجاهات. هناك نماذج تعلم الآلة التي يمكنها اكتشاف الشذوذات في تدفقات البيانات من خلال النظر إلى البيانات من فترة زمنية محددة (مثل الساعة الأخيرة) واكتشاف البيانات الشاذة. يتم استخدام هذا غالبًا للصيانة التنبؤية، حيث يتم البحث عن مؤشرات على أن شيئًا ما قد يتعطل قريبًا حتى تتمكن من إصلاحه أو استبداله قبل حدوث ذلك. قد ترغب في إرسال كل جزء من القياسات الخاصة بآلة ليتم معالجتها لاكتشاف الشذوذات، لذلك بمجرد أن يتمكن جهاز IoT من إعادة الاتصال، سيرسل جميع القياسات التي تم إنشاؤها أثناء انقطاع الإنترنت.
يجب على مصممي أجهزة IoT أيضًا التفكير فيما إذا كان يمكن استخدام جهاز IoT أثناء انقطاع الإنترنت أو فقدان الإشارة بسبب الموقع. يجب أن يكون الثرموستات الذكي قادرًا على اتخاذ بعض القرارات المحدودة للتحكم في التدفئة إذا لم يتمكن من إرسال القياسات إلى السحابة بسبب انقطاع.
[![تعطل سيارة فيراري لأن شخصًا ما حاول تحديثها تحت الأرض حيث لا يوجد استقبال خلوي](../../../../../translated_images/bricked-car.dc38f8efadc6c59d76211f981a521efb300939283dee468f79503aae3ec67615.ar.png)](https://twitter.com/internetofshit/status/1315736960082808832)
لـ MQTT للتعامل مع فقدان الاتصال، يجب أن يكون كود الجهاز والخادم مسؤولاً عن ضمان تسليم الرسائل إذا لزم الأمر، على سبيل المثال من خلال طلب أن يتم الرد على جميع الرسائل المرسلة برسائل إضافية على موضوع رد، وإذا لم يتم ذلك، يتم وضعها في قائمة انتظار يدويًا ليتم إعادة تشغيلها لاحقًا.
## الأوامر
الأوامر هي رسائل يتم إرسالها من السحابة إلى الجهاز، تطلب منه القيام بشيء ما. في معظم الأحيان، يتضمن ذلك إعطاء نوع من الإخراج عبر مشغل، ولكن يمكن أن يكون تعليمات للجهاز نفسه، مثل إعادة التشغيل، أو جمع قياسات إضافية وإعادتها كاستجابة للأمر.
![ثرموستات متصل بالإنترنت يتلقى أمرًا لتشغيل التدفئة](../../../../../translated_images/commands.d6c06bbbb3a02cce95f2831a1c331daf6dedd4e470c4aa2b0ae54f332016e504.ar.png)
يمكن أن يتلقى الثرموستات أمرًا من السحابة لتشغيل التدفئة. بناءً على بيانات القياسات من جميع المستشعرات، إذا قررت خدمة السحابة أن التدفئة يجب أن تكون قيد التشغيل، فإنها ترسل الأمر المناسب.
### إرسال الأوامر إلى وسيط MQTT
الخطوة التالية في مشروع "الضوء الليلي المتصل بالإنترنت" هي أن يقوم كود الخادم بإرسال أمر إلى جهاز IoT للتحكم في الضوء بناءً على مستويات الضوء التي يكتشفها.
1. افتح كود الخادم في VS Code.
1. أضف السطر التالي بعد تعريف `client_telemetry_topic` لتحديد الموضوع الذي سيتم إرسال الأوامر إليه:
```python
server_command_topic = id + '/commands'
```
1. أضف الكود التالي إلى نهاية وظيفة `handle_telemetry`:
```python
command = { 'led_on' : payload['light'] < 300 }
print("Sending message:", command)
client.publish(server_command_topic, json.dumps(command))
```
يقوم هذا بإرسال رسالة JSON إلى موضوع الأوامر مع قيمة `led_on` مضبوطة على true أو false بناءً على ما إذا كان الضوء أقل من 300 أم لا. إذا كان الضوء أقل من 300، يتم إرسال true لإبلاغ الجهاز بتشغيل الـ LED.
1. قم بتشغيل الكود كما في السابق.
1. قم بتغيير مستويات الضوء التي يكتشفها جهازك الفعلي أو الافتراضي. سيتم كتابة الرسائل المستلمة والأوامر المرسلة إلى الطرفية:
```output
(.venv) nightlight-server python app.py
Message received: {'light': 0}
Sending message: {'led_on': True}
Message received: {'light': 400}
Sending message: {'led_on': False}
```
> 💁 يتم إرسال القياسات والأوامر على موضوع واحد لكل منهما. هذا يعني أن القياسات من أجهزة متعددة ستظهر على نفس موضوع القياسات، والأوامر إلى أجهزة متعددة ستظهر على نفس موضوع الأوامر. إذا كنت تريد إرسال أمر إلى جهاز معين، يمكنك استخدام مواضيع متعددة، مسماة بمعرف جهاز فريد، مثل `/commands/device1`، `/commands/device2`. بهذه الطريقة يمكن للجهاز الاستماع إلى الرسائل المخصصة لذلك الجهاز فقط.
> 💁 يمكنك العثور على هذا الكود في مجلد [code-commands/server](../../../../../1-getting-started/lessons/4-connect-internet/code-commands/server).
### التعامل مع الأوامر على جهاز IoT
الآن بعد أن يتم إرسال الأوامر من الخادم، يمكنك الآن إضافة كود إلى جهاز IoT للتعامل معها والتحكم في الـ LED.
اتبع الخطوة المناسبة أدناه للاستماع إلى الأوامر من وسيط MQTT:
* [Arduino - Wio Terminal](wio-terminal-commands.md)
* [Single-board computer - Raspberry Pi/Virtual IoT device](single-board-computer-commands.md)
بمجرد كتابة هذا الكود وتشغيله، جرب تغيير مستويات الضوء. شاهد الإخراج من الخادم والجهاز، وشاهد الـ LED أثناء تغيير مستويات الضوء.
### فقدان الاتصال
ماذا يجب أن تفعل خدمة السحابة إذا احتاجت إلى إرسال أمر إلى جهاز IoT غير متصل؟ مرة أخرى، الإجابة هي يعتمد.
إذا كان الأمر الأخير يلغي أمرًا سابقًا، فيمكن تجاهل الأوامر السابقة. إذا أرسلت خدمة السحابة أمرًا لتشغيل التدفئة، ثم أرسلت أمرًا لإيقافها، فيمكن تجاهل أمر التشغيل وعدم إعادة إرساله.
إذا كان يجب معالجة الأوامر بترتيب معين، مثل تحريك ذراع روبوت للأعلى، ثم إغلاق ماسك، فيجب إرسالها بالترتيب بمجرد استعادة الاتصال.
كيف يمكن لكود الجهاز أو الخادم ضمان إرسال الأوامر ومعالجتها دائمًا بترتيب صحيح عبر MQTT إذا لزم الأمر؟
---
## 🚀 التحدي
كان التحدي في الدروس الثلاثة الأخيرة هو سرد أكبر عدد ممكن من أجهزة IoT الموجودة في منزلك، مدرستك، أو مكان عملك وتحديد ما إذا كانت مبنية حول متحكمات دقيقة أو حواسيب أحادية اللوحة، أو حتى مزيج من الاثنين، والتفكير في المستشعرات والمشغلات التي تستخدمها.
بالنسبة لهذه الأجهزة، فكر في الرسائل التي قد ترسلها أو تستقبلها. ما هي البيانات التي ترسلها؟ ما هي الرسائل أو الأوامر التي قد تستقبلها؟ هل تعتقد أنها آمنة؟
## اختبار ما بعد المحاضرة
[اختبار ما بعد المحاضرة](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/8)
## المراجعة والدراسة الذاتية
اقرأ المزيد عن MQTT على [صفحة ويكيبيديا الخاصة بـ MQTT](https://wikipedia.org/wiki/MQTT).
حاول تشغيل خادم MQTT بنفسك باستخدام [Mosquitto](https://www.mosquitto.org) وقم بالاتصال به من جهاز إنترنت الأشياء الخاص بك ومن كود الخادم.
> 💁 نصيحة - بشكل افتراضي، لا يسمح Mosquitto بالاتصالات المجهولة (أي الاتصال بدون اسم مستخدم وكلمة مرور)، ولا يسمح بالاتصالات من خارج الكمبيوتر الذي يعمل عليه.
> يمكنك حل هذه المشكلة باستخدام [ملف إعداد `mosquitto.conf`](https://www.mosquitto.org/man/mosquitto-conf-5.html) يحتوي على ما يلي:
>
> ```sh
> listener 1883 0.0.0.0
> allow_anonymous true
> ```
## الواجب
[قارن بين MQTT وبروتوكولات الاتصال الأخرى](assignment.md)
---
**إخلاء المسؤولية**:
تم ترجمة هذا المستند باستخدام خدمة الترجمة بالذكاء الاصطناعي [Co-op Translator](https://github.com/Azure/co-op-translator). بينما نسعى لتحقيق الدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو معلومات غير دقيقة. يجب اعتبار المستند الأصلي بلغته الأصلية المصدر الموثوق. للحصول على معلومات حاسمة، يُوصى بالاستعانة بترجمة بشرية احترافية. نحن غير مسؤولين عن أي سوء فهم أو تفسيرات خاطئة ناتجة عن استخدام هذه الترجمة.