MQTT یکی از شناخته شدهترین و پذیرفته شدهترین پروتکلهای موجود در دنیای IoT است. طراحی سبک و سادگی افزونهها ویژگیهایی هستند که باعث میشود MQTT برای دستگاههای مختلف با قابلیت پردازش و ذخیره سازی کوچک و بزرگ مناسب باشد. مزایای استفاده از MQTT به جای HTTP شامل صرفه جویی در مصرف انرژی و استفاده از پهنای باند شبکه پایینتر است که تقریباً برای هر دستگاه IoT هر دوی این موارد بسیار مهم هستند.
در این مقاله نگاه دقیقتری به MQTT خواهیم داشت.
MQTT چیست؟
MQTT بر اساس تعریف رسمی یک پروتکل پیام رسانی و اشتراک گذاری است. MQTT سبک و ساده است و به گونه ای طراحی شده که اجرای آن آسان باشد و به طور خاص برای اینترنت اشیا IoT هایی که با منبع، قدرت، پهنای باند و رد پای محدود طراحی شدهاند، مناسب است.
پروتکل MQTT شامل 3 بلوک اصلی است: کارگزار. ناشر و مشترک.
• کارگزار سرور مسئول مدیریت شبکه مشتریانی است که ترکیبی از ناشران و مشترکین است.
• ناشر دستگاهی است که پیامها را به سرور ارسال میکند (منتشر میکند). این پیامها با نام “موضوع” مشخص شدهاند.
• مشترک وسیله ای است که موضوع را دریافت میکند.
هیچ ارتباط مستقیمی بین ناشر و مشترک وجود ندارد. مشترک به کارگزار (سرور) اعلام میکند که به چه موضوعاتی علاقهمند است و کارگزار ارسال پیام با دادههای مشخص شده را برای موضوعهای درخواست شده کنترل میکند. مدل انتشار / اشتراک با مدل درخواست / پاسخ در HTTP کاملاً متفاوت است به طوری که امکان انتقال پیام یک به چند فراهم میشود.
موضوعات را میتوان مانند یک برچسب برای هر پیام در نظر گرفت و این ارتباط میتواند به صورت یک سطح یا چند سطح (درخت) باشد که در آن هر سطح با یک برش جدا میشود (/) ( یعنی : اتاقها / اتاق 1 / سنسورها / دما) . این روش میتواند برای سازماندهی دادهها مفید باشد.
هر دستگاهی که میخواهد اطلاعات مربوط به موضوع خاصی را به دست آورد، باید با آگاه سازی کارگزار (سرور)، اشتراک دریافت کند. اشتراک را میتوان برای یک موضوع خاص یا یک “الگو” انجام داد. برای انجام این کار از (+ و #) استفاده میشود.
• علامت ‘+’ به معنای مشترک شدن در هر موضوعی در این سطح است. یعنی اتاقها / + / حسگرها / درجه حرارت به معنای دریافت دادههایی است که از حسگرهای دما از همه اتاقها حاصل میشوند.
• علامت ‘#’ به معنای مشترک شدن در همه موضوعات در این سطح و سطح پایینتر است. یعنی room / room1 / # به معنی دریافت کلیه اطلاعات مربوط بهroom1 است.
پروتکلMQTT بر اساسTCP / IP فعالیت میکند و مثل HTTP یک پروتکل ASCII نیست. در واقع MQTT یک پروتکل باینری است که در آن از بیت / ثانیه به عنوان واحدهای اساسی کنترل ویژگیهای پروتکل استفاده میشود، در حالی که ASCII از کاراکترها استفاده میکند. پروتکلهای باینری پهنای باند شبکه کمتری مصرف میکنند.
MQTT برای محیطهایی با منابع محدود به ویژه در مورد دسترسی به شبکه طراحی شده است. بنابراین این پروتکل دارای بسیاری از ویژگیها و گزینههای مرتبط و مناسب برای ارسال پیام سرور و کلاینت است. QoS یا کیفیت سرویس اصطلاحی برای 3 گزینه ارسال پیام است:
• سطح 0 (QoS=0): : حداکثر یک بار تحویل. این یعنی اگر گیرنده پیام را از دست بدهد، پیام مجددا ارسال نخواهد شد. به عبارت دیگرT سرور (کارگزار) پیام را ارسال میکند و انتظار تصدیق مشتری یا کلاینت را ندارد.
• سطح 1 ( QoS=1 ): حداقل یک بار تحویل. این یعنی کارگزار تا زمانی که تصدیق دریافت نکند، ارسال پیام خود را به مشترک ادامه میدهد. این ممکن است منجر به دریافت پیام بیش از یکبار از جانب مشترکین شود.
• سطح 2 ( QoS=2 ): دقیقاً یک بار تحویل. این سطح تضمین میکند که یک پیام به طور دقیق به مشترک ارسال میشود.
حال سوال اینجاست که اگر مشتری / مشترک متصل نباشد چه اتفاقی خواهد افتاد؟ آیا وقتی مشترک دوباره وصل شود، پیامها از بین میروند یا بعداً دریافت خواهند شد؟ پاسخ این است: بستگی دارد. این بستگی به گزینه ای به نام Clean Session دارد که در بسته اتصال مشخص شده است. در صورتی که کاربر این بیت را تنظیم کند، هر بار که مشتری (شناخته شده با یک شناسه) متصل شود، سرور جلسات قبلی (از جمله پیام) را ذخیره نمیکند و یک مورد جدید را شروع میکند. در حالی که اگر این بیت صفر باشد، سرور پیامها را ذخیره میکند.
MQTT موضوعات مشخص را در زمان مشخص به مشترکین ارسال میکند. این پیامها “پیام حفظ شده” نامیده میشوند. در حالی که “آخرین پیام” پیامی است که وقتی کارگزار ارتباط خود را با مشتری از دست میدهد در یک موضوع خاص منتشر میشود. پیام ارسالی برای هر مشتری بهطور مستقل تعریف شده است.
مثال:
فرض کنیم دستگاهی وجود دارد که دارای سنسور دما است. مطمئناً این دستگاه میخواهد خوانشهای خود را برای کارگزار ارسال کند. از طرف دیگر یک برنامه تلفن / دسکتاپ میخواهد این مقدار دما را دریافت کند. بنابراین 2 چیز اتفاق میافتد:
• دستگاه موضوعی را که میخواهد در مورد آن منتشر کند، به عنوان مثال “دما”را تعریف میکند. سپس پیام “مقدار دما” را منتشر میکند.
• برنامه تلفن / دسک تاپ موضوع “دما” را به اشتراک میگذارد. سپس پیامی را که دستگاه منتشر کرده است دریافت میکند که مقدار دما است.
نقش کارگزار در اینجا این است که پیام “مقدار دما” را گرفته و آن را به برنامه تلفن / دسک تاپ تحویل دهد.
مفهوم QOS در MQTT
کیفیت خدمات یک ویژگی است که هنگام انتشار به یک پیام اختصاص داده میشود. QoS اساسا توافقی بین فرستنده و گیرنده است که نحوه تحویل پیام را مشخص میکند. این امر به کلاینتها اجازه میدهد تا سطحی از خدمات را انتخاب کنند که قابلیت اطمینان شبکه و منطق برنامه نویسی را در نظر میگیرد.
MQTT قادر به ارسال مجدد پیامها و تضمین تحویل است. بنابراین، افزودن QoS ارتباط با استفاده از شبکههای غیرقابل اطمینان را تسهیل میکند.
QoS طول مسیرهای طی شده توسط بروکر (Broker) یا کلاینت (Client) برای اطمینان از دریافت پیام را مشخص میکند. سطح QoS اولیه توسط کلاینت که پیام را قبل از ارسال به بروکر منتشر میکند، تنظیم میشود. سطح QoS را میتوان توسط مشترکین پیام کاهش داد. بروکرها پیامها را براساس QoS تعریف شده توسط مشترک و نه ناشر ارسال میکنند.
در ادامه سه سطح 0، 1 و 2 در QoS را بررسی میکنیم.
– QoS 0
هنگامی که QoS روی 0 تنظیم میشود، حداکثر یک بار پیام ارسال میشود. ممکن است پیام اصلا تحویل داده نشود. هیچ تاییدیه ای برای تحویل در این سطح از QoS وجود ندارد. پیام ذخیره نمیشود و در صورت قطع ارتباط کلاینت یا خرابی سرور، پیام میتواند از بین برود.
این QoS گاهی اوقات به عنوان «ارسال کن و فراموشش کن» نامیده میشود و سریعترین حالت انتقال داده در پیاده سازی MQTT است. پیامهایی که در QoS 0 منتشر میشوند، نیازی به ارسال شدن به کلاینت ندارند. در صورت قطع ارتباط کلاینت مورد نظر هنگام دریافت پیام توسط سرور، پیام از بین میرود.
– QoS 1
این حالت انتقال پیش فرض در MQTT است و نشان میدهد که پیام همیشه حداقل یک بار تحویل داده میشود. دریافت پیام در این سطح از QoS باید تایید شود. عدم دریافت تاییدیه منجر به ارسال مجدد پیام با یک Flag تکراری (DUP) میشود. این فرآیند تا زمان تایید پیام تکرار میشود و میتواند منجر به چندین بار ارسال و پردازش یک پیام شود.
پیامهای تنظیم شده در QoS 1 تا زمانی که پردازش آنها انجام شود به صورت محلی در فرستنده و گیرنده ذخیره میشوند. گیرنده پس از پردازش پیام را حذف میکند. هنگامی که گیرنده یک بروکر است، پیام برای مشترکین مربوطه منتشر میشود. کلاینتهایی که پیامی را دریافت میکنند آن را به برنامه مشترک تحویل میدهند.
پس از حذف پیام، گیرنده یک تاییدیه برای فرستنده ارسال میکند. فرستندهها پس از اینکه تاییدیه گیرنده را پذیرفتند، پیام را در QoS 1 حذف میکنند.
– QoS 2
پیامهای ارسال شده در QoS 2 همیشه دقیقا یک بار تحویل داده میشوند. این قابل اطمینانترین و کندترین حالت انتقال در یک شبکه MQTT است. پیامها تا زمانی که پردازش شوند به صورت محلی در فرستنده و گیرنده ذخیره میشوند. قبل از حذف پیام از فرستنده، حداقل دو جفت ارسال بین فرستنده و گیرنده انجام میشود.
تا زمانی که پیام بیشتر از یک بار پردازش نشود، پیام میتواند توسط گیرنده پس از تکمیل اولین یا دومین ارسال پردازش شود.
اولین جفت ارسال شامل فرستنده ای است که پیام را ارسال و تایید میکند که گیرنده آن را ذخیره کرده است. اگر فرستنده تاییدیه را دریافت نکرده باشد، تا زمانی که تاییدیه دریافت شود، پیامها با Flag تکراری (DUP) مجددا ارسال میشوند.
در جفت دوم ارسال، فرستنده به گیرنده اطلاع میدهد که میتواند پردازش پیام را با ارسال یک پیام PUBREL تکمیل کند. پیام PUBREL به طور مکرر ارسال میشود تا زمانی که دریافت آن تایید شود. در این مرحله، فرستنده پیام را حذف میکند.
هنگامی که گیرنده پیام یک بروکر است، وظیفه خود را انجام میدهد و پیام را برای مشترکین منتشر میکند. یک کلاینت گیرنده، پیام را به برنامه مشترک تحویل میدهد. هنگامی که گیرنده پردازش یک پیام را به پایان رساند، یک پیام تکمیل را برای فرستنده ارسال میکند. QoS 2 برای اطمینان از اینکه پیامها بیشتر از یک بار گم یا پردازش نمیشوند، به کار میرود.
بستههای ارسالی در MQTT
بستههای کنترلی MQTT کوچکترین واحد انتقال داده در MQTT هستند. کلاینتها و سرورهای ام کیو تی تی بستههای کنترلی را برای انجام کار خود مانند اشتراک در موضوعات و انتشار پیامها مبادله میکنند.
در حال حاضر 15 نوع بسته کنترل در MQTT تعریف شده است. اگر آنها را براساس عملکردشان طبقه بندی کنیم، میتوانیم این بستهها را به سه دسته اتصال، انتشار و اشتراک دسته بندی کنیم.
در میان این 15 مورد، بسته CONNECT برای شروع اتصال به سرور توسط کلاینت استفاده میشود و بسته CONNACK به عنوان پاسخی برای نشان دادن نتیجه اتصال، ارسال میشود. اگر کسی بخواهد ارتباط را قطع کند یا اتصال با خطایی مواجه شود که مستلزم قطع اتصال است، کلاینت و سرور میتوانند بسته DISCONNECT را ارسال کنند و سپس اتصال شبکه را ببندند.
بسته AUTH نوع جدیدی از بسته است که در MQTT 5.0 معرفی شده است و فقط برای احراز هویت پیشرفته استفاده میشود. این بسته احراز هویت امنتری را برای کلاینتها و سرورها فراهم میکند.
بستههای PINGREQ و PINGRESP برای حفظ زنده بودن اتصال و کاوش استفاده میشود. کلاینت به صورت دوره ای یک بسته PINGREQ را به سرور ارسال میکند تا مشخص کند که هنوز فعال است، سپس با توجه به اینکه آیا بسته PINGRESP به موقع بازگردانده شده است یا خیر، فعال یا غیرفعال بودن سرور را نتیجه گیری میکند.
بسته PUBLISH برای انتشار پیامها استفاده میشود و چهار دسته باقی مانده برای تایید پیامهای QoS 1 و 2 استفاده میشود.
بسته SUBSCRIBE توسط کلاینت برای اشتراک در موضوعات استفاده میشود، در حالی که بسته USUBSCRIBE دقیقا برعکس عمل کرده و مشترک نبودن در موضوعات را بررسی میکند. بستههای SUBACK و UNSUBACK به ترتیب برای بازگرداندن نتایج اشتراک و لغو اشتراک استفاده میشود.
MQTT در اینترنت اشیا
کلید پیاده سازی اینترنت اشیا، توانایی انتقال دادههای یک حسگر یا دستگاه به سیستمهای کامپیوتری از طریق شبکه است. MQTT پیام رسانی IoT سبک، به موقع و قابل اعتمادی را ارائه میدهد. در واقع پروتکل MQTT را به عنوان استاندارد واقعی برای پیام رسانی اینترنت اشیا میشناسند.
پروتکل انتشار/اشتراک MQTT که توسط OASIS و ISO استانداردسازی شده است، روشی مقیاس پذیر و قابل اعتماد برای اتصال دستگاهها از طریق اینترنت را فراهم میکند.
MQTT معمولا برای جمع آوری دادههای حسگر از دستگاههای عملیاتی و میدان و متمرکز کردن آن برای پردازش با الگوریتمهای یادگیری ماشین استفاده میشود. این پروتکل همچنین با ارسال پیامهای فرمان به دستگاه، برای هماهنگ کردن رفتار دستگاهها در مکان مختلف بسیار مفید است.
اگر قصد دارید یک پلتفرم IoT بسازید، باید یک پروتکل پیام رسانی استاندارد باز مانند MQTT را انتخاب کنید. این پروتکل سبک است و از دستگاههایی پشتیبانی میکند که از نظر سخت افزار و پهنای باند محدود هستند. MQTT همچنین از انواع سناریوهای کاربردی پشتیبانی میکند که باعث میشود برای توسعه دهندگان اینترنت اشیا یک انتخاب عالی باشد.
MQTT امنیت و قابلیت رمزگذاری سرتاسری (End-to-End) را برای دادههای حساس ارائه میدهد. این توانمندی باعث میشود تا امنیت دادههای ارسالی بین دستگاههای سرویس گیرنده تامین شود و مطمئن باشید که دادههای حساس در معرض افراد سودجو قرار نمیگیرد. علاوه بر این، MQTT با انواع کتابخانههای MQTT سفارشی سازگاری دارد.
ام کیو تی تی یک پروتکل بالغ با تعداد بی شماری بروکر و کلاینت MQTT است که به زبانهای مختلف توسعه یافتهاند. همچنین جوامع فعال بزرگ و مستندات فنی به خوبی آماده شده است تا توسعه دهندگان به راحتی از آنها استفاده کنند. سادگی MQTT باعث میشود تا برای برنامه نویسان یک گزینه جذاب باشد. بنابراین، با MQTT میتوان استقرار اینترنت اشیا را در کمترین زمان انجام داد.
سوالات متداول
- MQTT چیست؟
MQTT بر اساس تعریف رسمی یک پروتکل پیام رسانی و اشتراک گذاری است. MQTT سبک و ساده است و به گونه ای طراحی شده که اجرای آن آسان باشد و به طور خاص برای IoT هایی که با منبع، قدرت، پهنای باند و رد پای محدود طراحی شدهاند، مناسب است. - علامت ‘+’ در MQTT چیست؟
علامت ‘+’ به معنای مشترک شدن در هر موضوعی در این سطح است. یعنی اتاقها / + / حسگرها / درجه حرارت به معنای دریافت دادههایی است که از حسگرهای دما از همه اتاقها حاصل میشوند.
2 پاسخ
ببخشید من یک سوال داشتم
میخواستم بدونم توی کجاها از پروتکل MQTT استفاده میشه؟
سلام وقتتون بخیر
سوالتون خیلی کلی هستش ولی MQTT در دامنه اینترنت اشیا (IoT) استفاده میشود، به عنوان مثال در صنایع خودروسازی، خانه هوشمند و کشاورزی.
برای اطلاعات بیشتر راجع به اینترنت اشیا (IoT) میتونین به صفحه “اینترنت اشیا چیست؟ همه چیز درباره IoT” ما مراجعه کنین