عیبیابی
عیبیابی اتصال MQTT: چرا دستگاه وصل نمیشود؟
۱۰ آبان ۱۴۰۵۶ دقیقه مطالعه
رایجترین دلیلهای رد شدن اتصال یا قطع شدن ناگهانی دستگاه در mqttcloud.ir و راه حل هر کدام، بهعلاوه چند عادت ساده برای امن نگه داشتن دستگاهها.
اتصال با خطای «غیرمجاز» رد میشود#
در MQTT 3.1.1 بروکر برای همه دلیلهای رد احراز هویت یک کد برمیگرداند: کد ۵ یا Not authorized (در PubSubClient مقدار state() برابر ۵). این موارد را به ترتیب بررسی کنید:
- نام کاربری و رمز عبور اکانت MQTT درست باشد. این همان ایمیل و رمز ورود به سایت نیست. اگر مطمئن نیستید، از داشبورد رمز جدید تعیین کنید.
- شناسه دستگاه (Client ID) دقیقاً همان نامی باشد که زیر همان اکانت ثبت کردهاید. شناسه ثبتشده زیر اکانت دیگر پذیرفته نمیشود. بسیاری از کتابخانهها اگر شناسه ندهید یک نام تصادفی میسازند که قطعاً رد میشود.
- تعداد اتصالهای همزمان اکانت به سقف نرسیده باشد. هر اکانت به اندازه سقف دستگاههای پلنتان اتصال همزمان دارد؛ اتصال مجدد با همان شناسه دو بار شمرده نمیشود.
- اکانت غیرفعال نشده باشد.
پاسخ سوالهای دیگر را در سوالات متداول پیدا میکنید.
دستگاه وصل میشود ولی بلافاصله قطع میشود#
- انتشار روی تاپیک خارج از فضای نام: اگر دستگاه روی تاپیکی منتشر کند که با
نامکاربری/شروع نمیشود، بروکر اتصال را قطع میکند. چک کنید تاپیکها پیشوند درست داشته باشند و/بعد از نام کاربری فراموش نشده باشد. - دو دستگاه با یک شناسه: اگر دو دستگاه یا دو برنامه با یک Client ID وصل شوند، اتصال جدید اتصال قبلی را بیرون میاندازد و این چرخه ادامه پیدا میکند. به هر کدام شناسه جدا بدهید.
- Keep-Alive: اگر حلقه برنامه (مثلاً
client.loop()در ESP32) مدت طولانی اجرا نشود، پینگ به موقع فرستاده نمیشود و بروکر اتصال را قطع میکند.
اتصال برقرار است ولی پیامی نمیرسد#
- اشتراک خارج از فضای نام (مثلاً روی
#) بدون قطع اتصال رد میشود؛ کد SUBACK را بررسی کنید یا ازalice/#استفاده کنید. - تاپیکها به حروف بزرگ و کوچک حساساند:
alice/Tempوalice/tempدو تاپیک متفاوتاند. - در صفحه «پیامها» داشبورد ببینید پیام اصلاً به بروکر رسیده یا نه؛ اگر رسیده، مشکل در سمت مشترک است.
خطای TLS#
- آدرس را دقیقاً
mqtt.mqttcloud.irبنویسید؛ گواهی برای همین نام صادر شده و اتصال با IP خطای تطابق نام میدهد. - روی ESP32 و بردهای مشابه، گواهی ریشه ISRG Root X1 را با
setCACertتنظیم کنید (نمونه کد کامل ESP32). - ساعت دستگاه باید درست باشد؛ با ساعت اشتباه، گواهی معتبر هم «منقضی» یا «هنوز معتبر نشده» دیده میشود.
نکات امنیتی#
- همیشه از پورت 8883 (TLS) استفاده کنید. روی پورت 1883 نام کاربری، رمز و پیامها رمزنگاری نمیشوند.
- برای هر پروژه یا محیط (مثلاً آزمایش و تولید، یا داشبورد وب) اکانت MQTT جدا بسازید؛ اگر یک رمز لو برود، فقط همان بخش در خطر است.
- رمز عبور طولانی و تصادفی انتخاب کنید و آن را در کد منبع یا مخزن گیت نگذارید.
- اگر احتمال میدهید رمز لو رفته، از داشبورد رمز جدید تعیین کنید و دستگاهها را با رمز جدید بهروز کنید.
- دستگاههایی را که دیگر استفاده نمیکنید از داشبورد حذف کنید تا شناسهشان قابل استفاده نباشد.
#عیبیابی#امنیت#MQTT
