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/fa/1-getting-started/lessons/4-connect-internet/README.md

464 lines
46 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "71b5040e0b3472f1c0949c9b55f224c0",
"translation_date": "2025-08-25T21:57:31+00:00",
"source_file": "1-getting-started/lessons/4-connect-internet/README.md",
"language_code": "fa"
}
-->
# اتصال دستگاه شما به اینترنت
![نمای کلی درس به صورت اسکچ‌نوت](../../../../../translated_images/lesson-4.7344e074ea68fa545fd320b12dce36d72dd62d28c3b4596cb26cf315f434b98f.fa.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) تدریس شده است. این درس در قالب دو ویدیو ارائه شده است - یک درس یک ساعته و یک جلسه پرسش و پاسخ یک ساعته که به بخش‌های مختلف درس پرداخته و به سوالات پاسخ می‌دهد.
[![درس ۴: اتصال دستگاه شما به اینترنت](https://img.youtube.com/vi/O4dd172mZhs/0.jpg)](https://youtu.be/O4dd172mZhs)
[![درس ۴: اتصال دستگاه شما به اینترنت - جلسه پرسش و پاسخ](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 به معنای **اینترنت** است - اتصال به ابر و خدماتی که بسیاری از ویژگی‌های دستگاه‌های IoT را ممکن می‌سازد، از جمع‌آوری اندازه‌گیری‌ها از حسگرهای متصل به دستگاه گرفته تا ارسال پیام‌ها برای کنترل عملگرها. دستگاه‌های IoT معمولاً با استفاده از یک پروتکل ارتباطی استاندارد به یک سرویس ابری IoT متصل می‌شوند و این سرویس به سایر بخش‌های برنامه IoT شما متصل است، از خدمات هوش مصنوعی برای تصمیم‌گیری هوشمندانه بر اساس داده‌ها گرفته تا اپلیکیشن‌های وب برای کنترل یا گزارش‌دهی.
> 🎓 داده‌هایی که از حسگرها جمع‌آوری شده و به ابر ارسال می‌شوند، تله‌متری نامیده می‌شوند.
دستگاه‌های IoT می‌توانند پیام‌هایی از ابر دریافت کنند. این پیام‌ها اغلب شامل دستورات هستند - دستورالعمل‌هایی برای انجام یک عمل، چه به صورت داخلی (مانند راه‌اندازی مجدد یا به‌روزرسانی نرم‌افزار) یا با استفاده از یک عملگر (مانند روشن کردن یک چراغ).
این درس برخی از پروتکل‌های ارتباطی که دستگاه‌های IoT می‌توانند برای اتصال به ابر استفاده کنند و انواع داده‌هایی که ممکن است ارسال یا دریافت کنند را معرفی می‌کند. همچنین شما به صورت عملی با این موارد کار خواهید کرد، کنترل اینترنتی را به چراغ شب خود اضافه کرده و منطق کنترل 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)
## پروتکل‌های ارتباطی
تعداد زیادی پروتکل ارتباطی محبوب وجود دارد که دستگاه‌های IoT برای ارتباط با اینترنت از آن‌ها استفاده می‌کنند. محبوب‌ترین آن‌ها بر اساس پیام‌رسانی انتشار/اشتراک از طریق نوعی بروکر هستند. دستگاه‌های IoT به بروکر متصل می‌شوند و تله‌متری منتشر کرده و به دستورات اشتراک می‌کنند. خدمات ابری نیز به بروکر متصل شده و به تمام پیام‌های تله‌متری اشتراک می‌کنند و دستورات را یا به دستگاه‌های خاص یا به گروهی از دستگاه‌ها منتشر می‌کنند.
![دستگاه‌های IoT به یک بروکر متصل شده و تله‌متری منتشر کرده و به دستورات اشتراک می‌کنند. خدمات ابری به بروکر متصل شده و به تمام تله‌متری اشتراک کرده و دستورات را به دستگاه‌های خاص ارسال می‌کنند.](../../../../../translated_images/pub-sub.7c7ed43fe9fd15d4e1f81a3fd95440413c457acd9bcbe9a43341e30e88db5264.fa.png)
MQTT محبوب‌ترین پروتکل ارتباطی برای دستگاه‌های IoT است و در این درس به آن پرداخته می‌شود. سایر پروتکل‌ها شامل AMQP و HTTP/HTTPS هستند.
## انتقال تله‌متری صف پیام (MQTT)
[MQTT](http://mqtt.org) یک پروتکل پیام‌رسانی سبک و استاندارد باز است که می‌تواند پیام‌ها را بین دستگاه‌ها ارسال کند. این پروتکل در سال ۱۹۹۹ برای نظارت بر خطوط لوله نفت طراحی شد و ۱۵ سال بعد توسط IBM به عنوان یک استاندارد باز منتشر شد.
MQTT دارای یک بروکر و چندین کلاینت است. تمام کلاینت‌ها به بروکر متصل می‌شوند و بروکر پیام‌ها را به کلاینت‌های مربوطه هدایت می‌کند. پیام‌ها با استفاده از موضوعات نام‌گذاری شده هدایت می‌شوند، نه اینکه مستقیماً به یک کلاینت خاص ارسال شوند. یک کلاینت می‌تواند به یک موضوع پیام ارسال کند و هر کلاینتی که به آن موضوع اشتراک کرده باشد پیام را دریافت خواهد کرد.
![دستگاه IoT تله‌متری را در موضوع /telemetry منتشر می‌کند و سرویس ابری به آن موضوع اشتراک می‌کند](../../../../../translated_images/mqtt.cbf7f21d9adc3e17548b359444cc11bb4bf2010543e32ece9a47becf54438c23.fa.png)
✅ تحقیق کنید. اگر تعداد زیادی دستگاه IoT داشته باشید، چگونه می‌توانید اطمینان حاصل کنید که بروکر MQTT شما قادر به مدیریت تمام پیام‌ها است؟
### اتصال دستگاه IoT شما به MQTT
اولین بخش از اضافه کردن کنترل اینترنتی به چراغ شب شما، اتصال آن به یک بروکر MQTT است.
#### وظیفه
دستگاه خود را به یک بروکر MQTT متصل کنید.
در این بخش از درس، شما چراغ شب IoT خود را به اینترنت متصل می‌کنید تا بتوانید آن را به صورت از راه دور کنترل کنید. در ادامه این درس، دستگاه IoT شما یک پیام تله‌متری از طریق 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.fa.png)
مراحل مربوطه زیر را دنبال کنید تا دستگاه خود را به بروکر MQTT متصل کنید:
* [Arduino - Wio Terminal](wio-terminal-mqtt.md)
* [کامپیوتر تک‌برد - Raspberry Pi/دستگاه IoT مجازی](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 از طریق وب‌سوکت‌ها برای ارتباط با اپلیکیشن‌های وب که در مرورگر اجرا می‌شوند استفاده کنید، یا در شرایطی که فایروال‌ها یا قوانین دیگر شبکه ارتباطات استاندارد MQTT را مسدود می‌کنند.
## تله‌متری
کلمه تله‌متری از ریشه‌های یونانی به معنای اندازه‌گیری از راه دور گرفته شده است. تله‌متری عمل جمع‌آوری داده‌ها از حسگرها و ارسال آن‌ها به ابر است.
> 💁 یکی از اولین دستگاه‌های تله‌متری در سال ۱۸۷۴ در فرانسه اختراع شد و اطلاعات آب و هوا و عمق برف را به صورت لحظه‌ای از مون بلان به پاریس ارسال می‌کرد. این دستگاه از سیم‌های فیزیکی استفاده می‌کرد زیرا فناوری‌های بی‌سیم در آن زمان در دسترس نبودند.
بیایید به مثال ترموستات هوشمند از درس ۱ بازگردیم.
![یک ترموستات متصل به اینترنت که از چندین حسگر اتاق استفاده می‌کند](../../../../../translated_images/telemetry.21e5d8b97649d2ebeb0f68d4b9691ab2d1f7bd629338e131465aff8a614e4d4a.fa.png)
ترموستات دارای حسگرهای دما برای جمع‌آوری تله‌متری است. احتمالاً یک حسگر دما داخلی خواهد داشت و ممکن است به چندین حسگر دمای خارجی از طریق یک پروتکل بی‌سیم مانند [Bluetooth Low Energy](https://wikipedia.org/wiki/Bluetooth_Low_Energy) (BLE) متصل شود.
یک نمونه از داده‌های تله‌متری که ممکن است ارسال کند می‌تواند به صورت زیر باشد:
| نام | مقدار | توضیحات |
| ---- | ----- | ----------- |
| `thermostat_temperature` | ۱۸°C | دمای اندازه‌گیری شده توسط حسگر دمای داخلی ترموستات |
| `livingroom_temperature` | ۱۹°C | دمای اندازه‌گیری شده توسط یک حسگر دمای خارجی که به نام `livingroom` برای شناسایی اتاقی که در آن قرار دارد نام‌گذاری شده است |
| `bedroom_temperature` | ۲۱°C | دمای اندازه‌گیری شده توسط یک حسگر دمای خارجی که به نام `bedroom` برای شناسایی اتاقی که در آن قرار دارد نام‌گذاری شده است |
سرویس ابری سپس می‌تواند از این داده‌های تله‌متری برای تصمیم‌گیری در مورد ارسال دستورات برای کنترل گرمایش استفاده کند.
### ارسال تله‌متری از دستگاه IoT شما
بخش بعدی در اضافه کردن کنترل اینترنتی به چراغ شب شما ارسال تله‌متری سطح نور به بروکر MQTT در یک موضوع تله‌متری است.
#### وظیفه - ارسال تله‌متری از دستگاه IoT شما
تله‌متری سطح نور را به بروکر MQTT ارسال کنید.
داده‌ها به صورت JSON رمزگذاری شده ارسال می‌شوند - مخفف JavaScript Object Notation، یک استاندارد برای رمزگذاری داده‌ها به صورت متن با استفاده از جفت‌های کلید/مقدار.
✅ اگر قبلاً با JSON آشنا نشده‌اید، می‌توانید اطلاعات بیشتری در [مستندات JSON.org](https://www.json.org/) کسب کنید.
مراحل مربوطه زیر را دنبال کنید تا تله‌متری را از دستگاه خود به بروکر MQTT ارسال کنید:
* [Arduino - Wio Terminal](wio-terminal-telemetry.md)
* [کامپیوتر تک‌برد - Raspberry Pi/دستگاه IoT مجازی](single-board-computer-telemetry.md)
### دریافت تله‌متری از بروکر MQTT
ارسال تله‌متری بدون وجود چیزی در طرف دیگر برای گوش دادن به آن بی‌فایده است. تله‌متری سطح نور نیاز به چیزی دارد که به آن گوش دهد تا داده‌ها را پردازش کند. این کد 'سرور' نوعی کدی است که شما آن را به یک سرویس ابری به عنوان بخشی از یک اپلیکیشن IoT بزرگ‌تر مستقر خواهید کرد، اما در اینجا شما این کد را به صورت محلی روی کامپیوتر خود اجرا خواهید کرد (یا روی Pi خود اگر مستقیماً روی آن کدنویسی می‌کنید). کد سرور شامل یک اپلیکیشن پایتون است که به پیام‌های تله‌متری از طریق MQTT با سطح نور گوش می‌دهد. در ادامه این درس، شما آن را طوری تنظیم خواهید کرد که با یک پیام دستوری پاسخ دهد که دستورالعمل‌هایی برای روشن یا خاموش کردن LED ارائه می‌دهد.
✅ تحقیق کنید: چه اتفاقی برای پیام‌های MQTT می‌افتد اگر هیچ شنونده‌ای وجود نداشته باشد؟
#### نصب پایتون و VS Code
اگر پایتون و VS Code را به صورت محلی نصب نکرده‌اید، باید هر دو را نصب کنید تا کد سرور را بنویسید. اگر از یک دستگاه IoT مجازی استفاده می‌کنید یا روی Raspberry Pi خود کار می‌کنید، می‌توانید این مرحله را رد کنید زیرا باید قبلاً آن را نصب و پیکربندی کرده باشید.
##### وظیفه - نصب پایتون و VS Code
پایتون و VS Code را نصب کنید.
1. پایتون را نصب کنید. به [صفحه دانلود پایتون](https://www.python.org/downloads/) مراجعه کنید تا دستورالعمل‌های نصب آخرین نسخه پایتون را مشاهده کنید.
1. Visual Studio Code (VS Code) را نصب کنید. این ویرایشگری است که شما برای نوشتن کد دستگاه مجازی خود در پایتون استفاده خواهید کرد. به [مستندات VS Code](https://code.visualstudio.com?WT.mc_id=academic-17441-jabenn) مراجعه کنید تا دستورالعمل‌های نصب VS Code را مشاهده کنید.
💁 شما آزاد هستید از هر محیط توسعه یا ویرایشگر پایتون که ترجیح می‌دهید برای این درس‌ها استفاده کنید، اما دستورالعمل‌های درس‌ها بر اساس استفاده از VS Code ارائه خواهند شد.
1. افزونه Pylance را برای VS Code نصب کنید. این افزونه‌ای برای VS Code است که پشتیبانی از زبان پایتون را فراهم می‌کند. برای دستورالعمل‌های نصب این افزونه در VS Code به [مستندات افزونه Pylance](https://marketplace.visualstudio.com/items?WT.mc_id=academic-17441-jabenn&itemName=ms-python.vscode-pylance) مراجعه کنید.
#### پیکربندی محیط مجازی پایتون
یکی از ویژگی‌های قدرتمند پایتون توانایی نصب [بسته‌های pip](https://pypi.org) است - این‌ها بسته‌هایی از کد هستند که توسط افراد دیگر نوشته شده و در اینترنت منتشر شده‌اند. شما می‌توانید یک بسته pip را با یک دستور روی کامپیوتر خود نصب کنید و سپس از آن بسته در کد خود استفاده کنید. شما از pip برای نصب بسته‌ای جهت ارتباط از طریق MQTT استفاده خواهید کرد.
به طور پیش‌فرض، زمانی که یک بسته نصب می‌کنید، آن بسته در همه جای کامپیوتر شما در دسترس خواهد بود، و این می‌تواند منجر به مشکلاتی با نسخه‌های بسته‌ها شود - مانند اینکه یک برنامه به یک نسخه خاص از یک بسته وابسته باشد که با نصب نسخه جدید برای برنامه‌ای دیگر خراب شود. برای حل این مشکل، می‌توانید از یک [محیط مجازی پایتون](https://docs.python.org/3/library/venv.html) استفاده کنید، که اساساً یک نسخه کپی از پایتون در یک پوشه اختصاصی است، و زمانی که بسته‌های pip نصب می‌شوند، فقط در آن پوشه نصب می‌شوند.
##### وظیفه - پیکربندی محیط مجازی پایتون
یک محیط مجازی پایتون پیکربندی کنید و بسته‌های 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. محیط مجازی را فعال کنید:
* در ویندوز:
* اگر از Command Prompt یا Command Prompt از طریق Windows Terminal استفاده می‌کنید، اجرا کنید:
```cmd
.venv\Scripts\activate.bat
```
* اگر از PowerShell استفاده می‌کنید، اجرا کنید:
```powershell
.\.venv\Scripts\Activate.ps1
```
* در macOS یا لینوکس، اجرا کنید:
```cmd
source ./.venv/bin/activate
```
> 💁 این دستورات باید از همان مکانی اجرا شوند که دستور ایجاد محیط مجازی را اجرا کردید. شما هرگز نیازی به رفتن به داخل پوشه `.venv` ندارید، بلکه باید همیشه دستور فعال‌سازی و هر دستوری برای نصب بسته‌ها یا اجرای کد را از پوشه‌ای که محیط مجازی را در آن ایجاد کردید اجرا کنید.
1. پس از فعال‌سازی محیط مجازی، دستور پیش‌فرض `python` نسخه‌ای از پایتون را اجرا خواهد کرد که برای ایجاد محیط مجازی استفاده شده است. دستور زیر را اجرا کنید تا نسخه را دریافت کنید:
```sh
python --version
```
خروجی مشابه زیر خواهد بود:
```output
(.venv) ➜ nightlight-server python --version
Python 3.9.1
```
> 💁 نسخه پایتون شما ممکن است متفاوت باشد - تا زمانی که نسخه 3.6 یا بالاتر باشد، مشکلی نیست. اگر نسخه پایین‌تر است، این پوشه را حذف کنید، نسخه جدیدتری از پایتون نصب کنید و دوباره امتحان کنید.
1. دستورات زیر را اجرا کنید تا بسته pip برای [Paho-MQTT](https://pypi.org/project/paho-mqtt/) که یک کتابخانه محبوب MQTT است نصب شود:
```sh
pip install paho-mqtt
```
این بسته pip فقط در محیط مجازی نصب خواهد شد و خارج از آن در دسترس نخواهد بود.
#### نوشتن کد سرور
اکنون می‌توانید کد سرور را با پایتون بنویسید.
##### وظیفه - نوشتن کد سرور
کد سرور را بنویسید.
1. از ترمینال یا خط فرمان خود، دستورات زیر را در داخل محیط مجازی اجرا کنید تا یک فایل پایتون به نام `app.py` ایجاد کنید:
* در ویندوز اجرا کنید:
```cmd
type nul > app.py
```
* در macOS یا لینوکس اجرا کنید:
```cmd
touch app.py
```
1. پوشه فعلی را در VS Code باز کنید:
```sh
code .
```
1. زمانی که VS Code اجرا می‌شود، محیط مجازی پایتون را فعال خواهد کرد. این در نوار وضعیت پایین گزارش خواهد شد:
![VS Code showing the selected virtual environment](../../../../../translated_images/vscode-virtual-env.8ba42e04c3d533cf677e16cbe5ed9a3b80f62c6964472dc84b6f940800f0909f.fa.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.fa.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، دستور زیر را اجرا کنید تا برنامه پایتون خود را اجرا کنید:
```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 دقیقه پیش دما 20.5°C بوده است اگر دما اکنون 19°C باشد، این دمای فعلی است که تعیین می‌کند گرمایش باید روشن یا خاموش باشد.
برای ماشین‌آلات ممکن است بخواهید داده‌ها را نگه دارید، به خصوص اگر برای یافتن روندها استفاده شود. مدل‌های یادگیری ماشین وجود دارند که می‌توانند با نگاه کردن به داده‌های یک دوره زمانی مشخص (مانند یک ساعت گذشته) و شناسایی داده‌های غیرعادی، در جریان داده‌ها ناهنجاری‌ها را تشخیص دهند. این اغلب برای تعمیر و نگهداری پیش‌بینی‌کننده استفاده می‌شود، به دنبال نشانه‌هایی که ممکن است چیزی به زودی خراب شود تا بتوانید قبل از وقوع آن را تعمیر یا جایگزین کنید. ممکن است بخواهید هر بیت تله‌متری برای یک ماشین ارسال شود تا بتواند برای تشخیص ناهنجاری پردازش شود، بنابراین زمانی که دستگاه IoT بتواند دوباره متصل شود، تمام تله‌متری تولید شده در طول قطعی اینترنت را ارسال خواهد کرد.
طراحان دستگاه‌های IoT همچنین باید در نظر بگیرند که آیا دستگاه IoT می‌تواند در طول قطعی اینترنت یا از دست دادن سیگنال ناشی از مکان استفاده شود یا خیر. یک ترموستات هوشمند باید بتواند برخی تصمیمات محدود برای کنترل گرمایش بگیرد اگر نتواند تله‌متری را به ابر ارسال کند به دلیل قطعی.
[![این فراری خراب شد چون کسی سعی کرد آن را زیر زمین که هیچ سیگنال موبایلی وجود ندارد ارتقا دهد](../../../../../translated_images/bricked-car.dc38f8efadc6c59d76211f981a521efb300939283dee468f79503aae3ec67615.fa.png)](https://twitter.com/internetofshit/status/1315736960082808832)
برای اینکه MQTT بتواند از دست دادن اتصال را مدیریت کند، کد دستگاه و سرور باید مسئول اطمینان از تحویل پیام‌ها در صورت نیاز باشند، به عنوان مثال با الزام اینکه تمام پیام‌های ارسال شده توسط پیام‌های اضافی در یک موضوع پاسخ پاسخ داده شوند، و اگر نه، آن‌ها به صورت دستی صف‌بندی شوند تا بعداً بازپخش شوند.
## دستورات
دستورات پیام‌هایی هستند که از ابر به یک دستگاه ارسال می‌شوند و به آن دستور می‌دهند کاری انجام دهد. بیشتر اوقات این شامل دادن نوعی خروجی از طریق یک عملگر است، اما می‌تواند یک دستور برای خود دستگاه باشد، مانند راه‌اندازی مجدد یا جمع‌آوری تله‌متری اضافی و بازگرداندن آن به عنوان پاسخ به دستور.
![یک ترموستات متصل به اینترنت که دستوری برای روشن کردن گرمایش دریافت می‌کند](../../../../../translated_images/commands.d6c06bbbb3a02cce95f2831a1c331daf6dedd4e470c4aa2b0ae54f332016e504.fa.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)
* [کامپیوتر تک‌برد - Raspberry Pi/دستگاه IoT مجازی](single-board-computer-commands.md)
زمانی که این کد نوشته و اجرا شد، با تغییر سطح نور آزمایش کنید. خروجی سرور و دستگاه را مشاهده کنید و LED را هنگام تغییر سطح نور مشاهده کنید.
### از دست دادن اتصال
یک سرویس ابری در صورتی که نیاز به ارسال دستوری به یک دستگاه IoT داشته باشد که آفلاین است چه باید بکند؟ باز هم، پاسخ این است که بستگی دارد.
اگر آخرین دستور دستورات قبلی را لغو کند، دستورات قبلی احتمالاً می‌توانند نادیده گرفته شوند. اگر یک سرویس ابری دستوری برای روشن کردن گرمایش ارسال کند، سپس دستوری برای خاموش کردن آن ارسال کند، دستور روشن کردن می‌تواند نادیده گرفته شود و دوباره ارسال نشود.
اگر دستورات نیاز به پردازش به ترتیب داشته باشند، مانند حرکت دادن یک بازوی ربات به بالا، سپس بستن یک گیره، آن‌ها باید به ترتیب ارسال شوند زمانی که اتصال برقرار شود.
چگونه کد دستگاه یا سرور می‌تواند اطمینان حاصل کند که دستورات همیشه به ترتیب ارسال و مدیریت می‌شوند اگر لازم باشد؟
---
## 🚀 چالش
چالش در سه درس گذشته این بود که تا جایی که می‌توانید دستگاه‌های IoT را که در خانه، مدرسه یا محل کار شما هستند فهرست کنید و تصمیم بگیرید که آیا آن‌ها بر اساس میکروکنترلرها یا کامپیوترهای تک‌برد ساخته شده‌اند، یا حتی ترکیبی از هر دو، و فکر کنید که از چه حسگرها و عملگرهایی استفاده می‌کنند.
برای این دستگاه‌ها، فکر کنید که چه پیام‌هایی ممکن است ارسال یا دریافت کنند. چه اطلاعاتی ارسال می‌کنند؟ چه پیام‌ها یا دستورات ممکن است دریافت کنند؟ آیا فکر می‌کنید امن هستند؟
## آزمون پس از درس
[آزمون پس از درس](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/8)
## مرور و مطالعه شخصی
اطلاعات بیشتری درباره MQTT را در [صفحه ویکی‌پدیا MQTT](https://wikipedia.org/wiki/MQTT) بخوانید.
سعی کنید یک سرور MQTT را خودتان با استفاده از [Mosquitto](https://www.mosquitto.org) اجرا کنید و از دستگاه IoT و کد سرور خود به آن متصل شوید.
> 💁 نکته - به‌طور پیش‌فرض 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) ترجمه شده است. در حالی که ما تلاش می‌کنیم دقت را حفظ کنیم، لطفاً توجه داشته باشید که ترجمه‌های خودکار ممکن است شامل خطاها یا نادرستی‌ها باشند. سند اصلی به زبان اصلی آن باید به عنوان منبع معتبر در نظر گرفته شود. برای اطلاعات حساس، توصیه می‌شود از ترجمه انسانی حرفه‌ای استفاده کنید. ما مسئولیتی در قبال سوء تفاهم‌ها یا تفسیرهای نادرست ناشی از استفاده از این ترجمه نداریم.