اتصال کلاینت به بروکر در پروتکل MQTT (جلسه چهارم)

تاریخ انتشار : 2020/07/28

اهداف

در جلسه قبل با کلاینت و بروکر در پروتکل MQTT آشنا شدیم. دیدیم که یک کلاینت می تواند هر دستگاهی باشد که از طریق کتابخانه های MQTT به یک بروکر متصل می شود. بروکر نیز قلب تپنده الگوی انتشار-اشتراک در پروتکل MQTT به شمار می رود. بروکر وظیفه دریافت کلیه پیام ها، فیلتر کردن پیام ها، تعیین اینکه کدام کلاینت به چه تاپیکی سابسکرایب کرده و ارسال پیام به کلاینت های مرتبط را بر عهده دارد. در این جلسه اتصال کلاینت به بروکر در پروتکل MQTT را بررسی خواهیم کرد.

 

اتصال MQTT

پروتکل MQTT بر اساس TCP/IP می باشد. هر دوی کلاینت و بروکر نیازمند یک پشته TCP/IP هستند.

MQTT protocol based on TCP_IP

 

اتصال MQTT همیشه بین یک کلاینت و بروکر است. کلاینت ها هرگز به طور مستقیم به یکدیگر متصل نمی شوند. برای شروع یک اتصال، کلاینت یک پیام CONNECT را به بروکر ارسال کرده و بروکر با یک پیام CONNACK و یک کد وضعیت پاسخ می دهد. پس از برقراری اتصال، بروکر تا زمانی که کلاینت دستور قطع اتصال را بفرستد یا اتصال قطع شود، اتصال را باز نگه می دارد.

MQTT Connect and connack

 

اتصال MQTT از طریق مترجم آدرس شبکه (NAT)

در اغلب اوقات، کلاینت ها پشت یک روتر (مودم) قرار دارند که از یک مترجم آدرس شبکه (NAT) برای ترجمه آدرس شبکه خصوصی (مانند ۱۹۲٫۱۶۸٫x.x، ۱۰٫۰٫xx) به یک آدرس عمومی استفاده می کنند. همانطور که قبلاً نیز اشاره کردیم، کلاینت MQTT با ارسال پیام CONNECT به بروکر اتصال را آغاز می کند. از آنجایی که بروکر دارای آدرس عمومی است (همانند بروکر تست test.mosquitto.org) و اتصال را جهت ارسال و دریافت پیام های دو طرفه (پس از اتصال اولیه) باز نگه می دارد، به هیچ وجه با کلاینت هایی که در پشت مترجم آدرس شبکه قرار دارند مشکلی ایجاد نمی شود.

 

کلاینت ها اتصال به بروکر را با یک پیام CONNECT آغاز می کنند

برای شروع یک اتصال، کلاینت یک پیام فرمان به بروکر ارسال می کند. اگراین پیام CONNECT ناقص باشد (طبق مشخصات MQTT) یا زمان زیادی بین باز کردن سوکت شبکه و ارسال پیام اتصال گذشته باشد، بروکر اتصال را می بندد. این عمل باعث میشود از اتصال کلاینت های مخرب که باعث کند شدن بروکر می شوند جلوگیری شود. یک کلاینت مطلوب پیام CONNECT را با گزینه های نشان داده شده در شکل زیر به بروکر ارسال می کند. 

MQTT clent options

 

همانطور که در شکل بالا می بینید، برخی از گزینه ها اختیاری بوده و برای اتصال به بروکر نیاز نیست این گزینه ها در پیام CONNECT ارسال شوند. در ادامه برخی از مهم ترین گزینه ها را بررسی می کنیم.

 

شناسه کلاینت (clientID)

شناسه کلاینت برای تمایز بین کلاینت های متصل به بروکر استفاده می شود. بروکر از طریق این گزینه کلاینت های متصل به خود و وضعیت فعلیشان را تشخیص می دهد. واضح است که این شناسه برای هر کلاینت باید منحصر به فرد باشد. در پروتکل MQTT ورژن ۳٫۱٫۱ می توان شناسه کلاینت را خالی فرستاد. در این حالت، یک اتصال بدون وضعیت ایجاد می شود. از طرفی، برای ارسال پیام اتصال با شناسه کلاینت خالی، می بایست پرچم (فلگ) cleanSession بالا (true) باشد در غیر این صورت بروکر اتصال را رد خواهد کرد.

 

کلین سشن (cleanSession)

گزینه cleanSession مقدار بولین true و false داشته و به بروکر می گوید آیا کلاینت خواهان یک اتصال مداوم است یا خیر. اگر مقدار این گزینه برابر با false باشد (cleanSession = false)، بروکر تمام پیام های سابسکرایب شده و پیام های از دست رفته (با کیفیت خدمات برابر ۱ یا ۲) برای کلاینت را ذخیره خواهد کرد. اگر اتصال مدوام نباشد (cleanSession = true)، بروکر هیچ پیامی برای کلاینت ذخیره نکرده و اطلاعات اتصال مداوم قبلی را هر بار پاک خواهد کرد.

 

