MQTT Temelleri

15 MQTT Kontrol Paketi Türünün Tamamı Açıklandı

MQTT'de yalnızca 15 kontrol paketi türü vardır. Bu başvuru kaynağı, CONNECT'ten AUTH'a her birini tür numarası, yönü, ilk baytı ve sorun giderirken debug loglarındaki görünümüyle açıklıyor.

CONNECT'ten DISCONNECT'e kadar mqtt kontrol paketlerini değiş tokuş eden istemci ve broker'ın sıralama diyagramı
Bunu kendi MQTT broker’ınızda çalıştırınFree planla özel, yönetilen bir MQTT broker alın ve hazır kod örnekleriyle başlayın.
Ücretsiz deneyin Kod örnekleri Kart gerekmez

MQTT kontrol paketleri, istemcilerin ve broker'ların birbirleriyle değiş tokuş ettiği, CONNECT'ten AUTH'a uzanan 15 mesaj türüdür ve her MQTT etkileşimi bu paketlerden oluşur. Bu başvuru kaynağı her paketin ne yaptığını, kimin gönderdiğini, ilk baytından nasıl tanınacağını ve istemci debug loglarında nasıl göründüğünü açıklar; böylece broker ile yapılan bir konuşmayı adım adım izleyebilir ve sorunun tam olarak nerede çıktığını tespit edebilirsiniz.

Bir Bakışta MQTT Kontrol Paketleri

Paket türü, her paketin ilk baytının üst dört bitinde yer alır. MQTT 3.1.1, 1'den 14'e kadar olan türleri tanımlar; MQTT 5 ise 15 numaralı AUTH türünü ekler. Tür 0 ayrılmıştır ve hiçbir zaman geçerli değildir.

Tür Ad Yön İlk bayt Amaç
1 CONNECT İstemciden broker'a 0x10 Oturum açmak
2 CONNACK Broker'dan istemciye 0x20 Bağlantıyı kabul etmek veya reddetmek
3 PUBLISH Her iki yön 0x30-0x3F Uygulama mesajını iletmek
4 PUBACK Her iki yön 0x40 QoS 1 publish'i onaylamak
5 PUBREC Her iki yön 0x50 QoS 2 adım 1: publish alındı
6 PUBREL Her iki yön 0x62 QoS 2 adım 2: serbest bırakma
7 PUBCOMP Her iki yön 0x70 QoS 2 adım 3: tamamlandı
8 SUBSCRIBE İstemciden broker'a 0x82 Abonelik istemek
9 SUBACK Broker'dan istemciye 0x90 Abonelikleri onaylamak veya reddetmek
10 UNSUBSCRIBE İstemciden broker'a 0xA2 Abonelikleri kaldırmak
11 UNSUBACK Broker'dan istemciye 0xB0 Abonelikten çıkmayı onaylamak
12 PINGREQ İstemciden broker'a 0xC0 Keep alive yoklaması
13 PINGRESP Broker'dan istemciye 0xD0 Keep alive yanıtı
14 DISCONNECT İstemciden broker'a (MQTT 5'te her iki yön) 0xE0 Bağlantıyı düzgün şekilde kapatmak
15 AUTH Her iki yön (yalnızca MQTT 5) 0xF0 Gelişmiş kimlik doğrulama değişimi

İlk baytı bilmek, ham bir hex dökümünü okurken işe yarar: 0xC0 0x00 bir PINGREQ'tir, 0x82 ise bir SUBSCRIBE'ı başlatır. Başlıkların ve payload'ların bayt düzeyindeki yapısı MQTT paket yapısı rehberinde ele alınıyor.

Kontrol Paketlerini Debug Logunda İzlemek

Bu paketleri görmenin en kolay yolu, Mosquitto istemcilerinin -d bayrağıdır. Herkese açık MQTT test broker'ına karşı:

mosquitto_sub -h broker.connectmq.com -p 1883 -i pkt-demo-e41f \
  -t "connectmq/demo/e41f/#" -q 1 -k 10 -d

