MQTT به عنوان یکی از پرکاربردترین پروتکلها در اکوسیستم گسترده اینترنت اشیا شناخته میشود و این محبوبیت بیدلیل نیست. ساختار سبکوزن و سادگی چشمگیر آن در پیادهسازی، این امکان را فراهم کرده تا بتوان در انواع دستگاهها، از جمله تجهیزاتی که محدودیت منابع پردازشی یا ذخیرهسازی دارند تا سیستمهایی با توان محاسباتی بالا، بهراحتی از این پروتکل بهره گرفت. استفاده از MQTT بهجای پروتکلهایی مانند HTTP منجر به کاهش مصرف انرژی و کاهش چشمگیر در استفاده از پهنای باند میشود که این دو ویژگی در دنیای اینترنت اشیا، بهویژه زمانی که پایداری ارتباط و عمر باتری تجهیزات اهمیت زیادی دارد، حیاتی هستند.
در این مقاله با نگاهی دقیقتر به MQTT، به بررسی ساختار و مزایای این پروتکل ارتباطی مهم در حوزه اینترنت اشیا خواهیم پرداخت.
خلاصه مقاله در یک نگاه:
در دنیای متصل امروز، پروتکل MQTT به عنوان ستون فقرات ارتباطات در اینترنت اشیا شناخته میشود. این پروتکل سبک، سریع و قابل اعتماد است و بهگونهای طراحی شده که بتواند در محیطهایی با منابع محدود بهخوبی عمل کند. MQTT بر پایه مدل ارتباطی انتشار/اشتراک بنا شده که به کمک آن، دستگاهها بدون وابستگی مستقیم به یکدیگر میتوانند دادهها را ارسال و دریافت کنند. این ساختار غیرمتمرکز باعث افزایش مقیاسپذیری و پایداری سیستم میشود.در سطوح مختلف کیفیت خدمات (QoS)، MQTT امکان کنترل دقیقتری بر نحوه ارسال و دریافت پیامها فراهم میآورد. سطح QoS 1 تضمین میکند که پیام حداقل یک بار تحویل داده میشود، در حالی که QoS 2 با فرآیندی دقیق، اطمینان میدهد که پیام دقیقا یک بار تحویل شده و تکراری پردازش نمیشود.
پروتکل MQTT از مجموعهای از بستههای کنترلی برای مدیریت اتصال، انتشار پیام، اشتراک موضوعات و حفظ ارتباط میان کلاینتها و سرور استفاده میکند. از جمله این بستهها میتوان به CONNECT، PUBLISH، SUBSCRIBE و DISCONNECT اشاره کرد که هریک وظیفهای خاص در فرآیند پیامرسانی بر عهده دارند.
فهرست مطالب
MQTT چیست؟
مطابق تعریفی که برای این پروتکل ارائه شده، MQTT یک سیستم ارتباطی مبتنی بر الگوی انتشار و اشتراک است که بهگونهای طراحی شده تا با مصرف حداقلی منابع، عملکردی مطمئن و روان در اختیار توسعهدهندگان قرار دهد. ساختار ساده و سبک آن به شکلی است که بتوان آن را بهراحتی در تجهیزات با منابع محدود، همانند بسیاری از دستگاههای اینترنت اشیا، پیادهسازی کرد.
سه مولفه اصلی در معماری MQTT وجود دارد که هر کدام نقش مشخصی ایفا میکنند: کارگزار که مرکز مدیریت ارتباطات است، ناشر که اطلاعات تولیدشده را ارسال میکند و مشترک که آن اطلاعات را دریافت و مصرف میکند. ارتباط میان ناشر و مشترک بهصورت مستقیم برقرار نمیشود و تمام تبادل دادهها از طریق کارگزار انجام میگیرد. مشترک به کارگزار اعلام میکند که مایل به دریافت چه دستهای از اطلاعات یا موضوعات است و پس از آن، کارگزار مسئول ارسال پیامهایی میشود که مربوط به آن دسته از موضوعات هستند.
بر خلاف مدل ارتباطی مبتنی بر درخواست و پاسخ که در HTTP رایج است، MQTT از مدل انتشار/اشتراک استفاده میکند که امکان ارسال یک پیام به چندین گیرنده را فراهم میسازد. این ویژگی بهخصوص در پروژههایی که نیاز به گسترشپذیری بالا دارند یا قصد دارند دادهها را همزمان در اختیار چندین سیستم قرار دهند، بسیار کاربردی و کارآمد خواهد بود.
موضوعاتی که در MQTT تعریف میشوند، بهعنوان شناسههایی عمل میکنند که پیامها بر اساس آنها دستهبندی و توزیع میشوند. این موضوعات میتوانند بهصورت سلسلهمراتبی تعریف شوند که با علامت اسلش (/) از یکدیگر جدا شدهاند. برای مثال موضوعی مانند rooms/room1/sensors/temperature به روشی شفاف، جایگاه و نوع داده را مشخص میسازد. چنین ساختاری به توسعهدهندگان کمک میکند تا دادهها را به شکل منظمی سازماندهی کرده و آنها را بهطور دقیق مدیریت کنند.
برای اینکه یک دستگاه بتواند دادههای یک موضوع خاص را دریافت کند، لازم است در آن موضوع در کارگزار مشترک شود. این اشتراک میتواند بهصورت دقیق انجام شود یا با استفاده از الگوهایی گستردهتر که با نمادهای خاصی مانند + و # تعریف میشوند، موضوعات مختلفی را تحت پوشش قرار دهد.
نمادهای اشتراک در پروتکل MQTT
زمانی که از نماد ‘+’ استفاده میشود، اشتراکگذاری پیامها در سطحی مشخص از سلسلهمراتب موضوع انجام میگیرد. مثلاً با تعریف موضوع rooms/+/sensors/temperature میتوان به دادههای مربوط به دمای تمام اتاقها دسترسی پیدا کرد، بدون آنکه لازم باشد هر موضوع بهصورت مجزا تعریف شود.
اما در شرایطی که بخواهیم تمام اطلاعات مربوط به یک بخش خاص و زیرشاخههای آن را دریافت کنیم، نماد ‘#’ بسیار کارآمد خواهد بود. برای نمونه با استفاده از موضوع rooms/room1/# تمام دادههای مربوط به اتاق اول، صرفنظر از نوع یا تعداد زیرموضوعات، دریافت خواهند شد.
ساختار فنی MQTT
پروتکل MQTT بر پایه TCP/IP توسعه یافته و برخلاف HTTP که دادهها را بهصورت متنی منتقل میکند، در قالب باینری ارتباط برقرار میسازد. استفاده از ساختار باینری نه تنها باعث کاهش حجم دادهها میشود بلکه منجر به مصرف کمتر پهنای باند نیز خواهد شد. این ویژگی برای محیطهایی که با محدودیت در شبکه یا منابع مواجه هستند، یک مزیت بزرگ محسوب میشود.
همچنین طراحی MQTT بهگونهای انجام شده که در محیطهایی با اتصال ضعیف یا ناپایدار، عملکرد مناسبی داشته باشد. بههمین دلیل ویژگیهایی در آن لحاظ شده که اجازه میدهد حتی در شرایطی که کیفیت ارتباط مطلوب نیست، پیامها به شکلی قابل اطمینان به مقصد برسند.
کیفیت سرویس (QoS) در MQTT
یکی از قابلیتهای مهمی که MQTT را برای طیف وسیعی از کاربردها مناسب میسازد، امکان تعیین کیفیت سرویس یا QoS است. این ویژگی به توسعهدهنده اجازه میدهد تا سطح اطمینان مورد نظر برای تحویل پیامها را مشخص کند. سه سطح برای QoS در نظر گرفته شده که هر یک پاسخگوی نیازهای متفاوتی است.
در سطح صفر که با QoS=0 مشخص میشود، پیام تنها یک بار ارسال میشود و هیچ تضمینی برای دریافت آن وجود ندارد. این روش سریعترین است اما میزان اطمینان پایینی دارد. در سطح بعدی، یعنی QoS=1، پیام حداقل یک بار ارسال میشود و تا زمانی که گیرنده دریافت آن را تأیید نکند، کارگزار به تکرار آن ادامه میدهد. در این سطح ممکن است پیام بیش از یک بار به مقصد برسد. در نهایت، سطح سوم یا QoS=2، دقیقترین و قابلاعتمادترین سطح است که در آن اطمینان حاصل میشود هر پیام فقط یکبار و بدون تکرار تحویل داده خواهد شد، هرچند که در عوض زمان و منابع بیشتری برای پردازش نیاز دارد.
میخوای ارتباطات IoT رو با کمترین تأخیر و بیشترین پایداری پیادهسازی کنی؟ با یه سرور HP قدرتمند، MQTT رو در مقیاس واقعی تست کن!
همین الان سرور HP مناسب پروژهت رو بگیر.
رفتار پیامها هنگام قطع اتصال مشترک
در شرایطی که مشترک در زمان ارسال پیام از سمت ناشر به کارگزار متصل نباشد، نحوه برخورد با پیامها به تنظیماتی وابسته است که تحت عنوان Clean Session شناخته میشود. اگر این گزینه فعال باشد، سرور پس از هر بار اتصال مجدد، تمام اطلاعات مربوط به نشست قبلی را حذف خواهد کرد. اما در حالتی که این گزینه غیرفعال باقی بماند، کارگزار پیامهایی را که در زمان قطع اتصال ارسال شدهاند، نگه میدارد و پس از برقرار شدن مجدد ارتباط، آنها را به مشترک تحویل خواهد داد.
انواع پیامها در MQTT
MQTT همچنین امکان تعریف نوعی پیام ویژه را فراهم میکند که عملکرد آن فراتر از تبادل ساده اطلاعات است. یکی از این پیامها retained message یا پیام حفظشده است که برای ثبت آخرین وضعیت یک موضوع به کار میرود. وقتی کاربری جدید به آن موضوع ملحق شود، بلافاصله پیام ذخیرهشده برای او ارسال خواهد شد. این قابلیت در بسیاری از سناریوها مانند وضعیت فعلی دستگاه یا مقدار سنسور اهمیت زیادی دارد.
نوع دیگری از پیامها با عنوان Last Will Message شناخته میشود که امکان ارسال خودکار پیامی از پیش تعیینشده را در صورت قطع ناگهانی ارتباط دستگاه با سیستم فراهم میکند. این ویژگی، بهخصوص در پروژههایی که سلامت یا وضعیت اتصال دستگاهها از اهمیت حیاتی برخوردار است، میتواند نقش مهمی ایفا کند.
یک مثال ساده از نحوه کار MQTT
فرض کنید دستگاهی وجود دارد که وظیفه ثبت دمای محیط را بر عهده دارد. این دستگاه دادههای مربوط به دما را در موضوعی مشخص تعریف کرده و آنها را به کارگزار ارسال میکند. در همین زمان، یک نرمافزار در تلفن همراه یا رایانه که علاقهمند به دریافت این اطلاعات است، در آن موضوع مشترک میشود. کارگزار با دریافت پیام از دستگاه، آن را برای نرمافزار ارسال میکند و به این ترتیب ارتباط میان دستگاه و مصرفکننده دادهها برقرار میشود، بدون آنکه ارتباط مستقیمی بین آنها وجود داشته باشد.
مفهوم QoS و نقش آن در قابلیت اطمینان
ویژگی QoS در پروتکل MQTT نه تنها ابزار کنترل پیامهاست بلکه عامل اصلی در تأمین قابلیت اطمینان ارتباط محسوب میشود. این امکان برای ناشر فراهم شده که متناسب با اهمیت اطلاعات، سطح اطمینان مناسب را انتخاب کند. در عین حال، مشترک نیز میتواند سطح دلخواه خود را مشخص کند. نکته قابل توجه اینجاست که کارگزار همواره بر اساس پایینترین سطح QoS میان ناشر و مشترک عمل میکند تا بتواند تعادلی میان مصرف منابع و تضمین تحویل اطلاعات برقرار کند. این ویژگی MQTT را به ابزاری منعطف و قابل اتکا در پروژههای واقعی اینترنت اشیا تبدیل کرده است.
کیفیت سرویس QoS 1 در پروتکل MQTT
در سطح یک از کیفیت سرویس یا همان QoS 1، پیامها به گونهای منتقل میشوند که همواره حداقل یک بار تحویل داده شوند. این روش بهعنوان حالت پیشفرض در بسیاری از کاربردهای MQTT مورد استفاده قرار میگیرد. در این سطح، دریافت پیام نیازمند ارسال یک پیام تأییدیه از سوی گیرنده است. در صورتی که این تأییدیه دریافت نشود، پیام با یک علامت مشخص به نام DUP مجدداً ارسال خواهد شد. این چرخه ادامه مییابد تا زمانی که فرستنده از دریافت صحیح پیام توسط گیرنده اطمینان حاصل کند. این فرآیند میتواند منجر به تحویل چندباره یک پیام مشابه شود که البته خود پروتکل این مسئله را مدیریت میکند.
پیامهایی که در این سطح از QoS منتشر میشوند، تا زمانی که پردازش آنها کامل نشده، هم در سمت فرستنده و هم در سمت گیرنده بهصورت محلی ذخیره میگردند. پس از پردازش موفق پیام، گیرنده آن را حذف میکند. چنانچه گیرنده یک کارگزار باشد، این پیامها برای همه مشترکینی که به موضوع مربوطه علاقهمند هستند منتشر میشود. هر کلاینتی که این پیام را دریافت میکند، آن را به اپلیکیشن یا برنامهای که مشترک موضوع است تحویل خواهد داد. در نهایت، پس از حذف پیام توسط گیرنده، یک تأییدیه به فرستنده بازگردانده میشود و در ادامه، فرستنده نیز پیام را از حافظه خود پاک میکند.
کیفیت سرویس QoS 2 در پروتکل MQTT
در سطح دوم از کیفیت سرویس که بهعنوان قابلاعتمادترین و البته کندترین روش انتقال داده در MQTT شناخته میشود، هر پیام فقط یکبار و بدون تکرار تحویل داده خواهد شد. در این حالت، پیامها تا زمانی که مراحل پردازش بهطور کامل طی نشدهاند، در حافظه هر دو طرف، یعنی هم فرستنده و هم گیرنده باقی میمانند. این اطمینان وجود دارد که نه پیام از دست میرود و نه بیش از یکبار تحویل داده میشود.
برای تضمین تحویل دقیق، حداقل دو تبادل جداگانه بین فرستنده و گیرنده انجام میشود. در گام نخست، پیام ارسال میشود و گیرنده موظف است اعلام کند که پیام را دریافت و ذخیره کرده است. اگر این تأییدیه به فرستنده نرسد، پیام همراه با نشان DUP مجدداً ارسال خواهد شد. سپس در گام دوم، فرستنده با ارسال پیامی به نام PUBREL به گیرنده اعلام میکند که میتواند پیام را پردازش کند. این پیام نیز تا دریافت تأیید نهایی از سوی گیرنده، بهصورت تکرارشونده فرستاده میشود. پس از این مرحله، فرستنده با خیال آسوده پیام را از حافظه خود حذف میکند.
در صورتی که گیرنده نقش یک کارگزار را ایفا کند، پیام را برای مشترکین منتشر میکند. اما اگر گیرنده یک کلاینت باشد، پیام را در اختیار نرمافزار یا برنامهای که مشترک آن موضوع است قرار خواهد داد. زمانی که پردازش به پایان برسد، گیرنده با ارسال پیامی به فرستنده، تکمیل فرآیند را اعلام مینماید. استفاده از QoS 2 زمانی توصیه میشود که حساسیت بالایی در تحویل پیامها وجود دارد و حتی یکبار پردازش اشتباه یا تحویل مکرر نیز قابل قبول نیست.
نقش بستههای ارسالی در MQTT
پروتکل MQTT برای تبادل اطلاعات بین کلاینتها و سرورها از ساختاری به نام بستههای کنترلی استفاده میکند. این بستهها کوچکترین واحدهای انتقال داده در این سیستم بهشمار میروند و از طریق آنها فرآیندهایی مانند برقراری اتصال، اشتراک در موضوعات یا انتشار پیامها صورت میگیرد. در مجموع پانزده نوع مختلف از این بستهها در نسخه استاندارد MQTT تعریف شده که هرکدام وظیفهای مشخص برعهده دارند. اگر بخواهیم این بستهها را از منظر کارکردشان دستهبندی کنیم، میتوان آنها را در سه گروه کلی اتصال، انتشار و اشتراک قرار داد.
برای آغاز ارتباط، کلاینت ابتدا بستهای با عنوان CONNECT به سمت سرور ارسال میکند. سرور نیز در پاسخ، بسته CONNACK را برای اعلام موفقیتآمیز بودن یا شکست اتصال بازمیگرداند. در مواقعی که ارتباط باید به صورت عمدی یا در اثر بروز خطا قطع شود، بسته DISCONNECT میان طرفین مبادله شده و در پی آن ارتباط پایان مییابد.
از جمله قابلیتهای جدیدی که در نسخه ۵.۰ این پروتکل افزوده شده، بستهای با عنوان AUTH است. این بسته بهطور ویژه برای فرآیند احراز هویت پیشرفته طراحی شده و امنیت ارتباط را در سطح بالاتری تضمین میکند. در کنار این موارد، بستههایی با نام PINGREQ و PINGRESP وظیفه دارند تا از فعال بودن ارتباط میان کلاینت و سرور اطمینان حاصل کنند. کلاینت در بازههای زمانی مشخص بسته PINGREQ را ارسال میکند و در صورت دریافت پاسخ به موقع از سوی سرور، مطمئن میشود که ارتباط هنوز برقرار است.
بسته PUBLISH برای انتقال محتوا از ناشر به سمت کارگزار به کار میرود و در سطوح مختلف QoS، بستههای کمکی دیگری نیز وجود دارند که نقش تأیید یا تکمیل تبادل پیام را ایفا میکنند. برای مثال، در اشتراکگذاری موضوعات، کلاینت بستهای با عنوان SUBSCRIBE ارسال میکند و سرور با بسته SUBACK پاسخ میدهد. لغو اشتراک نیز با بسته UNSUBSCRIBE انجام میشود و نتیجه آن توسط بسته UNSUBACK بازگردانده خواهد شد. این معماری دقیق و چندلایه باعث شده تا MQTT به گزینهای قابل اعتماد و انعطافپذیر برای کاربردهای حساس در حوزه اینترنت اشیا تبدیل شود.
MQTT و نقش کلیدی آن در اینترنت اشیا
در دنیای پیچیده و پرشتاب اینترنت اشیا، آنچه به عنوان هسته اصلی تعامل میان دستگاهها و سیستمهای پردازشی شناخته میشود، توانایی انتقال قابل اطمینان، سریع و سبک اطلاعات از حسگرها به بسترهای محاسباتی است. این همان جاییست که پروتکل MQTT خود را به عنوان انتخابی بیرقیب معرفی میکند. این پروتکل، بهواسطه ماهیت ساده، ساختار سبک و قابلیت اطمینان بالا، به استاندارد واقعی و مورد تأیید پیامرسانی در اینترنت اشیا تبدیل شده است. MQTT که اکنون تحت استانداردهای OASIS و ISO شناخته میشود، با بهرهگیری از مدل ارتباطی انتشار و اشتراک، بستری مقیاسپذیر و قابل اعتماد برای ارتباط میان میلیونها دستگاه فراهم میسازد؛ از سنسورهای کوچک در محیطهای صنعتی گرفته تا سیستمهای پیچیده در مراکز داده.
در بسیاری از کاربردهای صنعتی، از MQTT برای جمعآوری دادههای حسگر از محیطهای عملیاتی و انتقال متمرکز آنها به سامانههای تحلیلی مبتنی بر الگوریتمهای یادگیری ماشین استفاده میشود. این پیامرسانی بهطور همزمان میتواند دستوراتی را از مراکز کنترل به دستگاههای محیطی ارسال کند و رفتار آنها را در نقاط مختلف هماهنگ سازد. در چنین فضایی، انتخاب MQTT به عنوان ستون فقرات ارتباطی، به معنای انتخاب یک مسیر مطمئن برای مدیریت هوشمند سامانههای توزیعشده است.
زمانی که توسعهدهندگان قصد دارند یک بستر اختصاصی اینترنت اشیا طراحی کنند، مهم است که بهجای استفاده از راهکارهای اختصاصی یا پیچیده، از یک پروتکل پیامرسانی متنباز، مستند و پشتیبانیشده مانند MQTT بهره ببرند. این پروتکل بهدلیل ساختار سبک خود، مناسب برای تجهیزاتی است که منابع سختافزاری محدود، پهنای باند کم و مصرف انرژی پایین دارند. قابلیت پشتیبانی از انواع سناریوهای کاربردی، MQTT را به گزینهای انعطافپذیر و جذاب برای طیف گستردهای از پروژههای اینترنت اشیا تبدیل کرده است.
امنیت در دنیای IoT بهتنهایی یک چالش بزرگ محسوب میشود، و در این زمینه نیز MQTT عملکرد بسیار خوبی از خود نشان داده است. این پروتکل با پشتیبانی از رمزنگاری سرتاسری دادهها، امنیت اطلاعات رد و بدلشده بین کلاینتها و سرورها را تضمین میکند. چنین ویژگیای بهخصوص برای دادههای حساس و محرمانه، ارزش بسیار زیادی دارد و خیال توسعهدهندگان را از بابت نفوذهای احتمالی راحت میسازد. MQTT همچنین بهخوبی با مجموعه متنوعی از کتابخانههای نرمافزاری سازگار است که امکان توسعه سریع، سفارشیسازی دقیق و استقرار سادهتر را برای پروژههای IoT فراهم میآورد.
در کنار این مزایا، نباید از بلوغ این پروتکل نیز غافل شد. MQTT اکنون دارای طیف گستردهای از بروکرها و کلاینتهایی است که با زبانهای برنامهنویسی مختلف توسعه یافتهاند. جامعههای توسعهدهنده فعال و مستندات کامل و گامبهگام، فرآیند یادگیری و پیادهسازی را برای برنامهنویسان آسان کردهاند. سادگی در معماری و وضوح در پیادهسازی، MQTT را به ابزاری کاربردی و دوستداشتنی برای برنامهنویسان تبدیل کرده است. به همین دلیل است که امروز، با کمک این پروتکل، بسیاری از پروژههای اینترنت اشیا در مدتزمانی کوتاه اما با کیفیتی بالا به بهرهبرداری میرسند.
پاسخ به چند پرسش رایج درباره MQTT
پروتکل MQTT در اصل یک سیستم پیامرسانی مبتنی بر مدل انتشار و اشتراک است. این ساختار بهگونهای طراحی شده که هم ساده باشد و هم اجرای آن در محیطهایی با منابع محدود بسیار آسان گردد. به همین دلیل MQTT بهعنوان پروتکلی سبک و کمهزینه، نقش کلیدی در پیادهسازی سیستمهایی ایفا میکند که نیاز به ارتباطات گسترده ولی کممصرف دارند.
یکی از نمادهای پرکاربرد در این پروتکل، علامت ‘+’ است که به عنوان یک جایگیر برای موضوعات استفاده میشود. برای مثال، در صورتی که بخواهید تمام دادههای دمایی از همه اتاقها را دریافت کنید، میتوانید از موضوعی مانند اتاقها/+ /سنسورها/درجهحرارت استفاده نمایید. این علامت مشخص میکند که در هر سطحی از موضوع، پیامها بدون نیاز به تعیین دقیق مسیر قابل دریافت هستند.
MQTT به دلیل سادگی در پیادهسازی، جامعه کاربری فعال، مستندات غنی و امنیت بالا، به یکی از محبوبترین گزینهها برای پروژههای اینترنت اشیا تبدیل شده است. این پروتکل از رمزگذاری سرتاسری دادهها پشتیبانی میکند و قابلیت کار با انواع کتابخانههای توسعه را دارد.
در نهایت، MQTT نه تنها راهکاری استاندارد برای اتصال دستگاهها در IoT است، بلکه مسیری عملی، ایمن و توسعهپذیر برای ساخت پلتفرمهای هوشمند محسوب میشود.