اینترنت اشیاء, توصیه شده, معرفی, مقاله

پروتکل MQTT  چگونه کار می‌کند؟

Mqtt

پروتکل MQTT  یک پروتکل ساده است که بر روی بستر TCP/IP سوار شده است و انتقال اطلاعات را بر اساس Socket انجام می دهد، هدر های مورد استفاده در MQTT حجم خیلی کمی دارند و این امر باعث کاهش حجم ترافیک در تبادلات شده و هم چنین باعث سادگی پروتکل می‌شود، اما اغلب سورس های موجود برای پروتکل MQTT بر بستر شبکه LAN و برای PC نوشته شده اند، که پورت کردن آن برای میکروکنترلر و شبکه GSM امری زمانبر و مستلزم درک کامل نحوه کارکرد و آشنایی با زیرساخت های شبکه است. در این آموزش سعی داریم که نحوه کار کرد پروتکل MQTT را به شکل ساده و با مثال های قابل لمس شرح دهیم و توضیح دهیم که چرا پروتکل MQTT یک پروتکل مناسب برای استفاده در Iot ( چیزنت یا اینترنت اشیاء ) است و در ادامه چند Broker معروف را که خدمات رایگان ارائه میدهند را معرفی میکنیم ؛ پس با سیسوگ همراه باشید.

پروتکل MQTT چطور کار می کند

معمولاً پروتکل های اینترنتی نیاز به یک سرور واحد دارند که داده های ارسالی و دریافتی را پردازش و ذخیره می‌کند، اما در پروتکل 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

حال که با کلیت MQTT و نحوه کارکرد آن آشنا شدیم، برای استفاده از آن لازم است که ساختار آدرس دهی Topic ها را دریابم، در MQTT  آدرس دهی مثل آدرس دهی پوشه ها در سیستم عامل لینوکس است که به صورت درختی است.

برای روشن شدن هرچه بیشتر موضوع به مثال زیر دقت کنید.

فرض کنید قصد داریم اطلاعات دمای یک سنسور که در آشپزخانه نصب شده است را مشاهده کنیم، برای این کار کافی است مثلاً در آدرس زیر subscribe کنیم.

 

 

همانطور که مشاهده می کنید با استفاده از “/” میتوان ساختار درختی به آدرس Topic داد. آدرس هر تاپیک توسط سنسور ایجاد می شود و چیزی نیست که به شکل خاصی باشد یا چهارچوب خاصی داشته باشد.

حال فرض کنید می خواهید میانگین دمای خانه را به دست آورید، در هر اتاق یک سنسور نصب می کنید، همه سنسور ها داده ها را به براکر ارسال می کنند. شما برای محاسبه دمای میانگین نیاز دارید که دمای تک تک سنسور ها را داشته باشید، خوب یک راه حل این است که در همه Topic ها subscribe کنید یا از آدرس زیر استفاده کنید:

 

آدرس فوق داده های تمام سنسورهای دمای نصب شده در خانه را به نمایش در می آورد، # در واقع باعث می شود که براکر تمام زیر Topic های مربوطه را برای ما ارسال کند.

Qos در MQTT

Qos در MQTT

یکی دیگر از مفاهیم MQTT  بحث Quality of Service یا به اختصار QoS می باشد، در واقع QoS کمک میکند که بتوانیم نحوه ارسال پیام ها را مدیریت کنیم.

فرض کنید سنسوری دارید که دمای مکانی را قرائت می کند و به براکر ارسال می‌کند، خوب ممکن است دمای آن نقطه خیلی مهم نباشد و اگر مقداری از داده ها به دلیل قطع شدن ارتباط از دست بروند، چندان اهمیتی نداشته باشند و بتوان از آنها چشم پوشی کرد.

حال ممکن است بخواهید دمای یک کوره را منتقل کنید، در این حالت تمام داده ها از اهمیت خیلی بالایی برخوردار هستند و از دست رفتن داده میتواند خطرات زیادی به همراه داشته باشد! پس از QoS دیگری در ارسال داده ها استفاده می کنند که احتمال از بین رفتن و یا گم شدن اطلاعات در آنها خیلی پایین است.

در پروتکل MQTT سه حالت QoS وجود دارد که به ترتیب از ساده ترین حالت تا پیچیده ترین حالت به شرح زیر هستند:

 

QoS Level 0

