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".0x80ve ü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:
- Paketi belirleyin. CONNACK'teki bir kod bağlantı sorunu, SUBACK'teki bir subscription sorunu, DISCONNECT'teki ise çalışma zamanı sorunudur.
- Reason String'i okuyun. Genellikle nedeni belirli bir sınıra veya kurala daraltır.
0x85,0x86ve0x87iç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.0x93,0x95,0x96ve0x97için sınırları kontrol edin: mesaj boyutu, hız, bağlantı sayısı ve iletimdeki mesajlar.0x8Eiç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.



