پروتکل MQTT
پروتکل 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 کنیم.
sensors/temperature/home/kitchen
همانطورکه مشاهده میکنید بااستفادهاز “/” میتوان ساختار درختی به آدرس Topic داد. آدرس هر تاپیک توسط سنسور ایجاد میشود و چیزی نیست که به شکلخاصی باشد یا چهارچوب خاصی داشتهباشد. حال فرضکنید میخواهید میانگین دمای خانه را بهدستآورید، در هر اتاق یک سنسور نصب میکنید، همه سنسورها دادهها را به براکر ارسال میکنند. شما برای محاسبه دمای میانگین نیاز دارید که دمای تکتک سنسورها را داشتهباشید، خوب یک راهحل این است که در همه Topicها subscribe کنید یا از آدرسزیر استفادهکنید:
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 را هم به شکلساده و هم به شکل رمزگذاریشده پشتیبانی میکند. البته این سرویس خدمات را بهصورت کاملاً رایگان عرضه نمیکند و تا اتصال ۱۰ دستگاه بهصورت رایگان عمل میکند و برای اتصال دستگاههای بیشتر نیازبه خرید اکانت وجود دارد. برای اطلاعات بیشتر به سایت cloudmqtt.com مراجعه کنید.
HiveMQ
HiveMQ از بازیگران جدید حوزه IOT است و درمدتیکه معرفیشده محبوبیت بالایی کسبکردهاست. سرویس HiveMQ خدمات رایگانی در حوزه MQTT عرضه میکند که از کیفیت و سرعت بالایی نیز برخوردار است. باقی سرویسهای موجود برروی سایت قابلخریداری است ولی سرویس MQTT رایگان است. برای جزئیات درخصوص این براکر به این آدرس مراجعهکنید. ما از خدمات این سرویسدهنده برای طراحی دستگاه استفادهکردیم. ولی فرقی نمیکند از کدام سرویسدهنده استفادهکنید و بهراحتی با تغییر آدرس در سورس برنامه قادر خواهیدبود که آدرس براکر را به آدرسدلخواه تغییربدهید.
منبع: سیسوگ