مدل QoS 0 در پروتکل MQTT

 QoS Level 0 که به اختصار QoS0 هم نوشته می شود، ساده ترین حالت برقراری ارتباط با broker است که نیازی به acknowledgment  ندارد، بدین معنی که، به این موضوع که پیام شما توسط Broker دریافت شود یا نشود اهمیتی نمی دهد. همین که Ack شبکه TCP را دریافت کند ملاک را بر ارسال پیام می گذارد و پیام را از لیست ارسال حذف می‌کند. در این روش اگر فرض کنیم کانکشن قطع شده باشد و هنوز اینتراپت آن به دستگاه نرسیده باشد، ممکن است بخشی از داده های ارسالی هیچ وقت به براکر نرسند. در ارتباطات ساده این روش قابل قبول است چرا که حجم مصرفی داده کمی دارد.

QoS Level 1

مدل QoS 1 در پروتکل MQTT

QoS Level 1 به اختصار QoS1 هم نوشته می شود. در این حالت دستگاه مطمئن می شود که حداقل پیام یک بار توسط Broker دریافت می شود. به این صورت که Broker پس از دریافت پیام، یک پیام PUBACK به دستگاه ارسال می‌کند و دستگاه با دریافت PUBACK مطمئن می شود پیام به Broker رسیده است و پیام را از صف ارسال خارج می‌کند. به هر دلیلی که پیام PUBACK دریافت نشود، برنامه مجدداً بسته را ارسال خواهد کرد و این کار تا وقتی که پیام توسط براکر دریافت شود ادامه خواهد یافت.

QoS Level 2

 

مدل QoS 2 در پروتکل MQTT

QoS Level 2 به اختصار QoS2 هم نوشته می شود. در این حالت دستگاه ارسال کننده مطمئن می شود که پیام تنها یک بار توسط یک subscribe  دریافت شده است نه بیشتر. به این طریق در محل های حساس می شود مطمئن شد که دستگاه پردازنده اطلاعات، داده های ارسالی را دریافت کرده است. در این روش ترافیک زیادتری بین دستگاه و براکر رد و بدل می شود تا این اطمینان ایجاد شود که داده های ارسالی فقط یک بار توسط عضو ها دریافت می شود نه تعداد بیشتری.

 

Broker چیست 

Broker

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

اما راه دیگری نیز وجود دارد، استفاده از براکرهای رایگان، که این سرویس را به صورت رایگان در اختیار کاربر قرار می دهند و هیچ نیازی به انجام عملیاتی برای استفاده وجود ندارد.

در ادامه به چند نمونه از این براکر ها اشاره خواهیم کرد.

 

 

 

Eclipse IOT

Eclipse IOT

قطعاً نام Eclipse برایتان آشنا خواهد بود. اگر سعی کرده باشید برنامه ای بسازید، Eclipse یکی از معروف ترین IDE موجود برای برنامه سازی در زبان های مختلف است که توسط شرکت IBM ایجاد شده است. ابتدا از Eclipse برای برنامه نویسی Java استفاده می شد ولی با گذشت زمان تقریباً تمام زبان های برنامه نویسی رویج را پشتیبانی کرد.

اما Eclipse در حوزه IDE متوقف نشده و با توجه به رشد روز افزون دستگاه های IOT وارد عرصه شده است و در حال ارائه خدمات IOT می باشد. براکر IOT ایجاد شده توسط Eclipse از دو پروتکل MQTT  و CoAP پشتیبانی می‌کند و کاربر بدون هیچ هزینه ای می تواند از خدمات آن استفاده کند. این براکر علاوه بر ارتباط ساده از ارتباط رمزگذاری شده TLS هم می تواند بهره ببرد، با استفاده از TLS داده ها بین بروکر و دستگاه رمزگذاری می شود که امنیت بالاتری را برای اطلاعات تأمین می‌کند.

برای اطلاعات بیشتر به سایت iot.eclipse.org  مراجعه کنید.

 

Cloud MQTT

Cloud MQTT

یکی دیگر از سرویس های محبوب IOT سرویس Cloud MQTT می باشد. این براکر از سرویس های ابری آمازون استفاده می‌کند و پروتکل های MQTT را هم به شکل ساده و هم به شکل رمزگذاری شده پشتیبانی می‌کند. البته این سرویس خدمات را به صورت کاملاً رایگان عرضه نمی‌کند و تا اتصال 10 دستگاه به صورت رایگان عمل می‌کند و برای اتصال دستگاه های بیشتر نیاز به خرید اکانت وجود دارد.

