MQTT — kichik xabarlarni kam bandwidthli yoki beqaror tarmoqlarda uzatishga mo‘ljallangan publish/subscribe protokoli. U IoT qurilmalari, sensorlar, mobil ilovalar va telemetriya tizimlarida keng qo‘llanadi.
MQTTda xabar yuboruvchi va qabul qiluvchi bir-biriga bevosita ulanmaydi. Ular markaziy broker orqali muloqot qiladi.
Protokol sarlavhasi kichik bo‘lib, resursi cheklangan qurilmalarga mos. MQTT odatda TCP ustida ishlaydi.
Publish/subscribe modeli
MQTTda uchta asosiy rol mavjud.
Publisher
Xabar yaratadi va ma’lum topicga yuboradi.
Subscriber
Bir yoki bir nechta topicga obuna bo‘ladi va mos xabarlarni oladi.
Broker
Client ulanishlarini qabul qiladi, topic obunalarini saqlaydi va xabarlarni kerakli subscriberlarga tarqatadi.
Publisher subscriberning IP manzilini bilishi shart emas. Subscriber ham publisherni bevosita bilmaydi.
Topic
Topic xabarning mantiqiy yo‘lini bildiradi.
Misollar:
building/office/temperature
building/office/humidity
factory/line1/motor/status
uzbekdevs/server/cpu
Topiclar / belgisi bilan darajalarga bo‘linadi.
Topic case-sensitive bo‘lishi mumkin:
Sensor/Temp
sensor/temp
ular ikki xil topic hisoblanadi.
Wildcard
Subscriber bir nechta topicni wildcard bilan qamrab olishi mumkin.
+
Bitta darajani almashtiradi.
building/+/temperature
Quyidagilarga mos keladi:
building/office/temperature
building/lab/temperature
#
Qolgan barcha darajalarni qamrab oladi.
building/#
building/ ostidagi barcha topiclarga mos keladi.
Publisher wildcard bilan publish qilmaydi. Wildcard odatda faqat subscriptionda ishlatiladi.
Brokerga ulanish
MQTT client brokerga ulanishda CONNECT paket yuboradi.
CONNECT ichida:
- protocol version;
- client ID;
- clean start yoki session flag;
- keep alive;
- username;
- password;
- Will message;
- boshqa propertylar
bo‘lishi mumkin.
Broker CONNACK bilan ulanish qabul qilinganini yoki rad etilganini bildiradi.
Client ID
Client ID broker ichida clientni aniqlaydi.
Ikki faol client bir xil Client ID bilan ulansa, broker avvalgi ulanishni uzishi mumkin.
Client ID quyidagilar uchun muhim:
Random Client ID har ulanishda yangi sessiya yaratishi mumkin.
QoS
MQTT uchta yetkazish darajasiga ega.
QoS 0 — at most once
Xabar bir marta yuboriladi, tasdiq talab qilinmaydi.
Xususiyatlari:
- eng kichik overhead;
- eng past kechikish;
- xabar yo‘qolishi mumkin;
- takror yetkazish protokol tomonidan qilinmaydi.
Tez-tez yangilanadigan sensor ma’lumoti uchun mos bo‘lishi mumkin.
QoS 1 — at least once
Broker yoki subscriber PUBACK bilan tasdiqlaydi.
Tasdiq kelmasa, xabar qayta yuboriladi. Natijada bir xabar bir necha marta kelishi mumkin.
Consumer duplicate xabarni xavfsiz qayta ishlashi kerak.
QoS 2 — exactly once
To‘rt bosqichli almashinuv ishlatiladi:
PUBLISH → PUBREC → PUBREL → PUBCOMP
Bu QoS protokol darajasida xabarni aynan bir marta yetkazishga qaratilgan, lekin ko‘proq trafik va holat talab qiladi.
Ilovadagi biznes amal aynan bir marta bajarilishi uchun qo‘shimcha idempotency kerak bo‘lishi mumkin.
Retained message
Publisher xabarni retain flag bilan yuborsa, broker shu topic uchun oxirgi retained xabarni saqlaydi.
Yangi subscriber obuna bo‘lganda oxirgi qiymatni darhol oladi.
Masalan:
home/livingroom/temperature = 24.3
Sensor keyingi o‘lchovni bir daqiqadan keyin yuborsa ham, yangi client joriy qiymatni kutmasdan ko‘radi.
Bo‘sh payloadli retained publish ayrim holatda retained qiymatni o‘chirish uchun ishlatiladi.
Last Will and Testament
Client CONNECT vaqtida Will message belgilashi mumkin.
Agar client tartibsiz uzilsa, broker Will xabarini e’lon qiladi.
Misol:
devices/sensor-17/status = offline
Client normal DISCONNECT yuborsa, Will chiqarilmaydi.
Will qurilmaning kutilmaganda yo‘qolganini aniqlash uchun ishlatiladi.
Keep Alive
Keep Alive client va broker o‘rtasida uzoq vaqt trafik bo‘lmasa ham ulanish tirikligini tekshiradi.
Client ma’lum vaqt ichida paket yubormasa, PINGREQ yuboradi. Broker PINGRESP qaytaradi.
Broker clientdan belgilangan vaqtdan ancha uzoq paket olmasa, ulanishni uzishi va Will xabarini chiqarishi mumkin.
Persistent session
Session brokerda quyidagilarni saqlashi mumkin:
- subscriptions;
- yetkazilmagan QoS 1 yoki QoS 2 xabarlar;
- in-flight holat;
- Client ID bilan bog‘liq ma’lumot.
Client vaqtincha offline bo‘lsa, broker mos xabarlarni queuega yig‘ishi mumkin.
MQTT 5da session expiry interval orqali sessiya qancha saqlanishi boshqariladi.
Subscription
Client SUBSCRIBE paketida topic filter va kerakli QoSni bildiradi.
Broker SUBACK bilan natijani qaytaradi.
Yetkaziladigan QoS publisher QoS va subscription QoSning mos qiymatiga bog‘liq. Subscriber publisherdan yuqoriroq kafolat ola olmaydi.
Shared subscription
Bir nechta consumer bitta shared subscription guruhiga qo‘shilsa, broker har xabarni guruhdagi faqat bitta consumerga beradi.
Bu workerlar orasida yuk taqsimlash uchun ishlatiladi.
Misol:
$share/processors/orders/created
Aniq sintaksis broker va standart versiyasiga bog‘liq.
MQTT portlari
| Port | Vazifasi |
|---|---|
| 1883 | Oddiy MQTT TCP |
| 8883 | TLS bilan MQTT |
| turli portlar | WebSocket yoki brokerga xos listener |
WebSocket orqali MQTT brauzer ilovalarida ishlatilishi mumkin.
MQTT 3.1.1 va MQTT 5
MQTT 5 quyidagi imkoniyatlarni kengaytiradi:
- reason code;
- user properties;
- message expiry;
- session expiry;
- response topic;
- correlation data;
- server redirect;
- topic alias;
- flow control;
- subscription identifier;
- shared subscriptionni standartlashtirish.
Eski client va broker versiya mosligini tekshiradi.
Xavfsizlik
MQTTning oddiy username va password maydoni o‘zi shifrlanmaydi. TLSsiz credential tarmoqda ko‘rinishi mumkin.
Himoya:
- TLS;
- client sertifikati;
- kuchli username va password;
- token;
- topic ACL;
- IP cheklovi;
- rate limit;
- connection limit;
- payload hajmi;
- retained message siyosati;
- audit log;
- broker patchlari.
Har client faqat kerakli topicga publish va subscribe qila olishi kerak.
Topic dizayni
Yaxshi topic tuzilishi:
- tushunarli;
- barqaror;
- ortiqcha chuqur emas;
- qurilma va joylashuvni ajratadi;
- versiyani boshqaradi;
- maxfiy ma’lumotni topic nomiga yozmaydi.
Masalan:
v1/buildings/tashkent/rooms/12/temperature
Topic nomi broker loglarida va ACLda ko‘rinishi mumkin. Token yoki parol topic ichiga yozilmaydi.
Diagnostika
MQTT muammosida:
- broker manzili;
- port;
- TLS sertifikat;
- Client ID;
- username;
- ACL;
- topic spelling;
- wildcard;
- QoS;
- retained message;
- session expiry;
- keep alive;
- duplicate connection;
- broker loglari
tekshiriladi.
Client ulangan bo‘lib, xabar olmasa, subscription topic filter va ACL birinchi tekshiriladigan joylardir.
Bog‘liq tushunchalar
IoT, Broker, Publisher, Subscriber, Topic, QoS, Retained message, Last Will, Keep Alive, Persistent session, TLS, AMQP