تاپیک‌ها، QoS و پیام ماندگار در MQTT
آموزش

تاپیک‌ها، QoS و پیام ماندگار در MQTT

۹ آبان ۱۴۰۵۸ دقیقه مطالعه

ساختار تاپیک‌ها و وایلدکاردهای + و #، سه سطح QoS، پیام ماندگار، Keep-Alive و پیام وصیت در MQTT، همراه با قواعد تاپیک در mqttcloud.ir.

ساختار تاپیک#

تاپیک رشته‌ای سلسله‌مراتبی است که سطح‌هایش با / جدا می‌شوند، مثلاً alice/factory/line1/temp. تاپیک‌ها به حروف بزرگ و کوچک حساس‌اند و لازم نیست از قبل ساخته شوند؛ اولین انتشار روی هر تاپیک کافی است.

در mqttcloud.ir هر اکانت فضای نام خودش را دارد: همه تاپیک‌ها باید با نام کاربری اکانت و یک / شروع شوند. اگر نام کاربری شما alice باشد، alice/temp مجاز است ولی temp یا bob/temp مجاز نیست. به این ترتیب داده‌های هر اکانت از دیگران جداست.

وایلدکاردها#

هنگام اشتراک می‌توانید از دو وایلدکارد استفاده کنید:

  • + دقیقاً یک سطح را جایگزین می‌کند: alice/+/temp با alice/line1/temp و alice/line2/temp تطبیق دارد.
  • # همه سطح‌های بعدی را می‌گیرد و فقط در انتهای تاپیک می‌آید: alice/# همه پیام‌های اکانت alice را دریافت می‌کند.

وایلدکارد هم باید داخل فضای نام شما باشد. اشتراک روی # یا +/temp رد می‌شود (بروکر در پاسخ SUBACK کد خطای 0x80 برمی‌گرداند) اما اتصال دستگاه برقرار می‌ماند. وایلدکارد فقط در اشتراک معنا دارد و در انتشار مجاز نیست. اگر اتصال یا اشتراک رد شد، راهنمای عیب‌یابی اتصال را ببینید.

QoS: سطح تضمین تحویل#

  • QoS 0 (حداکثر یک بار): پیام فرستاده می‌شود و تأییدی گرفته نمی‌شود. سریع‌ترین حالت، مناسب داده‌های تکراری مثل دمای هر چند ثانیه.
  • QoS 1 (حداقل یک بار): فرستنده تا گرفتن تأیید پیام را دوباره می‌فرستد؛ ممکن است گیرنده پیامی را دو بار ببیند. برای بیشتر کاربردها انتخاب خوبی است.
  • QoS 2 (دقیقاً یک بار): با یک دست‌دهی چهارمرحله‌ای تکرار را هم حذف می‌کند؛ کندتر است و برای فرمان‌هایی مناسب است که اجرای دوباره‌شان مشکل ایجاد می‌کند.

بروکر هر سه سطح را پشتیبانی می‌کند. QoS نهایی هر پیام برای یک مشترک، کمترین مقدار بین QoS انتشار و QoS اشتراک است.

پیام ماندگار (Retained)#

اگر پیامی با پرچم retain منتشر شود، بروکر آخرین پیام آن تاپیک را نگه می‌دارد و هر مشترک جدید بلافاصله پس از اشتراک آن را دریافت می‌کند. این برای وضعیت‌هایی مثل «روشن/خاموش» یا آخرین تنظیمات عالی است.

برای پاک کردن پیام ماندگار یک تاپیک، یک پیام خالی با پرچم retain روی همان تاپیک منتشر کنید.

پیام‌های ماندگار در حافظه بروکر نگه داشته می‌شوند و با راه‌اندازی مجدد بروکر پاک می‌شوند؛ آن‌ها را جایگزین پایگاه داده نکنید و دستگاه‌ها را طوری بنویسید که پس از اتصال مجدد وضعیت خود را دوباره منتشر کنند.

Keep-Alive و پیام وصیت (Last Will)#

Keep-Alive فاصله‌ای (به ثانیه) است که کلاینت هنگام اتصال اعلام می‌کند. اگر در این مدت پیامی رد و بدل نشود، کلاینت یک پینگ می‌فرستد؛ اگر بروکر حدود یک‌ونیم برابر این زمان چیزی از دستگاه دریافت نکند، اتصال را مرده تلقی می‌کند. مقدار ۳۰ تا ۶۰ ثانیه برای بیشتر دستگاه‌ها مناسب است.

پیام وصیت پیامی است که دستگاه هنگام اتصال به بروکر می‌سپارد و بروکر فقط وقتی منتشرش می‌کند که اتصال به‌صورت ناگهانی قطع شود (مثلاً قطع برق). ترکیب رایج: هنگام اتصال online را با retain منتشر کنید و پیام وصیت را offline با retain روی همان تاپیک تنظیم کنید. تاپیک پیام وصیت هم باید داخل فضای نام شما باشد.

#MQTT#QoS#تاپیک