MQTT یک پروتکل پیامرسانی استاندارد است که برای ارتباط ماشین به ماشین استفاده میشود. سنسورهای هوشمند، دستگاههای پوشیدنی و سایر ابزارهای اینترنت اشیا (IoT) معمولاً نیاز دارند دادهها را در یک شبکه با منابع محدود و پهنای باند کم ارسال و دریافت کنند. این دستگاههای IoT از MQTT برای انتقال دادهها استفاده میکنند، زیرا پیادهسازی آن آسان است و میتواند بهطور مؤثر دادههای IoT را منتقل کند. MQTT از پیامرسانی بین دستگاهها به ابر و از ابر به دستگاه پشتیبانی میکند.

تاریخچه پروتکل MQTT
پروتکل MQTT در سال ۱۹۹۹ به منظور استفاده در صنعت نفت و گاز ایجاد شد. مهندسان آن زمان به یک پروتکل نیاز داشتند که با حداقل پهنای باند و کمترین مصرف باتری کار کند تا بتوانند خطوط لوله نفت را از طریق ماهواره نظارت کنند. در ابتدا، این پروتکل با نام “انتقال تلمتری صف پیام” یا Message Queuing Telemetry Transport شناخته میشد و به محصول IBM به نام سری MQ نسبت داده میشد که از مراحل ابتدایی آن پشتیبانی میکرد.
در سال ۲۰۱۰، IBM نسخه ۳.۱ از MQTT را به عنوان یک پروتکل رایگان و باز منتشر کرد، به این معنی که هر کسی میتوانست آن را پیادهسازی کند. سپس در سال ۲۰۱۳، این پروتکل به سازمان پیشبرد استانداردهای اطلاعات ساختاریافته (OASIS) سپرده شد تا مدیریت و نگهداری آن را بر عهده بگیرد.
در سال ۲۰۱۹، نسخه بهروزشده MQTT 5 توسط OASIS منتشر شد. جالب است بدانید که اکنون MQTT دیگر فقط یک مخفف نیست، بلکه به عنوان نام رسمی این پروتکل شناخته میشود. این تاریخچه نشان میدهد که چگونه MQTT از یک نیاز خاص در صنعت نفت و گاز به یک استاندارد جهانی برای ارتباطات اینترنت اشیا تبدیل شده است.
چرا پروتکل MQTT مهم است؟
پروتکل MQTT به یک استاندارد محبوب برای انتقال دادههای اینترنت اشیا (IoT) تبدیل شده است و دلایل خوبی برای این موضوع وجود دارد:
سبک و کارآمد است
MQTT به گونهای طراحی شده که نیاز به منابع بسیار کمی دارد. این یعنی شما میتوانید آن را حتی روی میکروکنترلرهای کوچک هم استفاده کنید. برای مثال، یک پیام کنترل در MQTT میتواند فقط دو بایت داده داشته باشد! همچنین، هدرهای پیام در MQTT بسیار کوچک هستند، که به شما کمک میکند تا از پهنای باند شبکه به بهترین شکل استفاده کنید.
مقیاس پذیر است
پیادهسازی MQTT به مقدار کمی کد نیاز دارد و این کد بسیار کممصرف است. همچنین این پروتکل ویژگیهایی دارد که به شما اجازه میدهد با تعداد زیادی از دستگاههای IoT ارتباط برقرار کنید. به همین دلیل، میتوانید MQTT را برای اتصال به میلیونها دستگاه به کار ببرید.
قابل اعتماد است
بسیاری از دستگاههای IoT از طریق شبکههای سیار که ممکن است غیرقابل اعتماد باشند و پهنای باند کمی داشته باشند، متصل میشوند. MQTT ویژگیهایی دارد که زمان لازم برای اتصال دوباره دستگاه به ابر را کاهش میدهد. همچنین سه سطح کیفیت خدمات را تعریف میکند تا از قابلیت اطمینان در استفادههای IoT اطمینان حاصل کند:
- حداکثر یک بار (۰)
- حداقل یک بار (۱)
- دقیقاً یک بار (۲)
ایمن است
MQTT به توسعهدهندگان این امکان را میدهد که پیامها را رمزگذاری کنند و از پروتکلهای احراز هویت مدرن، مانند OAuth و TLS1.3، برای احراز هویت دستگاهها و کاربران استفاده کنند.
پشتیبانی خوبی دارد
چندین زبان برنامهنویسی، مانند Python، از پشتیبانی گستردهای برای پیادهسازی پروتکل MQTT برخوردارند. بنابراین، توسعهدهندگان میتوانند به راحتی و با حداقل کدنویسی آن را در هر نوع برنامهای پیادهسازی کنند.
به طور کلی، MQTT به دلیل کارایی، مقیاسپذیری، قابلیت اطمینان، امنیت و پشتیبانی خوب، به یک گزینه عالی برای ارتباطات اینترنت اشیا تبدیل شده است.
پشت پرده پروتکل MQTT
پروتکل MQTT بر اساس اصول مدل انتشار/اشتراک کار میکند. این مدل به طور قابل توجهی با الگوی سنتی ارتباطات شبکهای متفاوت است. در زیر به توضیح این اصول میپردازیم:
جداسازی فضایی
در مدل MQTT، ناشر و مشترک از موقعیت شبکه یکدیگر آگاه نیستند. این بدان معناست که آنها اطلاعاتی مانند آدرسهای IP یا شمارههای پورت را رد و بدل نمیکنند. این جداسازی به کاهش پیچیدگی و افزایش مقیاسپذیری کمک میکند.
جداسازی زمانی
ناشر و مشترک میتوانند در زمانهای مختلف به شبکه متصل شوند یا اجرا شوند. این ویژگی به آنها اجازه میدهد که بدون نیاز به همزمانی، به تبادل پیام بپردازند. برای مثال، ناشر میتواند پیامهایی را ارسال کند حتی اگر مشترک در آن زمان آنلاین نباشد.
جداسازی همزمانی
هر دو ناشر و مشترک میتوانند به طور همزمان پیامها را ارسال و دریافت کنند. به عنوان مثال، مشترک نیازی ندارد که منتظر بماند تا ناشر پیام را ارسال کند. این ویژگی باعث میشود که ارتباطات سریعتر و مؤثرتر باشد.
کارگزار پیام
در این مدل، یک مؤلفه سوم به نام کارگزار پیام وجود دارد که ارتباط بین ناشران و مشترکان را مدیریت میکند. وظیفه کارگزار شامل موارد زیر است:
- فیلتر کردن پیامهای ورودی: کارگزار تمام پیامهای ورودی از ناشران را فیلتر میکند.
- توزیع صحیح پیامها: کارگزار پیامها را به درستی به مشترکان توزیع میکند.
این ساختار باعث میشود که MQTT به یک پروتکل کارآمد و مقیاسپذیر برای ارتباطات اینترنت اشیا تبدیل شود.