İkinci bir terminalde bir mesaj publish edin:

mosquitto_pub -h broker.connectmq.com -p 1883 -i pkt-pub-e41f \
  -t "connectmq/demo/e41f/temp" -m "22.1" -q 1 -d

Subscriber'ın çıktısı buna benzer görünecektir:

Client pkt-demo-e41f sending CONNECT
Client pkt-demo-e41f received CONNACK (0)
Client pkt-demo-e41f sending SUBSCRIBE (Mid: 1, Topic: connectmq/demo/e41f/#, QoS: 1, Options: 0x00)
Client pkt-demo-e41f received SUBACK
Subscribed (mid: 1): 1
Client pkt-demo-e41f received PUBLISH (d0, q1, r0, m1, 'connectmq/demo/e41f/temp', ... (4 bytes))
Client pkt-demo-e41f sending PUBACK (m1, rc0)
22.1
Client pkt-demo-e41f sending PINGREQ
Client pkt-demo-e41f received PINGRESP

-k 10 keep alive değeri, on saniyelik boşta kalma süresinin ardından PINGREQ'in görünmesini sağlar. PUBLISH satırındaki d0, q1, r0, m1 ifadesi DUP 0, QoS 1, retain 0 ve mesaj kimliği 1 anlamına gelir. Paho Python, client.enable_logger() ile benzer satırlar yazdırır; MQTT.js ise bunu DEBUG=mqttjs* ortam değişkeniyle yapar.

Bağlantı Paketleri: CONNECT, CONNACK, DISCONNECT

CONNECT, bir istemcinin gönderdiği ilk pakettir. Protokol sürümünü, clean session veya clean start bayrağını, keep alive değerini, client ID'yi, isteğe bağlı Last Will mesajını ve isteğe bağlı kullanıcı adı ile parolayı taşır. MQTT 5'te ayrıca Session Expiry Interval, Receive Maximum ve Topic Alias Maximum gibi özellikleri (property) de taşır. Aynı bağlantı üzerinden ikinci bir CONNECT göndermek protokol hatasıdır.

CONNACK, broker'ın yanıtıdır. Session Present bayrağını ve bir dönüş kodunu (3.1.1) veya reason code'u (MQTT 5) içerir. MQTT 5 broker'ları, CONNACK özelliklerini istemciye kendi sınırlarını bildirmek için de kullanır: Maximum QoS, Maximum Packet Size, Topic Alias Maximum, retain, wildcard veya paylaşımlı aboneliklerin kullanılıp kullanılamayacağı ve istemci boş bir kimlik gönderdiyse atanan client ID. Bir bağlantı başarısız olduğunda ilk bakılacak yer CONNACK'tir; ayrıntılar için MQTT CONNACK dönüş kodları yazısına göz atın.

DISCONNECT, bağlantıyı düzgün şekilde kapatır. Soketi kapatmadan önce DISCONNECT gönderen bir istemci, Last Will mesajının yayınlanmasını engeller (MQTT 5'te 0x04 reason code'u kullanıldığında hariç). MQTT 3.1.1'de DISCONNECT'i yalnızca istemci gönderir; MQTT 5'te broker da 0x8E Session taken over veya 0x97 Quota exceeded gibi nedenini açıklayan bir reason code ile DISCONNECT gönderebilir. Bir yeniden bağlanma döngüsü görüyorsanız broker'ın gönderdiği DISCONNECT paketlerine bakın; MQTT istemcisinin neden sürekli bağlantısının koptuğunu anlatan rehber olası nedenleri tek tek ele alıyor.

Yayınlama Paketleri: PUBLISH ve Onaylar

PUBLISH, uygulama mesajını her iki yönde de taşır: publish yaptığınızda istemciden broker'a, mesaj aldığınızda broker'dan istemciye. Sabit başlıktaki bayraklar DUP, QoS ve RETAIN değerlerini tutar.

Onaylar QoS seviyesine bağlıdır; bu konu MQTT QoS seviyeleri yazısında ayrıntılı olarak açıklanıyor:

QoS Paket akışı Mesaj başına toplam paket
0 PUBLISH 1
1 PUBLISH, PUBACK 2
2 PUBLISH, PUBREC, PUBREL, PUBCOMP 4
  • PUBACK, bir QoS 1 mesajını onaylar. Bu paket gelene kadar gönderen taraf mesajı saklar ve yeniden bağlandıktan sonra DUP bayrağı ayarlanmış şekilde tekrar gönderebilir.
  • PUBREC, alıcının QoS 2 için "mesaj bende" demesidir. Gönderen taraf artık mesajın payload'ını silebilir.
  • PUBREL, alıcıya mesajı subscriber'lara iletebileceğini ve paket kimliğinin yakında yeniden kullanılabileceğini bildirir.
  • PUBCOMP, QoS 2 değişimini sonlandırır.

Her atlamanın (hop) birbirinden bağımsız olduğunu unutmayın. Bir sensörden broker'a yapılan QoS 1 publish ile broker'dan bir subscriber'a yapılan QoS 2 teslimat ayrı değişimlerdir. MQTT 5'te bu onaylar reason code taşır; böylece PUBACK 0x10 No matching subscribers veya 0x87 Not authorized diyebilir.

Abonelik Paketleri: SUBSCRIBE, SUBACK, UNSUBSCRIBE, UNSUBACK

SUBSCRIBE, bir paket kimliği ve her biri istenen bir QoS değerine sahip bir veya daha fazla topic filtresi içerir. MQTT 5; No Local, Retain As Published ve Retain Handling gibi abonelik seçeneklerini ve isteğe bağlı bir Subscription Identifier'ı ekler.

SUBACK, her filtre için aynı sırayla bir kod döndürür. Her girdiyi okuyun: üç filtre içeren tek bir SUBSCRIBE, ikisi için başarılı olup biri için başarısız olabilir. 3.1.1'de başarısızlık değeri 0x80'dir; MQTT 5 ise 0x8F Topic Filter invalid veya 0x9E Shared Subscriptions not supported gibi özel nedenler verir.

UNSUBSCRIBE ve UNSUBACK, aboneliklerin kaldırılması için aynı yapıyı yansıtır. MQTT 5, UNSUBACK'e 0x11 No subscription existed dahil filtre başına reason code'lar ekler.

Keep Alive Paketleri: PINGREQ ve PINGRESP

PINGREQ ve PINGRESP, başka bir trafik akmadığında bağlantının canlı olduğunu kanıtlayan iki baytlık paketlerdir. İstemci, keep alive aralığı içinde hiçbir şey göndermediyse PINGREQ gönderir; broker da PINGRESP ile yanıt vermek zorundadır. Broker, keep alive süresinin 1,5 katı boyunca hiçbir şey duymazsa bağlantıyı kapatır. İstemci makul bir sürede PINGRESP almazsa bağlantıyı ölü kabul etmelidir. MQTT keep alive aralığı rehberi bu değerin nasıl seçileceğini açıklıyor.

AUTH: MQTT 5 ile Gelen Ekleme

AUTH, Authentication Method ve Authentication Data özellikleri aracılığıyla challenge-response mekanizmaları gibi gelişmiş kimlik doğrulamayı destekler. Çok adımlı değişimler için CONNECT'ten sonra kullanılır ve mevcut bir bağlantıda yeniden kimlik doğrulamayı da başlatabilir. Kullanıcı adı ve parola ile giriş dahil çoğu kurulum hiçbir zaman AUTH göndermez; bu nedenle gelişmiş bir yöntem yapılandırmadıysanız bir yakalamada AUTH görmeniz olağan dışıdır.

Pakete Göre Hata Ayıklama Kontrol Listesi

  1. CONNACK gelmiyor mu? Sorun MQTT'de değil; ağda, portta veya TLS'tedir.
  2. CONNACK sıfır dışında bir kod mu döndürüyor? Kimlik bilgileri, client ID veya protokol sürümü.
  3. SUBACK 0x80 veya daha yüksek mi? Hatalı filtre, yetki veya desteklenmeyen özellik.
  4. PUBLISH gönderildi ama PUBACK yok mu? QoS desteğini ve bağlantı durumunu kontrol edin.
  5. PINGRESP gelmeden tekrarlanan PINGREQ mi? Bağlantı yarı ölü; yeniden bağlanın.
  6. Broker'dan beklenmedik bir DISCONNECT mi? Reason code'unu okuyun.

ConnectMQ'da Her Paketi Görün

ConnectMQ MQTT 3.1.1 ve 5.0'ı destekler; böylece hem klasik paket akışını hem de MQTT 5 reason code'larını ve özelliklerini aynı broker üzerinde izleyebilirsiniz. Daha geniş bir bakış için bu paketlerle bir MQTT broker'ının ne yaptığını okuyun veya kapsamlı MQTT eğitimini takip edin.

ConnectMQ ile Geliştirin

Denemelerden cihazlara geçtiğinizde yönetilen bir MQTT broker TLS, kimlik bilgileri ve çalışma süresiyle sizin yerinize ilgilenir. app.connectmq.com adresinde kredi kartı gerektirmeden ücretsiz bir Serverless broker oluşturun, ardından hata ayıklarken portalın tarayıcı içi istemcisini ve canlı topic gezginini kullanın. Seçenekleri bulut MQTT broker pazarı rehberimizde de karşılaştırabilirsiniz.

Sık Sorulan Sorular

Kaç tane MQTT kontrol paketi türü vardır?

MQTT 5, 1'den 15'e kadar numaralandırılmış 15 kontrol paketi türü tanımlar. AUTH paketi MQTT 5 ile eklendiği için MQTT 3.1.1'de 14 tür vardır.

Bir QoS 2 mesajı hangi paketleri kullanır?

PUBLISH, PUBREC, PUBREL ve PUBCOMP. Dört adımlı el sıkışma, mesajın o gönderici ile alıcı arasında tam olarak bir kez teslim edilmesini sağlar.

Broker DISCONNECT paketi gönderebilir mi?

Yalnızca MQTT 5'te. MQTT 3.1.1'de broker ağ bağlantısını doğrudan kapatır; MQTT 5 ise önce bir reason code ile DISCONNECT göndermesine izin verir.

Loglarımda neden PINGREQ görüyorum?

PINGREQ, istemcinin keep alive yoklamasıdır ve istemci keep alive aralığı boyunca boşta kaldığında gönderilir. Düzenli PINGREQ ve PINGRESP çiftleri normaldir ve bağlantının sağlıklı olduğunu gösterir.

İlgili yazılar

MQTT'yi Kim İcat Etti? Petrol Boru Hatlarından IoT'ye Uzanan Tarih

MQTT, 1999'da IBM'den Andy Stanford-Clark ve Arcom'dan Arlen Nipper tarafından petrol boru hatlarını uydu üzerinden izlemek için icat edildi. Açık kaynağa, OASIS'e, ISO'ya ve bugünün yönetilen bulut broker'larına uzanan yolculuğunu izleyin.

7 dk okuma

MQTT Maksimum Mesaj Boyutu: Sınırlar ve Büyük Payload Stratejileri

MQTT teknik olarak 256 MB'lık bir paket taşıyabilir, ancak broker'lar, istemci kütüphaneleri ve cihazlar çok daha düşük sınırlar uygular. Gerçek sınırların nerede olduğunu, aşıldıklarında ne olduğunu ve büyük payload'ların nasıl gönderileceğini öğrenin.

6 dk okuma

Tüm yazılar →

Özel MQTT broker’ınız birkaç tık uzağınızda

Hesabınızı oluşturun, broker kimlik bilgilerinizi alın ve ilk cihazınızı bağlayın — kurulacak, yamalanacak ya da ölçeklendirilecek sunucu yok.