MQTT Temelleri

MQTT 5 Reason Code'ları: Nedenleri ve Çözümleriyle Eksiksiz Referans Tablosu

Tüm MQTT 5 reason code'ları, onları taşıyan paketlere göre gruplanmış tek bir tabloda; olağan nedenler ve pratik çözümlerle. MQTT 3.1.1 dönüş kodlarından eşlemeyi ve reason code'ları doğru loglamak için Python kodunu da içerir.

Bir hata ayıklama konsolunda paket türüne göre gruplanmış onaltılık mqtt reason code'larının referans tablosu
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 reason code'ları, MQTT 5 broker'larının ve client'larının tam olarak ne olduğunu belirtmek için onaylara ve DISCONNECT paketlerine koyduğu tek baytlık durum değerleridir. Bu referans her kodu, hangi paketlerin onu taşıyabileceğini, genellikle neyin tetiklediğini ve nasıl düzeltileceğini listeler; böylece loglarınızdaki anlaşılmaz bir 0x87 veya 0x97 değerini somut bir sonraki adıma dönüştürebilirsiniz.

MQTT Reason Code'ları Nasıl Çalışır?

MQTT 3.1.1'de yalnızca birkaç durum değeri vardı: altı CONNACK dönüş kodu ve SUBACK'te tek bir hata değeri (0x80). Reddedilen bir publish veya broker tarafında bir bağlantı kesme gibi diğer her şey sessizdi; bağlantı yalnızca kapanırdı. MQTT 5 bunu CONNACK, PUBACK, PUBREC, PUBREL, PUBCOMP, SUBACK, UNSUBACK, DISCONNECT ve AUTH genelinde kullanılan ortak bir reason code kümesiyle değiştirdi. Sahada cihaz işleten herkes için en pratik MQTT 5 özelliklerinden biridir.

İki kural tabloyu okumayı kolaylaştırır:

  • 0x80'in altındaki değerler başarı veya hata olmayan bir sonuç anlamına gelir; örneğin "QoS 1 verildi" veya "eşleşen subscriber yok".
  • 0x80 ve üzerindeki değerler hata anlamına gelir. Kodu taşıyan paket hangi işlemin başarısız olduğunu söyler.

Birçok paket ayrıca bir Reason String property'si, yani gönderenden gelen insan tarafından okunabilir bir açıklama taşıyabilir. Varsa her zaman loglayın; çoğu zaman aşılan sınırın tam olarak kendisini içerir.

Başarı ve Bilgilendirme Kodları

Kod Ad Paketler Anlamı
0x00 Success / Normal disconnection / Granted QoS 0 CONNACK, PUBACK, PUBREC, PUBREL, PUBCOMP, UNSUBACK, AUTH, DISCONNECT, SUBACK İşlem başarılı; SUBACK'te subscription'ın QoS 0 ile verildiği anlamına gelir
0x01 Granted QoS 1 SUBACK Subscription maksimum QoS 1 ile kabul edildi
0x02 Granted QoS 2 SUBACK Subscription maksimum QoS 2 ile kabul edildi
0x04 Disconnect with Will Message DISCONNECT Client temiz şekilde ayrılıyor ama broker'dan Will'ini publish etmesini istiyor
0x10 No matching subscribers PUBACK, PUBREC Publish kabul edildi ama kimse subscribe değildi
0x11 No subscription existed UNSUBACK Subscribe olmadığınız bir filtreden unsubscribe oldunuz
0x18 Continue authentication AUTH Gelişmiş kimlik doğrulama alışverişi devam ediyor
0x19 Re-authenticate AUTH Client mevcut bir bağlantıda yeniden kimlik doğrulamayı başlatıyor

İstediğinizden daha düşük bir QoS veren bir SUBACK hata değildir. QoS 2 isteyip 0x01 alırsanız, broker'ın bağlantınız için maksimum QoS'u 1'dir ve mesajlar en fazla QoS 1 ile gelir.

Hata Reason Code'ları Referansı