نام کاربری/پسوورد (username/password)

پروتکل MQTT می تواند از گزینه نام کاربری/پسوورد برای اعتبارسنجی کلاینت ها استفاده کند. البته چنانچه در قسمت های قبل نیز اشاره شد، استفاده از این گزینه برای ایجاد اتصال در پروتکل MQTT ضروری نیست با این حال برای کاربردهای تجاری واضح است که استفاده از این گزینه بسیار ضروری می باشد. 

 

پیام لست ویل (Will Message)

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

 

کیپ الایو (Keep Alive)

گزینه keep alive یک فاصله زمانی بر واحد ثانیه بوده و بیشترین مقدار زمانی است که کلاینت و بروکر می توانند بدون ارسال هیچ پیامی در اتصال باقی بمانند. مقدار این گزینه (بر حسب ثانیه) کلاینت را متعهد می کند که در این بازه زمانی پیام درخواست PING را به بروکر ارسال کند. بروکر نیز یک پیام پاسخ PING به کلاینت ارسال می کند. این روش اجازه می دهد هر دو سمت (کلاینت و بروکر) از در دسترس بودن طرف مقابل اطمینان حاصل کنند. 

 

به طور کلی، موارد یاد شده تمام اطلاعاتی است که شما نیاز دارید از یک کلاینت به یک بروکر  MQTT متصل شوید. کتابخانه های فردی اغلب گزینه های اضافی دارند که می توانید آنها را پیکربندی کنید.

 

پاسخ بروکر با یک پیام CONNACK

وقتی بروکر یک پیام CONNECT دریافت می کند، موظف است با یک پیام CONNACK به این درخواست پاسخ دهد. پیام CONNACK شامل دو قسمت است:

  • پرچم session فعلی
  • پرچم اذعان اتصال

 

پرچم session فعلی

این گزینه به کلاینت می گوید که آیا session مداوم در دسترسی از تعاملات قبلی با همان کلاینت وجود دارد یا خیر. وقتی کلاینت با clean session برابر با true متصل می شود، مقدار این گزینه همیشه برابر با false خواهد بود زیرا هیچ session در دسترسی وجود ندارد. حال اگر کلاینت با clean session برابر با false متصل شود، دو احتمال وجود دارد: اگر اطلاعات session برای شناسه کاربر وجود داشته و بروکر اطلاعات session را ذخیره کرده باشد، مقدار این گزینه برابر با true خواهد بود. در غیر این صورت مقدار این گزینه برابر با false خواهد بود. این گزینه در پروتکل MQTT نسخه ۳٫۱٫۱ اضافه شد تا کلاینت ها بدانند آیا نیاز است به تاپیک های مورد نظرشان دوباره سابسکرایب کنند یا اطلاعات هنوز در session ذخیره شده اند. 

 

پرچم اذعان اتصال

دومین پرچم در پیام CONNACK پرچم اتصال اذعان است. این پرچم حاوی یک کد بازگشت است که به مشتری می گوید که آیا تلاش برای اتصال موفقیت آمیز بوده است یا خیر.

MQTT CONNACK

 

معنی کدهای برگشتی به صورت زیر است:

کد بازگشتی معنی کد بازگشتی
۰ اتصال پذیرفته شد
۱ اتصال رد شد (نسخه پروتکل غیرقابل قبول)
۲ اتصال رد شد (رد شناسه کلاینت)
۳ اتصال رد شد (سرور در دسترس نیست)
۴ اتصال رد شد (نام کاربری/پسوورد غیرمجاز)
۵ اتصال رد شد (رد تایید اعتبار)

 

 

نتیجه گیری

در این جلسه اتصال کلاینت به بروکر در پروتکل MQTT را بررسی کردیم. فهمیدیم که برای ایجاد اتصال لازم است کلاینت یک درخواست اتصال با ویژگی هایی همچون شناسه کلاینت، نام کاربری/پسوورد، cleanSession، will message و … به بروکر ارسال کند. بروکر بعد از بررسی وضعیت هر یک از این ویژگی ها یک پاسخ با دو محتوا شامل sessionPresent و returnCode به کلاینت ارسال می کند که شامل پذیرش اتصال یا رد اتصال می باشد. در جلسه آینده با انتشار، اشتراک و لغو اشتراک در پروتکل MQTT آشنا خواهیم شد. با ما همراه باشید.

برخی از مشتریان

لوگو شریف
لوگو آمد
لوگو شهرداری تهران
لوگو دانشگاه تهران
لوگو ساتکاپ
لوگو دانشگاه ارومیه
logofa