49258000 - 021

پروتکل MQTT چیست؟ کاربرد آن در اینترنت اشیاء

پروتکل MQTT چیست؟ | داناپرداز

MQTT یکی از شناخته شده ترین و پذیرفته شده ترین پروتکل های موجود در دنیای IoT است. طراحی سبک و سادگی افزونه ها ویژگی هایی هستند که باعث می شود MQTT برای دستگاه های مختلف با قابلیت پردازش و ذخیره سازی کوچک و بزرگ مناسب باشد. مزایای استفاده از MQTT به جای HTTP شامل صرفه جویی در مصرف انرژی و استفاده از پهنای باند شبکه پایین تر است که تقریباً برای هر دستگاه IoT هر دوی این موارد بسیار مهم هستند.

در این مقاله نگاه دقیق تری به MQTT خواهیم داشت.

 

MQTT چیست؟

MQTT بر اساس تعریف رسمی یک پروتکل پیام رسانی و اشتراک گذاری است. MQTT سبک و ساده است و به گونه ای طراحی شده که اجرای آن آسان باشد و به طور خاص برای IoT هایی که با منبع، قدرت، پهنای باند و رد پای محدود طراحی شده اند، مناسب است.

پروتکل MQTT شامل 3 بلوک اصلی است: کارگزار. ناشر و مشترک.

• کارگزار سرور مسئول مدیریت شبکه مشتریانی است که ترکیبی از ناشران و مشترکین است.
• ناشر دستگاهی است که پیام ها را به سرور ارسال می کند (منتشر می کند). این پیام ها با نام “موضوع” مشخص شده اند.
• مشترک وسیله ای است که موضوع را دریافت می کند.

هیچ ارتباط مستقیمی بین ناشر و مشترک وجود ندارد. مشترک به کارگزار (سرور) اعلام می کند که به چه موضوعاتی علاقه مند است و کارگزار ارسال پیام با داده های مشخص شده را برای موضوع / های درخواست شده کنترل می کند. مدل انتشار / اشتراک با مدل درخواست / پاسخ در HTTP کاملاً متفاوت است به طوری که امکان انتقال پیام یک به چند فراهم می شود.

موضوعات را می توان مانند یک برچسب برای هر پیام در نظر گرفت و این ارتباط می تواند به صورت یک سطح یا چند سطح (درخت) باشد که در آن هر سطح با یک برش جدا می شود (/) ( یعنی : اتاق ها / اتاق 1 / سنسورها / دما) . این روش می تواند برای سازمان‌دهی داده ها مفید باشد.