Kod Ad Paketler Olağan neden Çözüm
0x80 Unspecified error Tüm onaylar, DISCONNECT Broker belirli bir neden olmadan reddetti Reason String'i ve broker loglarını okuyun
0x81 Malformed Packet CONNACK, DISCONNECT Geçersiz kodlama, bozuk UTF-8, yanlış uzunluklar Client kütüphanesini güncelleyin; özel encoder'ları kontrol edin
0x82 Protocol Error CONNACK, DISCONNECT Paket geçerli ama yanlış sırada veya yasak alanlarla gönderildi Yinelenen CONNECT'i veya property'lerin hatalı kullanımını kontrol edin
0x83 Implementation specific error CONNACK, PUBACK, PUBREC, SUBACK, UNSUBACK, DISCONNECT Broker'a özgü bir politika işlemi reddetti Broker belgelerini ve Reason String'i kontrol edin
0x84 Unsupported Protocol Version CONNACK Broker istenen sürümü desteklemiyor Desteklenen MQTT 3.1.1 veya 5.0'ı kullanın
0x85 Client Identifier not valid CONNACK Boş, çok uzun veya izin verilmeyen client ID Geçerli ve benzersiz bir client ID kullanın
0x86 Bad User Name or Password CONNACK Yanlış veya hatalı biçimlendirilmiş kimlik bilgileri Kullanıcı adını ve parolayı yeniden kopyalayın
0x87 Not authorized CONNACK, PUBACK, PUBREC, SUBACK, UNSUBACK, DISCONNECT Kimlik bilgilerinin veya client'ın yetkisi yok Kimlik bilgilerini, client ID bağlantısını ve topic haklarını kontrol edin
0x88 Server unavailable CONNACK Broker şu anda bağlantı kabul edemiyor Backoff ile yeniden deneyin
0x89 Server busy CONNACK, DISCONNECT Broker aşırı yüklü Daha sonra backoff ve jitter ile yeniden deneyin
0x8A Banned CONNACK Client veya adres engellenmiş Yeniden deneme döngülerini durdurun; kimlik bilgilerini düzeltin; operatörle iletişime geçin
0x8B Server shutting down DISCONNECT Planlı kapanış veya yeniden başlatma Backoff ile yeniden bağlanın
0x8C Bad authentication method CONNACK, DISCONNECT Gelişmiş kimlik doğrulama yöntemi desteklenmiyor Authentication Method'u kaldırın veya düzeltin
0x8D Keep Alive timeout DISCONNECT 1,5 x keep alive süresi içinde paket alınmadı Ağ döngüsünü çalıştırın; bağlantıyı kontrol edin
0x8E Session taken over DISCONNECT Aynı client ID ile başka bir client bağlandı Her client'a benzersiz bir ID verin
0x8F Topic Filter invalid SUBACK, UNSUBACK, DISCONNECT Hatalı filtre, örn. a/#/b Wildcard yerleşimini düzeltin
0x90 Topic Name invalid CONNACK, PUBACK, PUBREC, DISCONNECT Publish topic'inde wildcard veya geçersiz karakterler Somut bir topic adına publish edin
0x91 Packet Identifier in use PUBACK, PUBREC, SUBACK, UNSUBACK Paket ID'si hâlâ iletimdeyken yeniden kullanıldı Kütüphane hatası veya özel paket ID işleme
0x92 Packet Identifier not found PUBREL, PUBCOMP QoS 2 durumu kayboldu, genellikle bir oturum sıfırlamasından sonra Oturum kalıcılığı ayarlarını kontrol edin
0x93 Receive Maximum exceeded DISCONNECT Çok fazla onaylanmamış QoS 1/2 publish Karşı tarafın Receive Maximum değerine uyun
0x94 Topic Alias invalid DISCONNECT Alias aralık dışında veya tanımsız Yeniden bağlantıda alias'ları sıfırlayın; maksimuma uyun
0x95 Packet too large CONNACK, DISCONNECT Paket Maximum Packet Size'ı aşıyor Payload'ları küçültün veya parçalara bölün
0x96 Message rate too high DISCONNECT İzin verilenden hızlı publish Publish hızını sınırlayın
0x97 Quota exceeded CONNACK, PUBACK, PUBREC, SUBACK, DISCONNECT Bir plan veya hesap sınırına ulaşıldı Kullanımı azaltın veya planı yükseltin
0x98 Administrative action DISCONNECT Bir operatör client'ın bağlantısını kesti Broker yöneticisine danışın
0x99 Payload format invalid CONNACK, PUBACK, PUBREC, DISCONNECT Payload Format Indicator UTF-8 diyor ama baytlar UTF-8 değil Kodlamayı düzeltin veya göstergeyi temizleyin
0x9A Retain not supported CONNACK, DISCONNECT Retain bayrağı izin verilmeyen yerde kullanıldı Retain olmadan publish edin
0x9B QoS not supported CONNACK, DISCONNECT Publish QoS'u broker'ın maksimumunun üzerinde QoS'u bildirilen maksimuma düşürün
0x9C Use another server CONNACK, DISCONNECT Broker client'ı geçici olarak yönlendiriyor Server Reference property'sini izleyin
0x9D Server moved CONNACK, DISCONNECT Broker kalıcı olarak yönlendiriyor Yapılandırılmış host'u güncelleyin
0x9E Shared Subscriptions not supported SUBACK, DISCONNECT $share/... filtresine izin verilmiyor Shared subscription destekleyen bir plan veya broker kullanın
0x9F Connection rate exceeded CONNACK Çok fazla bağlantı denemesi Yeniden bağlanma mantığına backoff ekleyin
0xA0 Maximum connect time DISCONNECT Bağlantı ömrü sınırına ulaşıldı Yeniden bağlanın; periyodik bağlantı kesilmelerini bekleyin
0xA1 Subscription Identifiers not supported SUBACK, DISCONNECT Subscription Identifier property'sine izin verilmiyor Property'yi kaldırın
0xA2 Wildcard Subscriptions not supported SUBACK, DISCONNECT Bu client için wildcard'lara izin verilmiyor Açık topic'lere subscribe olun

