انتشار، اشتراک و لغو اشتراک در پروتکل MQTT (جلسه پنجم)

تاریخ انتشار : 2020/08/01

اهداف

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

Publish, Subscribe & Unsubscribe in mqtt

 

انتشار (Publish)

کلاینت MQTT می تواند به محض اتصال به یک بروکر پیام ها را منتشر کند. MQTT از فیلترینگ مبتنی بر تاپیک پیام ها در بروکر استفاده می کند (برای جزئیات بیشتر به جلسه انتشار-اشتراک در پروتکل MQTT مراجعه کنید). از این طریق، هر پیام باید حاوی یک تاپیک باشد که بروکر می تواند از آن برای فهم اینکه کدام پیام برای کدام کلاینت است استفاده کند. به طور معمول، هر پیام دارای یک payload است که شامل داده هایی است که می تواند در قالب بایت منتقل شوند. کلاینت ها می توانند انتخاب کنند که پیام payload از چه نوعی باشد. برای مثال نوع داده payload می تواند یک رشته (String)، باینری و یا از نوع جیسون (JSON) باشد. یک پیام عمومی در پروتکل MQTT دارای چندین ویژگی است که در ادامه آنها را بررسی خواهیم کرد.

Publish details in MQTT

 

نام تاپیک (topicName)

در پروتکل MQTT، نام تاپیک به یک رشته UTF-8 اشاره دارد که بروکر برای فیلتر کردن پیام برای هر کلاینت متصل به آن استفاده می کند. این نام یک ساختار سلسله مراتبی داشته و با جداکننده “/” ساختار می یابد. برای مثال: “myhome/livingroom/temperature” یا Iran/Tehran/Octoberfest/people”. 

 

کیفیت خدمات (QoS)

مقدار این شاخص سطح کیفیت خدمات پیام را نشان می دهد. در کل سه سطح کیفیت خدمات در پروتکل MQTT وجود دارد: صفر، یک و دو. سطح کیفیت خدمات تعیین می کند چه نوع تضمینی برای رسیدن پیام به کلاینت ها یا بروکر وجود دارد. برای مثال، کیفیت خدمات صفر (QoS=0) هیچ تضمینی را برای رسیدن پیام به کلاینت/بروکر ایجاد نمی کند. کیفیت خدمات یک (QoS=1) تضمین می کند پیام حداقل یک بار تحویل داده می شود. کیفیت خدمات دو (QoS=2) هم تضمین می کند پیام فقط و فقط یک بار تحویل داده می شود. 

 

پرچم ریتین (retainFlag)

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

 

پی لود (payload)

محتوای اصلی پیام در این ویژگی ذخیره می گردد. ارسال تصاویر، متن، داده رمزگذاری شده و تقریباً هر داده باینری از طریق این ویژگی امکان پذیر است.

 

شناسه بسته (packetID)

شناسه بسته به طور منحصر به فرد هر پیام را در جریان ارسال پیام بین کلاینت و بروکر تعیین می کند. شناسه بسته فقط برای کیفیت خدمات بالاتر از صفر کاربرد دارد. کتابخانه های کلاینت/بروکر مسئول تنظیمات این ویژگی در پروتکل MQTT می باشند. 

 

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

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

 

اشتراک (Subscribe)

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

 

شناسه بسته

شناسه بسته به طور منحصر به فرد هر پیام را در جریان ارسال پیام بین کلاینت و بروکر تعیین می کند. شناسه بسته فقط برای کیفیت خدمات بالاتر از صفر کاربرد دارد. کتابخانه های کلاینت/بروکر مسئول تنظیمات این ویژگی در پروتکل MQTT می باشند. 

 

لیست اشتراک ها

یک پیام اشتراک می تواند لیستی از چندین اشتراک برای یک کلاینت باشد. برای مثال اشتراک در تاپیک مربوط به دما، اشتراک در تاپیک مربوط به رطوبت، وضعیت درب وغیره. هر اشتراک حاوی یک تاپیک و یک سطح کیفیت خدمات می باشد. 

 

پیام Suback

برای تأیید هر اشتراک، بروکر یک پیام تأیید SUBACK را به کلاینت ارسال می کند. این پیام شامل شناسه بسته پیام اصلی مشترک (برای مشخص شدن پیام) و لیستی از کدهای برگشتی است.

 

شناسه بسته

شناسه بسته یک شناسه منحصر به فرد است که برای شناسایی پیام استفاده می شود. این شناسه همانند شناسه بسته در Subscribe است.

 

کد بازگشتی

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

پیام بازگشتی معنی پیام
۰ تایید اشتراک (حداکثر کیفیت خدمات ۰)
۱ تایید اشتراک (حداکثر کیفیت خدمات ۱)
۲ تایید اشتراک (حداکثر کیفیت خدمات ۲)
۱۲۸ رد اشتراک

 

MQTT Suback

 

لغو اشتراک (Unsubscribe)

همانند پیام اشتراک (Subscribe) یک پیام لغو اشتراک (Unsubscribe) نیز وجود دارد. این پیام، اشتراک های یک کلاینت را بر روی تاپیک های مورد نظر در بروکر حذف می کند. این پیام نیز همانند پیام اشتراک حاوی شناسه بسته و لیست اشتراک ها است:

MQTT Unsubscribe

 

شناسه بسته (packetID)

شناسه بسته به طور منحصر به فرد هر پیام را در جریان ارسال پیام بین کلاینت و بروکر تعیین می کند. شناسه بسته فقط برای کیفیت خدمات بالاتر از صفر کاربرد دارد. کتابخانه های کلاینت/بروکر مسئول تنظیمات این ویژگی در پروتکل MQTT می باشند. 

 

لیست تاپیک ها

لیست تاپیک ها شامل تاپیک هایی است که کلاینت می خواهد اشتراک از آنها را لغو کند. در اینجا، نیازی به ارسال کیفیت خدمات (QoS) نبوده و بروکر فارغ از سطح کیفیت خدمات، اشتراک کلاینت را از تاپیک های مورد نظر لغو می کند. 

 

پیام Unsuback

برای تایید پیام لغو اشتراک، بروکر یک پیام Unsuback به کلاینت ارسال می کند. این پیام فقط حاوی شناسه بسته پیام اصلی UNSUBSCRIBE برای مشخص کردن پیام است.

MQTT Unsuback

 

شناسه بسته

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

Unsubscribe and Unsuback

پس از دریافت پیام Unsuback از بروکر، کلاینت میتواند مطمئن باشد که اشتراک از تاپیک های مورد نظر لغو شده است.

 

نتیجه گیری

در این جلسه با انتشار، اشتراک و لغو اشتراک در پروتکل MQTT آشنا شدیم. در جلسه آینده به طور مفصل در رابطه با تاپیک ها در پروتکل MQTT بحث خواهیم کرد. با ما همراه باشید…

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

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