اجزای MQTT
پروتکل MQTT مدل انتشار/اشتراک را با تعریف دو نوع اصلی از اجزا پیادهسازی میکند: مشتریان و کارگزاران. در ادامه به توضیح هر یک از این اجزا میپردازیم:
کلاینت یا مشتری MQTT
مشتری MQTT میتواند هر دستگاهی باشد که از کتابخانه MQTT استفاده میکند، از جمله سرورها، میکروکنترلرها و دستگاههای IoT.
- عملکرد:
- ناشر: اگر مشتری پیامهایی ارسال کند، به عنوان ناشر عمل میکند.
- مشترک: اگر پیامهایی دریافت کند، به عنوان گیرنده عمل میکند.
- ویژگیها: هر دستگاهی که از طریق شبکه با استفاده از MQTT ارتباط برقرار کند، به عنوان مشتری شناخته میشود.
کارگزار یا بروکر MQTT
کارگزار MQTT سیستم پشتیبان است که پیامها را بین مشتریان مختلف هماهنگ میکند.
- وظایف:
- دریافت و فیلتر کردن پیامها: کارگزار پیامها را از ناشران دریافت کرده و آنها را فیلتر میکند.
- شناسایی مشتریان مشترک: کارگزار مشتریان مشترک برای هر پیام را شناسایی کرده و پیامها را به آنها ارسال میکند.
- مجاز کردن و تأیید هویت مشتریان: کارگزار مسئول تأیید هویت مشتریان و مجاز کردن آنها برای ارتباط است.
- انتقال پیامها: کارگزار میتواند پیامها را به سیستمهای دیگر برای تجزیه و تحلیل بیشتر منتقل کند.
- مدیریت پیامهای از دست رفته و جلسات یا سشن مشتریان: کارگزار مسئول مدیریت پیامهایی است که ممکن است گم شوند و همچنین مدیریت جلسات مشتریان.
اتصال MQTT
- روش برقراری اتصال: مشتریان ارتباط خود را با کارگزار با ارسال پیام CONNECT آغاز میکنند.
- تأیید اتصال: کارگزار با پیام CONNACK پاسخ میدهد تا تأیید کند که اتصال برقرار شده است.
- پروتکل ارتباطی: هر دو مشتری MQTT و کارگزار به یک پشته TCP/IP برای ارتباط نیاز دارند.
- جداسازی ارتباط: مشتریان هرگز به یکدیگر متصل نمیشوند و فقط با کارگزار ارتباط برقرار میکنند.
این اجزا با هم کار میکنند تا یک سیستم مقیاسپذیر و کارآمد برای ارتباطات اینترنت اشیا فراهم کنند.

