پروتکل MQTT یک پروتکل ساده است که بر روی بستر TCP/IP سوار شده است و انتقال اطلاعات را بر اساس Socket انجام می دهد، هدر های مورد استفاده در MQTT حجم خیلی کمی دارند و این امر باعث کاهش حجم ترافیک در تبادلات شده و هم چنین باعث سادگی پروتکل میشود، اما اغلب سورس های موجود برای پروتکل MQTT بر بستر شبکه LAN و برای PC نوشته شده اند، که پورت کردن آن برای میکروکنترلر و شبکه GSM امری زمانبر و مستلزم درک کامل نحوه کارکرد و آشنایی با زیرساخت های شبکه است. در این آموزش سعی داریم که نحوه کار کرد پروتکل MQTT را به شکل ساده و با مثال های قابل لمس شرح دهیم و توضیح دهیم که چرا پروتکل MQTT یک پروتکل مناسب برای استفاده در Iot ( چیزنت یا اینترنت اشیاء ) است و در ادامه چند Broker معروف را که خدمات رایگان ارائه میدهند را معرفی میکنیم ؛ پس با سیسوگ همراه باشید.
پروتکل MQTT چطور کار می کند
معمولاً پروتکل های اینترنتی نیاز به یک سرور واحد دارند که داده های ارسالی و دریافتی را پردازش و ذخیره میکند، اما در پروتکل MQTT مقداری فرایند ارتباطی متفاوت است.
بیاید با استفاده از مثال پیام رسان تلگرام مقداری قضیه را باز کنیم، فرض کنید شما (دستگاه الکترونیکی) قصد دارید یک سری پیام (داده) را در اختیار گروهی از کاربر ها (دستگاه های دیگر) قرار دهید، سه راه برای انجام این کار وجود دارد:
روش اول
هر کسی که نیاز به پیام های (داده ها) شما دارد، به صورت خصوصی به شما پیام دهد و شما داده های مورد نظر را برای او ارسال کنید، غالب پروتکل های اینترنت به این شکل عمل می کنند و در واقع شما باید نقش سرویس دهنده (سرور) را بازی کنید.
این کار علاوه بر این که بار زیادی بر روی شما می گذارید، باعث به هدر رفتن وقت و ترافیک شما می شود. در ضمن ممکن است در این میان کاربرانی وجود داشته باشند که فقط برای ایجاد مزاحمت و مصرف ترافیک به شما پیام بدهند (حملات DDOS)، شاید با تعداد کم افرادی که به داده های شما نیاز دارند، مشکلی پیش نیاید ولی فرض کنید چند هزار نفر نیاز به پیام های شما داشته باشند، در آن زمان، دیگر عنان کار از دست شما رها خواهد شد، همانطور که یک پردازنده کوچک قادر به پشتیانی ترافیک بالا نیست.
روش دوم
شما (دستگاه) پیام ها (داده ها) را در اختیار یک ربات تلگرامی(سرور دیگر) قرار بدهید و آن ربات پیام را برای افراد متقاضی (دیگر دستگاه ها) ارسال کند. خوب این روش بهتر از روش قبلی است چرا که نیاز نیست شما وقت زیادی برای رساندن پیام به افراد مختلف صرف کنید و کسی مزاحم شما نخواهد شد و این کار را می توانید در زمان کوتاهی انجام دهید.
با این همه شما نیاز خواهید داشت که یک ربات تلگرامی (سرور) تهیه کنید که کار پیام رسانی را بر عهده داشته باشد و این خود علاوه بر ایجاد هزینه راه اندازی، هزینه نگهداری را نیز به شما تحمیل خواهد کرد. مدام باید مراقب باشید که ربات از کار نیفتاده باشد، هک نشده باشد و کارش را به درستی انجام دهد. این روش با وجود این که از راه حل اول بهتر است ولی باز دچار نقصان هایی است که شاید برای استفاده در دستگاه های الکترونیکی زیاد مناسب نباشد.
روش سوم
در این روش شما (دستگاه) به سادگی یک کانال تلگرامی ایجاد می کنید و هر شخصی که علاقمند به پیام های (داده های) شما باشد، به سادگی با عضویت در کانال شما، پیام ها را دریافت خواهد کرد و اگر از پیام های (داده های) شما خوشش نیامد به سادگی از کانال خارج شده و دیگر پیامی دریافت نمیکند.
این روش به نسبت دو روش دیگر برای دستگاه های الکترونیکی که از حافظه کمی برخوردار هستند و هم چنین قصد ندارند که یک سرور خاص تهیه کنند، بسیار کاربری است چرا که دغدغه پشتیبانی و برنامه نویسی سرور را ندارد و هم چنین نیاز به یک پردازنده قوی نیست که قادر باشد به تعداد زیادی متقاضی سرویس دهی کند.
پروتکل MQTT دقیقاً مانند روش سوم عمل میکند، در مثال های فوق تلگرام نقش اینترنت و پروتکل TCP را داشت که پیام ها را منتقل می کرد و کانال تلگرامی هم دقیقاً کار Broker را در پروتکل MQTT انجام می دهد. شما هم کار دستگاه Publisher را بازی میکردید، پالیشر در واقع دستگاهی است که یک Topic در Broker ایجاد میکند و داده های جمع آوری شده را در آن منتشر میکند و متقاضی یا دنبال کننده کانال تلگرامی شما در واقع Subscriber است که با جمع آوری داده های مورد نیاز خود عملی را انجام می دهد.
محدودیتی در تعداد Topic (کانال) وجود ندارد و هر دستگاه خود می تواند چند Topic داشته باشد و در چند Topic مختلف داده ها را قرار دهد و هم زمان می تواند در چند Topic دیگر Subscriber کند (عضو شود) و داده های مورد نظر خود را دریافت کند.
برای این که بتوانید در یک کانال تلگرام عضو شوید نیاز دارید که آدرس کانال را در دسترس داشته باشید در پروتکل MQTT نیز این چنین است برای عضویت در یک Topic باید آدرس آن را در اختیار داشته باشید و تا مادامی که آدرس Topic را در اختیار کسی برای عضویت قرار نداده باشید، Topic شما مخفی می ماند.
تفاوت موجود در Broker و تلگرام در ساختار درختی Topic ها در Broker هست، به این معنی که هر Topic خود می تواند دارای چندین زیر Topic باشد.
حال که با کلیت MQTT و نحوه کارکرد آن آشنا شدیم، برای استفاده از آن لازم است که ساختار آدرس دهی Topic ها را دریابم، در MQTT آدرس دهی مثل آدرس دهی پوشه ها در سیستم عامل لینوکس است که به صورت درختی است.
برای روشن شدن هرچه بیشتر موضوع به مثال زیر دقت کنید.
فرض کنید قصد داریم اطلاعات دمای یک سنسور که در آشپزخانه نصب شده است را مشاهده کنیم، برای این کار کافی است مثلاً در آدرس زیر subscribe کنیم.
1 | sensors/temperature/home/kitchen |
همانطور که مشاهده می کنید با استفاده از “/” میتوان ساختار درختی به آدرس Topic داد. آدرس هر تاپیک توسط سنسور ایجاد می شود و چیزی نیست که به شکل خاصی باشد یا چهارچوب خاصی داشته باشد.
حال فرض کنید می خواهید میانگین دمای خانه را به دست آورید، در هر اتاق یک سنسور نصب می کنید، همه سنسور ها داده ها را به براکر ارسال می کنند. شما برای محاسبه دمای میانگین نیاز دارید که دمای تک تک سنسور ها را داشته باشید، خوب یک راه حل این است که در همه Topic ها subscribe کنید یا از آدرس زیر استفاده کنید:
1 | sensors/temperature/home/# |
آدرس فوق داده های تمام سنسورهای دمای نصب شده در خانه را به نمایش در می آورد، # در واقع باعث می شود که براکر تمام زیر Topic های مربوطه را برای ما ارسال کند.
Qos در MQTT
یکی دیگر از مفاهیم MQTT بحث Quality of Service یا به اختصار QoS می باشد، در واقع QoS کمک میکند که بتوانیم نحوه ارسال پیام ها را مدیریت کنیم.
فرض کنید سنسوری دارید که دمای مکانی را قرائت می کند و به براکر ارسال میکند، خوب ممکن است دمای آن نقطه خیلی مهم نباشد و اگر مقداری از داده ها به دلیل قطع شدن ارتباط از دست بروند، چندان اهمیتی نداشته باشند و بتوان از آنها چشم پوشی کرد.
حال ممکن است بخواهید دمای یک کوره را منتقل کنید، در این حالت تمام داده ها از اهمیت خیلی بالایی برخوردار هستند و از دست رفتن داده میتواند خطرات زیادی به همراه داشته باشد! پس از QoS دیگری در ارسال داده ها استفاده می کنند که احتمال از بین رفتن و یا گم شدن اطلاعات در آنها خیلی پایین است.
در پروتکل MQTT سه حالت QoS وجود دارد که به ترتیب از ساده ترین حالت تا پیچیده ترین حالت به شرح زیر هستند:
QoS Level 0
QoS Level 0 که به اختصار QoS0 هم نوشته می شود، ساده ترین حالت برقراری ارتباط با broker است که نیازی به acknowledgment ندارد، بدین معنی که، به این موضوع که پیام شما توسط Broker دریافت شود یا نشود اهمیتی نمی دهد. همین که Ack شبکه TCP را دریافت کند ملاک را بر ارسال پیام می گذارد و پیام را از لیست ارسال حذف میکند. در این روش اگر فرض کنیم کانکشن قطع شده باشد و هنوز اینتراپت آن به دستگاه نرسیده باشد، ممکن است بخشی از داده های ارسالی هیچ وقت به براکر نرسند. در ارتباطات ساده این روش قابل قبول است چرا که حجم مصرفی داده کمی دارد.
QoS Level 1
QoS Level 1 به اختصار QoS1 هم نوشته می شود. در این حالت دستگاه مطمئن می شود که حداقل پیام یک بار توسط Broker دریافت می شود. به این صورت که Broker پس از دریافت پیام، یک پیام PUBACK به دستگاه ارسال میکند و دستگاه با دریافت PUBACK مطمئن می شود پیام به Broker رسیده است و پیام را از صف ارسال خارج میکند. به هر دلیلی که پیام PUBACK دریافت نشود، برنامه مجدداً بسته را ارسال خواهد کرد و این کار تا وقتی که پیام توسط براکر دریافت شود ادامه خواهد یافت.
QoS Level 2
QoS Level 2 به اختصار QoS2 هم نوشته می شود. در این حالت دستگاه ارسال کننده مطمئن می شود که پیام تنها یک بار توسط یک subscribe دریافت شده است نه بیشتر. به این طریق در محل های حساس می شود مطمئن شد که دستگاه پردازنده اطلاعات، داده های ارسالی را دریافت کرده است. در این روش ترافیک زیادتری بین دستگاه و براکر رد و بدل می شود تا این اطمینان ایجاد شود که داده های ارسالی فقط یک بار توسط عضو ها دریافت می شود نه تعداد بیشتری.
Broker چیست
همانطور که مشخص است، برای ایجاد یک شبکه MQTT به براکر نیاز است. براکر های مختلفی وجود دارند که شما به راحتی با نصب بر روی یک سرور شخصی قادر به ایجاد Broker اختصاصی خواهید بود.
اما راه دیگری نیز وجود دارد، استفاده از براکرهای رایگان، که این سرویس را به صورت رایگان در اختیار کاربر قرار می دهند و هیچ نیازی به انجام عملیاتی برای استفاده وجود ندارد.
در ادامه به چند نمونه از این براکر ها اشاره خواهیم کرد.
Eclipse IOT
قطعاً نام Eclipse برایتان آشنا خواهد بود. اگر سعی کرده باشید برنامه ای بسازید، Eclipse یکی از معروف ترین IDE موجود برای برنامه سازی در زبان های مختلف است که توسط شرکت IBM ایجاد شده است. ابتدا از Eclipse برای برنامه نویسی Java استفاده می شد ولی با گذشت زمان تقریباً تمام زبان های برنامه نویسی رویج را پشتیبانی کرد.
اما Eclipse در حوزه IDE متوقف نشده و با توجه به رشد روز افزون دستگاه های IOT وارد عرصه شده است و در حال ارائه خدمات IOT می باشد. براکر IOT ایجاد شده توسط Eclipse از دو پروتکل MQTT و CoAP پشتیبانی میکند و کاربر بدون هیچ هزینه ای می تواند از خدمات آن استفاده کند. این براکر علاوه بر ارتباط ساده از ارتباط رمزگذاری شده TLS هم می تواند بهره ببرد، با استفاده از TLS داده ها بین بروکر و دستگاه رمزگذاری می شود که امنیت بالاتری را برای اطلاعات تأمین میکند.
برای اطلاعات بیشتر به سایت iot.eclipse.org مراجعه کنید.
Cloud MQTT
یکی دیگر از سرویس های محبوب IOT سرویس Cloud MQTT می باشد. این براکر از سرویس های ابری آمازون استفاده میکند و پروتکل های MQTT را هم به شکل ساده و هم به شکل رمزگذاری شده پشتیبانی میکند. البته این سرویس خدمات را به صورت کاملاً رایگان عرضه نمیکند و تا اتصال 10 دستگاه به صورت رایگان عمل میکند و برای اتصال دستگاه های بیشتر نیاز به خرید اکانت وجود دارد.
برای اطلاعات بیشتر به سایت cloudmqtt.com مراجعه کنید.
HiveMQ
HiveMQ از بازیگران جدید حوزه IOT است و در مدتی که معرفی شده محبوبیت بالایی کسب کرده است. سرویس HiveMQ خدمات رایگانی در حوزه MQTT عرضه میکند که از کیفیت و سرعت بالایی نیز برخوردار است. باقی سرویس های موجود بر روی سایت قابل خریداری است ولی سرویس MQTT رایگان است.
برای جزئیات در خصوص این براکر به این آدرس مراجعه کنید.
ما از خدمات این سرویس دهنده برای طراحی دستگاه استفاده کردیم. ولی فرقی نمیکند از کدام سرویس دهنده استفاده کنید و به راحتی با تغییر آدرس در سورس برنامه قادر خواهید بود که آدرس براکر را به آدرس دلخواه تغییر بدهید.
واقعا کاربردی بود.
خیلی ممنونم
عالی بود . سپاس
سپاس و درود بر شما 🙂
خیلی عالی گفتی دمت گرم
سلام گویا وبسایت cloudmqtt از حالت رایگان دراومده و پولی شده،سرویس دهنده دیگه ای رو میشناسین که مثل این وبسایت باشه و شماهم باهاش کار مرده باشین؟ممنون میشم راهنمایی کنین
از نوشته هاتون لذت میبرم با تشکر
سلام دوست عزیز
ممنونم – نظر لطف شماست 🙂
من از سرویس ایکلیپس استفاده کردم:
https://www.eclipse.org/
سرور ایرانی mqtt داریم ؟؟؟؟؟
نه واقعا من چیزی پیدا نکردم اگر پیدا کردید ممنون میشم اینجا اطلاع بدید که بقیه هم بتونن استفاده کنند
خیلی ممنون از مطالب عالیتون
من از سرویس adafruit استفاده کردم و خیلی خوب جواب داد. برای دسترسی به سرویسشون میتونید از این آدرس استفاده کنید:
https://io.adafruit.com
تو این دو تا لینک هم میتونید اطلاعات کاملی در رابطه با راه اندازی این سرویس پیدا کنید:
https://learn.adafruit.com/adafruit-io-basics-dashboards/overview
https://www.electronicwings.com/nodemcu/nodemcu-mqtt-client-with-arduino-ide
سلام ممنون بابت اطلاعات مفیدتون
ممنونم .
من سایت شما رو همیشه دنبال میکنم
ممنون از شما
ممنون از مطلب عالی تون
خواهش میکنم دوست عزیز 🙂
درود
من کدهای مربوط به ارتباط با hivemq رو توسط کتابخانه pubsubclient روی esp8266 آپلود کردم اما به سرور کانکت نمیشه و این خطا رو همش میده
attempting mqtt connection…failed rc=-2
من فکر کنم hivemq فقط روی بعضی از آی پی ها و بعضی از isp ها جواب میده یا شاید dns رو باید عوض کرد
سلام دوست عزیز
من از این کتابخونه استفاده نکردم ولی ممکنه آدرس Ip یا Port رو اشتباه وارد کرده باشید که این اتفاق می افته
توی برنامه داریم که سمپل کد قرار بدیدم
درود
میشه یه کد آردوینو برای esp8266 واسه این کار قرار بدین روی سایت
با تشکر
در حال آماده کردن نمونه کد برای ارتباط با Broker هستیم
البته فکر میکنم نمونه کد برای GSM قرار بدهیم ولی سعی خواهیم کرد که با استفاده از Esp8266 نیز کد قرار بدهیم
سلام
ممنون بابت توضیحات کامل پروتکل
از این سه تا براکر که معرفی کردین، من فقط تونستم اکانت cloudmqtt رو بسازم و باهاش ارتباط برقرار کنم(الان محدودیت اتصال 5 دستگاه همزمان گذاشته)
چطور میتونم اکانت hivemq رو بسازم؟
havemq رایگانه و نیازی به ساخت اکانت نداره یوزر و پسورد و خالی بذارید و کانکت بشه همه چی اوکیه 🙂
البته Eclipse هم همینطوره و رایگانه کاملا
با این سیستم، topic رو چطور باید بسازیم؟
با عضو شدن !
یعنی اگر تو تاپیکی که موجود نیست شما سعی کنید که عضو بشید ، به صورت اوتوماتیک اون تاپیک ساخته میشه به همین سادگی
سلام و خداقوت
اگه میشه در مورد چگونگی استفاده از برنامه mqtt-dash با سرویس hivemq یه توضیح مختصری بدید
من هرکار کردم و ادرس بروکر و سایر پارامترها را دادم متصل نش
البته user و pass را خالی گذاشتم
ممنون
خالی گذاشتن یوزر و پسورد اوکیه !
آیپی و پسورد رو چی گذاشتید ؟
به جای آیپی یا آدرس باید broker.hivemq.com بنویسید و به جای پورت هم باید 1883 بذارید
همین الان وارد کردم به خوبی کانکت شدم 🙂
ممنون ip را اشتباه زده بودم
خواهش میکنم دوست عزیز