هر دستگاهی که می خواهد اطلاعات مربوط به موضوع خاصی را به دست آورد، باید با آگاه سازی کارگزار (سرور)، اشتراک دریافت کند. اشتراک را می توان برای یک موضوع خاص یا یک “الگو” انجام داد. برای انجام این کار از (+ و #) استفاده می شود.

 

پروتکل MQTT

• علامت ‘+’ به معنای مشترک شدن در هر موضوعی در این سطح است. یعنی اتاق ها / + / حسگرها / درجه حرارت به معنای دریافت داده هایی است که از حسگرهای دما از همه اتاق ها حاصل می شوند.
• علامت ‘#’ به معنای مشترک شدن در همه موضوعات در این سطح و سطح پایین تر است. یعنی 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 0

 

– QoS 1

این حالت انتقال پیش فرض در MQTT است و نشان می دهد که پیام همیشه حداقل یک بار تحویل داده می شود. دریافت پیام در این سطح از QoS باید تایید شود. عدم دریافت تاییدیه منجر به ارسال مجدد پیام با یک Flag تکراری (DUP) می شود. این فرآیند تا زمان تایید پیام تکرار می شود و می تواند منجر به چندین بار ارسال و پردازش یک پیام شود.

پیام های تنظیم شده در QoS 1 تا زمانی که پردازش آنها انجام شود به صورت محلی در فرستنده و گیرنده ذخیره می شوند. گیرنده پس از پردازش پیام را حذف می کند. هنگامی که گیرنده یک بروکر است، پیام برای مشترکین مربوطه منتشر می شود. کلاینت هایی که پیامی را دریافت می کنند آن را به برنامه مشترک تحویل می دهند.

پس از حذف پیام، گیرنده یک تاییدیه برای فرستنده ارسال می کند. فرستنده ها پس از اینکه تاییدیه گیرنده را پذیرفتند، پیام را در QoS 1 حذف می کنند.

 

qos 1

 

– QoS 2

پیام های ارسال شده در QoS 2 همیشه دقیقا یک بار تحویل داده می شوند. این قابل اطمینان ترین و کندترین حالت انتقال در یک شبکه MQTT است. پیام ها تا زمانی که پردازش شوند به صورت محلی در فرستنده و گیرنده ذخیره می شوند. قبل از حذف پیام از فرستنده، حداقل دو جفت ارسال بین فرستنده و گیرنده انجام می شود.

تا زمانی که پیام بیشتر از یک بار پردازش نشود، پیام می تواند توسط گیرنده پس از تکمیل اولین یا دومین ارسال پردازش شود.

اولین جفت ارسال شامل فرستنده ای است که پیام را ارسال و تایید می کند که گیرنده آن را ذخیره کرده است. اگر فرستنده تاییدیه را دریافت نکرده باشد، تا زمانی که تاییدیه دریافت شود، پیام ها با Flag تکراری (DUP) مجددا ارسال می شوند.

در جفت دوم ارسال، فرستنده به گیرنده اطلاع می دهد که می تواند پردازش پیام را با ارسال یک پیام PUBREL تکمیل کند. پیام PUBREL به طور مکرر ارسال می شود تا زمانی که دریافت آن تایید شود. در این مرحله، فرستنده پیام را حذف می کند.

هنگامی که گیرنده پیام یک بروکر است، وظیفه خود را انجام می دهد و پیام را برای مشترکین منتشر می کند. یک کلاینت گیرنده، پیام را به برنامه مشترک تحویل می دهد. هنگامی که گیرنده پردازش یک پیام را به پایان رساند، یک پیام تکمیل را برای فرستنده ارسال می کند. QoS 2 برای اطمینان از اینکه پیام ها بیشتر از یک بار گم یا پردازش نمی شوند، به کار می رود.

 

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 می توان استقرار اینترنت اشیا را در کمترین زمان انجام داد.

 

سوالات متداول

  1. MQTT چیست؟
    MQTT بر اساس تعریف رسمی یک پروتکل پیام رسانی و اشتراک گذاری است. MQTT سبک و ساده است و به گونه ای طراحی شده که اجرای آن آسان باشد و به طور خاص برای IoT هایی که با منبع، قدرت، پهنای باند و رد پای محدود طراحی شده اند، مناسب است.
  2. علامت ‘+’ در MQTT چیست؟
    علامت ‘+’ به معنای مشترک شدن در هر موضوعی در این سطح است. یعنی اتاق ها / + / حسگرها / درجه حرارت به معنای دریافت داده هایی است که از حسگرهای دما از همه اتاق ها حاصل می شوند.

2 در مورد “پروتکل MQTT چیست؟ کاربرد آن در اینترنت اشیاء”

  1. محمدرضا کاظمی

    ببخشید من یک سوال داشتم
    میخواستم بدونم توی کجاها از پروتکل MQTT استفاده میشه؟

    1. امیر علی محمودی

      سلام وقتتون بخیر
      سوالتون خیلی کلی هستش ولی MQTT در دامنه اینترنت اشیا (IoT) استفاده می‌شود، به عنوان مثال در صنایع خودروسازی، خانه هوشمند و کشاورزی.
      برای اطلاعات بیشتر راجع به اینترنت اشیا (IoT) میتونین به صفحه “اینترنت اشیا چیست؟ همه چیز درباره IoT” ما مراجعه کنین

دیدگاه‌ خود را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

به بالا بروید