MQTT چگونه کار میکند؟
مروری بر نحوه عملکرد MQTT در زیر ارائه شده است. یک مشتری MQTT با کارگزار MQTT اتصال برقرار میکند. پس از اتصال، مشتری میتواند پیامها را منتشر کند، به پیامهای خاصی مشترک شود یا هر دو کار را انجام دهد. زمانی که کارگزار MQTT پیامی دریافت میکند، آن را به مشترکانی که علاقهمند هستند، ارسال میکند. بیایید جزئیات را برای درک بهتر بررسی کنیم.
موضوع MQTT
اصطلاح «موضوع» به کلیدواژههایی اشاره دارد که کارگزار MQTT برای فیلتر کردن پیامها برای مشتریان MQTT استفاده میکند. موضوعات به صورت سلسلهمراتبی سازماندهی شدهاند، مشابه یک دایرکتوری فایل یا پوشه. به عنوان مثال، یک سیستم خانه هوشمند را در نظر بگیرید که در یک خانه چند طبقه با دستگاههای هوشمند مختلف در هر طبقه کار میکند. در این صورت، کارگزار MQTT ممکن است موضوعات را به صورت زیر سازماندهی کند:
خانه_من/طبقه_اول/آشپزخانه/نور_و_روشنایی
ourhome/firstfloor/kitchen/light
انتشار MQTT
مشتریان MQTT پیامهایی را منتشر میکنند که شامل موضوع و دادهها به فرمت بایت هستند. مشتری فرمت دادهها را تعیین میکند، مانند دادههای متنی، دادههای باینری، فایلهای XML یا JSON. به عنوان مثال، یک لامپ در سیستم خانه هوشمند ممکن است پیامی برای موضوع livingroom/light منتشر کند.
اشتراکگذاری MQTT
مشتریان MQTT یک پیام SUBSCRIBE به کارگزار MQTT ارسال میکنند تا پیامها را درباره موضوعات مورد نظر دریافت کنند. این پیام شامل یک شناسه منحصر به فرد و یک لیست از اشتراکها است. به عنوان مثال، اپلیکیشن خانه هوشمند روی تلفن شما میخواهد نمایش دهد که چند لامپ در خانه شما روشن است. بنابراین به موضوع light مشترک میشود و شمارنده را برای تمام پیامهای روشن افزایش میدهد.