برای اطلاعات بیشتر به سایت cloudmqtt.com مراجعه کنید.

 

HiveMQ

HiveMQ

HiveMQ از بازیگران جدید حوزه IOT است و در مدتی که معرفی شده محبوبیت بالایی کسب کرده است. سرویس HiveMQ خدمات رایگانی در حوزه MQTT عرضه می‌کند که از کیفیت و سرعت بالایی نیز برخوردار است. باقی سرویس های موجود بر روی سایت قابل خریداری است ولی سرویس MQTT رایگان است.

برای جزئیات در خصوص این براکر به این آدرس مراجعه کنید.

ما از خدمات این سرویس دهنده برای طراحی دستگاه استفاده کردیم. ولی فرقی نمی‌کند از کدام سرویس دهنده استفاده کنید و به راحتی با تغییر آدرس در سورس برنامه قادر خواهید بود که آدرس براکر را به آدرس دلخواه تغییر بدهید.

نوشته های مشابه

12 دیدگاه در “پروتکل MQTT  چگونه کار می‌کند؟

  1. محمد گفت:

    درود
    من کدهای مربوط به ارتباط با hivemq رو توسط کتابخانه pubsubclient روی esp8266 آپلود کردم اما به سرور کانکت نمیشه و این خطا رو همش میده
    attempting mqtt connection…failed rc=-2

    من فکر کنم hivemq فقط روی بعضی از آی پی ها و بعضی از isp ها جواب میده یا شاید dns رو باید عوض کرد

    1. زئوس Zeus زئوس Zeus گفت:

      سلام دوست عزیز
      من از این کتابخونه استفاده نکردم ولی ممکنه آدرس Ip یا Port رو اشتباه وارد کرده باشید که این اتفاق می افته
      توی برنامه داریم که سمپل کد قرار بدیدم

  2. محمد گفت:

    درود
    میشه یه کد آردوینو برای esp8266 واسه این کار قرار بدین روی سایت
    با تشکر

    1. زئوس Zeus زئوس Zeus گفت:

      در حال آماده کردن نمونه کد برای ارتباط با Broker هستیم
      البته فکر میکنم نمونه کد برای GSM قرار بدهیم ولی سعی خواهیم کرد که با استفاده از Esp8266 نیز کد قرار بدهیم

  3. مسعود رضاپور گفت:

    سلام
    ممنون بابت توضیحات کامل پروتکل
    از این سه تا براکر که معرفی کردین، من فقط تونستم اکانت cloudmqtt رو بسازم و باهاش ارتباط برقرار کنم(الان محدودیت اتصال 5 دستگاه همزمان گذاشته)
    چطور میتونم اکانت hivemq رو بسازم؟

    1. زئوس Zeus زئوس Zeus گفت:

      havemq رایگانه و نیازی به ساخت اکانت نداره یوزر و پسورد و خالی بذارید و کانکت بشه همه چی اوکیه 🙂
      البته Eclipse هم همینطوره و رایگانه کاملا

      1. مسعود رضاپور گفت:

        با این سیستم، topic رو چطور باید بسازیم؟

        1. زئوس Zeus زئوس Zeus گفت:

          با عضو شدن !
          یعنی اگر تو تاپیکی که موجود نیست شما سعی کنید که عضو بشید ، به صورت اوتوماتیک اون تاپیک ساخته میشه به همین سادگی

  4. علی کریمی گفت:

    سلام و خداقوت
    اگه میشه در مورد چگونگی استفاده از برنامه mqtt-dash با سرویس hivemq یه توضیح مختصری بدید
    من هرکار کردم و ادرس بروکر و سایر پارامترها را دادم متصل نش
    البته user و pass را خالی گذاشتم
    ممنون

    1. زئوس Zeus زئوس Zeus گفت:

      خالی گذاشتن یوزر و پسورد اوکیه !
      آیپی و پسورد رو چی گذاشتید ؟
      به جای آیپی یا آدرس باید broker.hivemq.com بنویسید و به جای پورت هم باید 1883 بذارید
      همین الان وارد کردم به خوبی کانکت شدم 🙂

      1. علی کریمی گفت:

        ممنون ip را اشتباه زده بودم

        1. زئوس Zeus زئوس Zeus گفت:

          خواهش میکنم دوست عزیز

دیدگاهتان را بنویسید

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