MQTT CONNACK dönüş kodları, bir MQTT 3.1.1 broker'ının bir client'a bağlantısının kabul edilip edilmediğini, edilmediyse nedenini bildirmek için geri gönderdiği 0'dan 5'e kadar altı değerdir. Bu rehber her kodu açıklıyor, yaygın araç ve kütüphanelerde nasıl göründüğünü gösteriyor ve herkese açık test broker'ı ile özel bir broker'a karşı örneklerle dakikalar içinde uygulayabileceğiniz bir çözüm sunuyor.
CONNACK Paketi Neleri İçerir?
Bir client TCP bağlantısı açtıktan sonra ilk paketi CONNECT olmalıdır. Broker, MQTT 3.1.1'de sabit dört baytlık bir paket olan CONNACK ile yanıt verir:
20 02 00 05
| | | |
| | | +-- Connect return code (burada 5 = Not authorized)
| | +----- Connect acknowledge flags (bit 0 = Session Present)
| +-------- Remaining length (her zaman 2)
+----------- Paket türü 2 (CONNACK), bayraklar 0
Session Present bayrağı client'a broker'ın saklanan bir oturumu sürdürüp sürdürmediğini söyler; bu kalıcı oturumlar için önemlidir. Dönüş kodu ise bu makalenin konusudur. 0'dan farklı bir değerse broker, CONNACK'i gönderdikten hemen sonra ağ bağlantısını kapatır ve client tekrar denemeden önce nedeni düzeltmelidir. Bu ve diğer paketlerin tam bayt düzeni için MQTT paket yapısı rehberine bakın.
Bir Bakışta MQTT CONNACK Dönüş Kodları
| Kod | Ad | Tipik tetikleyici | İlk kontrol edilecek şey |
|---|---|---|---|
| 0 | Connection accepted | Her şey yolunda | Hiçbir şey |
| 1 | Unacceptable protocol version | Client, broker'ın desteklemediği bir sürüm istedi | Protokol sürümü ayarı |
| 2 | Identifier rejected | Client ID boş, geçersiz veya izin verilmiyor | Client ID değeri |
| 3 | Server unavailable | Broker şu anda bağlantıya hizmet veremiyor | Broker durumu, backoff ile yeniden deneme |
| 4 | Bad user name or password | Kimlik bilgileri yanlış veya hatalı biçimde | Kullanıcı adı ve parola |
| 5 | Not authorized | Client'ın bağlanma izni yok | Kimlik bilgileri, client ID, hesap |
MQTT 3.1.1'de 6 ile 255 arasındaki değerler ayrılmıştır. Kütüphaneniz bunlardan birini bildiriyorsa, genellikle yanlışlıkla bir MQTT 5 reason code'unu çözümlüyordur; bu da client ile broker'ın protokol sürümü konusunda anlaşamadığı anlamına gelir.
Her Dönüş Kodu Araçlarınızda Nasıl Görünür?
Hata mesajları araca göre farklılık gösterir; bu da onları aramayı kafa karıştırıcı hale getirir. Aynı kodların üç yaygın client'ta nasıl göründüğü:
| Kod | mosquitto_pub / mosquitto_sub | Paho Python 2.x reason_code | MQTT.js hata mesajı |
|---|---|---|---|
| 1 | Connection Refused: unacceptable protocol version | Unsupported protocol version | Connection refused: Unacceptable protocol version |
| 2 | Connection Refused: identifier rejected | Client identifier not valid | Connection refused: Identifier rejected |
| 3 | Connection Refused: broker unavailable | Server unavailable | Connection refused: Server unavailable |
| 4 | Connection Refused: bad user name or password | Bad user name or password | Connection refused: Bad username or password |
| 5 | Connection Refused: not authorised | Not authorized | Connection refused: Not authorized |
Paho, 3.1.1 kodlarını dahili olarak MQTT 5 reason code adlarına eşler; bu yüzden 3.1.1 bağlantısında bile MQTT 5 ifadelerini görebilirsiniz. MQTT reason code'ları referansı tam eşlemeyi gösterir.
Kod 1: Unacceptable Protocol Version
CONNECT paketi bir protokol seviyesi baytı taşır: MQTT 3.1.1 için 4, MQTT 5.0 için 5 ve eski MQTT 3.1 için 3. Broker istenen seviyeyi desteklemiyorsa 1 koduyla yanıt verir.
Nasıl düzeltilir:
- Kütüphane varsayılanlarına güvenmek yerine protokol sürümünü açıkça ayarlayın. Mosquitto araçlarında
-V mqttv311veya-V mqttv5, Paho'daprotocol=mqtt.MQTTv311, MQTT.js'teprotocolVersion: 4veya5kullanın. - MQTT 3.1'den (seviye 3) kaçının. ConnectMQ gibi modern yönetilen broker'lar 3.1.1 ve 5.0'ı destekler.
- Bir proxy veya gateway arkasındaysanız, MQTT'yi değiştirmeden geçirdiğini doğrulayın.
Kod 2: Identifier Rejected
Broker client tanımlayıcısını kabul etmedi. Yaygın nedenler:
- Clean session kapalıyken boş client ID. MQTT 3.1.1, sıfır uzunlukta client ID'ye yalnızca clean session ile birlikte izin verir ve birçok broker boş ID'leri tamamen reddeder. Her zaman boş olmayan bir ID ayarlayın.
- Broker'ın kurallarının dışında karakterler veya uzunluk. Harfler, rakamlar ve kısa çizgilerle sınırlı kalın ve ID'leri makul ölçüde kısa tutun.
- Kimlik bilgilerine bağlı client ID. Bazı broker'lar bir client ID'yi belirli bir hesaba bağlar. Özel bir ConnectMQ broker'ında client ID'ler portalda verilen kimlik bilgilerine bağlıdır; bu yüzden orada gösterilen client ID'yi kullanıcı adıyla birlikte kullanın.
Herkese açık test broker'ında boş olmayan ve benzersiz herhangi bir ID çalışır. MQTT client ID rehberi, filolar için adlandırma stratejilerini ele alır.
Kod 3: Server Unavailable
Ağ bağlantısı çalıştı, ancak broker şu anda MQTT hizmeti veremiyor. Bu genellikle geçicidir: bir yeniden başlatma, aşırı yük veya bakım. Hemen yeniden bağlanmak yerine jitter'lı üstel backoff uygulayın; binlerce cihazın aynı anda yeniden bağlanması, toparlanmakta olan bir broker'ı aşırı yük altında tutabilir.
Kod 4: Bad User Name or Password
Broker kimlik bilgilerini kontrol etti ve eşleşmediler. Pratikte:
- Kullanıcı adını ve parolayı asıl kaynağından yeniden kopyalayın; sondaki boşluklar ve yer değiştirmiş alanlar yaygındır.
- Kütüphanenizin parolayı gerçekten gönderdiğini kontrol edin. Bazı API'ler
connect()öncesindeusername_pw_set()gerektirir. - Parolalardaki özel karakterlerin shell tırnaklaması nedeniyle değişmesine dikkat edin. Komut satırında onları tek tırnak içine alın.
- Başarısızlıklarda döngüye girmeyin. Broker'lar genellikle kendilerini kaba kuvvet denemelerine karşı korur ve ConnectMQ tekrarlanan başarısız girişlerden sonra bir IP adresini engeller.
Kod 5: Not Authorized
Broker kim olduğunuzu anladı ama bağlantıyı reddediyor. Nedenler arasında başka bir broker'ın kimlik bilgilerini kullanmak, uyuşmayan bir client ID, devre dışı bırakılmış bir hesap veya tükenmiş bir kota vardır. Bu, özel broker'lardaki en yaygın rettir ve MQTT connection refused: not authorized hatasını düzeltme yazısında kendine ait adım adım bir kontrol listesi vardır.
CONNACK Kodlarını Güvenle Yeniden Üretmek
Kodları kendiniz görmek, onları üretim loglarında tanımayı kolaylaştırır. Önce, debug çıktısı etkin olarak herkese açık MQTT test broker'ına başarılı bir bağlantı:
mosquitto_sub -h broker.connectmq.com -p 1883 -i connack-test-4e8b \
-t "connectmq/demo/4e8b/#" -V mqttv311 -d
-d bayrağı Client connack-test-4e8b received CONNACK (0) yazdırır; dönüş kodu parantez içindedir. Özel bir broker'a karşı bilerek yanlış girilen bir parola reddi gösterir:
mosquitto_sub -h broker.connectmq.com -p 8883 --capath /etc/ssl/certs \
-u YOUR_USERNAME -P wrong-password -i YOUR_CLIENT_ID \
-t "test/#" -V mqttv311 -d
Bunu yalnızca bir veya iki kez çalıştırın; tekrarlanan başarısızlıklar IP engellemesini tetikleyebilir.
Python'da Dönüş Kodlarını Ele Almak
Bu paho-mqtt 2.x client'ı MQTT 3.1.1 ile bağlanır, kodu loglar ve insan müdahalesi gerektiren hatalarda yeniden denemek yerine durur:
import paho.mqtt.client as mqtt
# Paho, 3.1.1 kodlarını 1, 2, 4, 5 -> MQTT 5 değerleri 0x84, 0x85, 0x86, 0x87 olarak eşler
FATAL = {0x84, 0x85, 0x86, 0x87}
def on_connect(client, userdata, flags, reason_code, properties):
if not reason_code.is_failure:
print("Connected, session present:", flags.session_present)
client.subscribe("connectmq/demo/4e8b/#")
return
print(f"Connection refused: {reason_code}")
if reason_code.value in FATAL:
print("Configuration problem, not retrying")
client.disconnect()
client.loop_stop()
client = mqtt.Client(
mqtt.CallbackAPIVersion.VERSION2,
client_id="connack-py-4e8b",
protocol=mqtt.MQTTv311,
)
client.on_connect = on_connect
client.connect("broker.connectmq.com", 1883, keepalive=60)
client.loop_forever()
Node.js'te Dönüş Kodlarını Ele Almak
MQTT.js, sayısal CONNACK değerini tutan bir code property'si ile bir error olayı yayınlar:
const mqtt = require("mqtt");
const client = mqtt.connect("mqtts://broker.connectmq.com:8883", {
clientId: "YOUR_CLIENT_ID",
username: "YOUR_USERNAME",
password: "YOUR_PASSWORD",
protocolVersion: 4,
reconnectPeriod: 5000,
});
client.on("connect", () => console.log("CONNACK 0: connected"));
client.on("error", (err) => {
console.error(`CONNACK ${err.code}: ${err.message}`);
if ([1, 2, 4, 5].includes(err.code)) {
client.end(true); // yapılandırma hatalarında yeniden bağlanmayı durdur
}
});
Hızlı CONNACK Sorun Giderme Kontrol Listesi
- Host'a ve porta erişebiliyor musunuz? Zaman aşımı, hiç CONNACK gönderilmediği anlamına gelir; DNS'i, güvenlik duvarını ve portu kontrol edin.
- 8883'te TLS, 1883'te düz TCP mi kullanıyorsunuz, tersi değil mi?
- Protokol sürümü açıkça belirtilmiş ve destekleniyor mu?
- Client ID boş değil, benzersiz ve kimlik bilgilerinizle birlikte verilen ID mi?
- Kullanıcı adı ve parola tam olarak verildiği gibi mi?
- Yeniden bağlanma mantığınız broker'ı sürekli zorlamak yerine 1, 2, 4 ve 5 kodlarında duruyor mu?
ConnectMQ ile Net Bağlantı Geri Bildirimi Alın
ConnectMQ, TCP 1883, TLS 8883 ve WebSocket üzerinde MQTT 3.1.1 ve 5.0'ı destekleyen tam yönetilen bir MQTT hizmetidir. Portal her broker için eşleşen kullanıcı adı, parola ve client ID üretir; bu da 2, 4 ve 5 kodlarının en yaygın nedenini ortadan kaldırır. app.connectmq.com adresinde, kredi kartı gerekmeden ücretsiz bir Serverless broker oluşturun. Broker'larda yeni misiniz? Bir MQTT broker'ın ne yaptığı yazısıyla veya eksiksiz MQTT eğitimiyle başlayın.
Sık Sorulan Sorular
CONNACK dönüş kodu 0 ne anlama gelir?
Connection accepted, yani bağlantı kabul edildi. Broker CONNECT'i kabul etmiştir ve aynı paketteki Session Present bayrağı önceki bir oturumun sürdürülüp sürdürülmediğini söyler.
4 ve 5 dönüş kodları arasındaki fark nedir?
Kod 4, kullanıcı adının veya parolanın eşleşmediği anlamına gelir. Kod 5 ise broker'ın client'ı başka bir yetkilendirme nedeniyle reddettiği anlamına gelir; örneğin bu kimlik bilgilerine bağlı olmayan bir client ID veya bağlanmasına izin verilmeyen bir hesap.
Client'ım neden hiç CONNACK almıyor?
Hiç CONNACK gelmiyorsa sorun MQTT'nin altındadır: yanlış host veya port, bir güvenlik duvarı ya da 8883 portuna düz MQTT gönderilmesi gibi bir TLS uyuşmazlığı. Dönüş kodlarına bakmadan önce bağlantıyı düzeltin.
MQTT 5 aynı CONNACK kodlarını kullanır mı?
Hayır. MQTT 5 bunları daha fazla ayrıntı taşıyan 0x86 ve 0x87 gibi reason code'larla değiştirir. Altı 3.1.1 kodu doğrudan MQTT 5 karşılıklarına eşlenir.