خوشهبندی یا کلاسترینگ MQTT
در حالی که پروتکل MQTT اطمینان از انتقال قابل اعتماد پیامها را در هنگام خرابیهای شبکه با مکانیزمهایی مانند سطوح QoS فراهم میکند، هنوز امکان بروز خطاهای سطح ماشین وجود دارد که کارگزار بر روی آن اجرا میشود. مسائلی مانند سختافزار معیوب یا قطعی برق میتواند منجر به از دست رفتن دادهها و اختلال در جریانها/فرایندهایی شود که به آن دادهها وابستهاند. تصور کنید یک کارخانه تولیدی که از MQTT برای فعالسازی تولید هوشمند استفاده میکند؛ چنین خرابیهایی غیرقابل قبول هستند. اینجاست که خوشهبندی به کار میآید.
این بخش به کارگزار MQTT به عنوان یک گره اشاره خواهد کرد. به طور کلی، یک خوشه شامل چندین گره است که یک موجودیت واحد را تشکیل میدهند. مزایای گروهبندی کارگزاران MQTT در یک خوشه عبارتند از:
در دسترس بودن بالا (HA) در MQTT
HA یا High Availibility در MQTT با همگامسازی دادههای ضروری (مانند جلسات مشتری) در میان گرههای خوشه، از از دست رفتن دادهها به دلیل زمانهای خاموشی کارگزار جلوگیری میکند و اطمینان مییابد که وضعیت کارگزار ثابت باقی بماند. اگر یک کارگزار غیرقابل دسترسی شود، سایر گرهها میتوانند بهطور یکپارچه جایگزین شوند تا جریان دادهها ادامه یابد. به طور معمول، هر گره خوشه MQTT بر روی یک نمونه سرور متفاوت اجرا میشود.
مقیاسگذاری آسان
در شرایطی مانند تولید هوشمند، که حجم بالای پیامها یا اتصالات متعدد مشتریان مورد انتظار است، یک کارگزار MQTT واحد نمیتواند بار شبکه IoT را مدیریت کند. با این حال، یک خوشه MQTT میتواند به سادگی هر زمان که نیازهای سیستم افزایش یابد با افزودن گرههای بیشتر مقیاسگذاری کند. این به توزیع یکنواخت بار کمک میکند که معمولاً توسط بارکنندههای اضافی انجام میشود.
نگهداری در زمان اجرا
اجرای یک کارگزار MQTT واحد بر روی یک نمونه که نیاز به بهروزرسانی یا نگهداری بیشتر دارد، منجر به زمانهای خاموشی و اختلال در جریان دادهها میشود. در حالی که اجرای یک خوشه فعال MQTT اجازه میدهد تا بهروزرسانی و نگهداری متعاقب نمونههای مربوطه انجام شود و اطمینان حاصل شود که خدمات کارگزار در طول فرآیند نگهداری همچنان در دسترس است.
مدیریت نقطهای واحد
به جای اعمال تغییرات به هر گره بهطور جداگانه، خوشه MQTT اجازه میدهد تغییرات بر روی یک گره واحد اعمال شود که سپس تغییرات را از طریق مکانیزم همگامسازی خود در کل خوشه گسترش میدهد. این همچنین از خطای انسانی جلوگیری کرده و بینشهای متمرکزی در مورد وضعیتهای کارگزار خوشه ارائه میدهد.
در نتیجه، با پیادهسازی یک خوشه کارگزار، بار را پخش میکنید، خطر از دست رفتن دادهها را کاهش میدهید و مقیاسپذیری برای رشد آینده را تضمین میکنید.
MQTT بر روی WebSockets چه معنایی دارد
MQTT بر روی WebSockets یک سازگاری از پروتکل MQTT است که برای کار بر روی اتصالات WebSocket طراحی شده است. WebSockets یک کانال ارتباطی دوطرفه را از طریق یک اتصال طولانیمدت فراهم میکند و با مرورگرهای وب و محیطهای متمرکز بر وب سازگار است.
با این حال، مرورگرها نمیتوانند بهطور مستقیم از اتصالات MQTT استفاده کنند. برای چنین مواردی، برخی از کارگزاران مانند Mosquitto به شما اجازه میدهند یک شنونده یا لیسنر WebSocket باز کنید که میتواند بستههای MQTT را هنگامی که یک اتصال برقرار میشود، بپذیرد. به این ترتیب، امکان برقراری ارتباط با کارگزار و مشتریان آن بهطور مستقیم از مرورگر وجود دارد. این ویژگی معمولاً به عنوان MQTT بر روی WebSockets شناخته میشود.
آیا MQTT امن است؟
ارتباط MQTT از پروتکل SSL برای حفاظت از دادههای حساس منتقل شده توسط دستگاههای IoT استفاده میکند. شما میتوانید هویت، تأیید هویت و مجوز را بین مشتریان و کارگزار با استفاده از گواهیهای SSL و/یا رمزهای عبور پیادهسازی کنید. کارگزار MQTT معمولاً مشتریان را با استفاده از رمزهای عبور و همچنین شناسههای منحصر به فردی که به هر مشتری اختصاص میدهد، تأیید هویت میکند. در بیشتر پیادهسازیها، مشتری با گواهیها یا جستجوهای DNS، سرور را تأیید هویت میکند. همچنین میتوانید پروتکلهای رمزنگاری را با MQTT پیادهسازی کنید.
MQTT برای پیامرسانی کارآمد و قابل اعتماد طراحی شده است، اما به طور ذاتی ویژگیهای امنیتی جامع را ارائه نمیدهد. با این حال، میتواند از مکانیزمهای امنیتی موجود، مانند رمزنگاری TLS (امنیت لایه انتقال) استفاده کند. فعالسازی رمزنگاری TLS ارتباط بین مشتریان MQTT و کارگزاران را ایمن میکند به طوری که دادههای مبادله شده محرمانه، تأیید شده و از شنود یا دستکاری محافظت میشوند.
ارتباطات TLS بر روی MQTT (که گاهی به آن MQTTS نیز گفته میشود) معمولاً از پورت ۸۸۸۳ و پیشوند پروتکل “mqtts://” استفاده میکند. اقدامات امنیتی جایگزین مانند تأیید هویت با گواهی مشتری، لیستهای کنترل دسترسی (ACL) و امنیت پویا نیز ممکن است. با این حال، شما باید آنها را بر روی کارگزار پیادهسازی کنید زیرا این موارد خارج از دامنه پروتکل استاندارد MQTT هستند.