0x8D ve 0x8E gibi bazı kodların yalnızca broker'ın gönderdiği bir DISCONNECT'te göründüğüne dikkat edin. 0x84 ile 0x88 arası gibi diğerleri ise bağlantının en başta neden reddedildiğini açıkladıkları için yalnızca CONNACK'te görünebilir.

MQTT 3.1.1 Dönüş Kodlarını MQTT 5'e Eşlemek

Her iki protokol sürümünü de destekliyorsanız bu eşleme hata işlemenizi tutarlı tutar. Ayrıntılı anlatım MQTT CONNACK dönüş kodları rehberinde.

MQTT 3.1.1 CONNACK MQTT 5 karşılığı
0 Connection accepted 0x00 Success
1 Unacceptable protocol version 0x84 Unsupported Protocol Version
2 Identifier rejected 0x85 Client Identifier not valid
3 Server unavailable 0x88 Server unavailable
4 Bad user name or password 0x86 Bad User Name or Password
5 Not authorized 0x87 Not authorized

Python'da MQTT Reason Code'larını Loglamak

paho-mqtt 2.x ve CallbackAPIVersion.VERSION2 ile her callback bir ReasonCode nesnesi alır. String biçimi spesifikasyondaki addır, .value ise sayısal koddur; loglarda tam olarak istediğiniz budur:

import paho.mqtt.client as mqtt

def on_connect(client, userdata, flags, reason_code, properties):
    print(f"CONNACK: {reason_code} (0x{reason_code.value:02X})")
    if reason_code.is_failure:
        return
    client.subscribe("connectmq/demo/b7d2/#", qos=2)

def on_subscribe(client, userdata, mid, reason_code_list, properties):
    for rc in reason_code_list:
        print(f"SUBACK: {rc} (0x{rc.value:02X})")

def on_disconnect(client, userdata, flags, reason_code, properties):
    reason = getattr(properties, "ReasonString", None) if properties else None
    print(f"DISCONNECT: {reason_code} (0x{reason_code.value:02X}) {reason or ''}")

client = mqtt.Client(
    mqtt.CallbackAPIVersion.VERSION2,
    client_id="reason-demo-b7d2",
    protocol=mqtt.MQTTv5,
)
client.on_connect = on_connect
client.on_subscribe = on_subscribe
client.on_disconnect = on_disconnect
client.connect("broker.connectmq.com", 1883, keepalive=30)
client.loop_forever()

Bunu herkese açık MQTT test broker'ına karşı çalıştırdığınızda bağlantıda Success ve SUBACK'te verilen bir QoS görürsünüz. 0x8F Topic Filter invalid kodunu iş başında görmek için connectmq/demo/b7d2/#/x gibi geçersiz bir filtreye subscribe olmayı deneyin. MQTT.js'te aynı bilgi connack.reasonCode içinde, subscribe callback'inin granted dizisinde ve disconnect olay paketinde bulunur.

Reason Code'a Göre Hata Ayıklama Akışı

Bir hatayı incelemek için pratik bir sıra:

  1. Paketi belirleyin. CONNACK'teki bir kod bağlantı sorunu, SUBACK'teki bir subscription sorunu, DISCONNECT'teki ise çalışma zamanı sorunudur.
  2. Reason String'i okuyun. Genellikle nedeni belirli bir sınıra veya kurala daraltır.
  3. 0x85, 0x86 ve 0x87 için önce kimlik bilgilerini ve kimliği kontrol edin. MQTT connection refused: not authorized hatasını düzeltme rehberi bunu ayrıntılı olarak ele alır.
  4. 0x93, 0x95, 0x96 ve 0x97 için sınırları kontrol edin: mesaj boyutu, hız, bağlantı sayısı ve iletimdeki mesajlar.
  5. 0x8E için filo hijyenini kontrol edin: yinelenen client ID'ler, bağlantı kesme döngülerinin en yaygın nedenidir.

ConnectMQ'da Reason Code'lar

ConnectMQ MQTT 3.1.1 ve 5.0'ı destekler; bu yüzden MQTT 5 client'ları yukarıdaki reason code'ları alır. Plan kotaları 0x97 Quota exceeded olarak görünür; örneğin ücretsiz bir Serverless broker zaten maksimum 25 bağlantısına ulaşmışsa. Plan özellikleri de önemlidir: ücretsiz plan QoS 1'e kadar izin verir; bu yüzden bir QoS 2 subscription SUBACK'te daha düşük bir QoS ile verilir; QoS 2 ve shared subscription'lar ise ücretli Serverless planıyla gelir. Tekrarlanan başarısız girişler şüpheli kabul edilir ve kaynak IP engellenebilir; bu yüzden bir client'ı asla hatalı kimlik bilgileriyle sıkı bir döngüde yeniden denemeye bırakmayın.

Bir MQTT broker'ın bu kodlarla ne yaptığına dair arka plan veya protokolün bütün bağlamı için MQTT eğitimine bakın.

ConnectMQ ile Daha Hızlı Hata Ayıklayın

Tarayıcı içi istemcisi ve canlı topic gezgini olan yönetilen bir MQTT broker, başarısız bir publish'i veya subscription'ı yeniden üretmeyi çok daha hızlı hale getirir. app.connectmq.com adresinde, kredi kartı gerekmeden ücretsiz bir Serverless broker oluşturun ve hata işleme mantığınızı gerçek MQTT 5 yanıtlarına karşı test edin.

Sık Sorulan Sorular

Reason code ile return code arasındaki fark nedir?

Return code, altı CONNACK değeri için kullanılan MQTT 3.1.1 terimidir. MQTT 5 bu fikri, neredeyse her onayda ve DISCONNECT'te görünen reason code'lara genelleştirdi.

Hangi reason code'lar başarı anlamına gelir?

0x80'in altındaki her değer. Bunlara 0x00 Success, verilen QoS için 0x01 ve 0x02 ile 0x10 No matching subscribers gibi bilgilendirme değerleri dahildir.

MQTT reason code 0x97 ne anlama gelir?

0x97, Quota exceeded'dır: client maksimum bağlantı sayısı veya bir plan kısıtlaması gibi bir sınıra ulaşmıştır. Kullanımı azaltın veya daha yüksek sınırlara sahip bir plana geçin.

MQTT 3.1.1 client'ları MQTT 5 reason code'larını alır mı?

Hayır. Bir 3.1.1 bağlantısı yalnızca klasik CONNACK dönüş kodlarını ve 0x80 SUBACK hata değerini alır. Ayrıntılı reason code'ları almak için protokol sürümü 5 ile bağlanın.

İ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.