Broker testleri

ESP32 MQTT Bağlantısını Adım Adım Test Edin

ESP32 MQTT'ye bağlanmıyor mu? Wi-Fi, DNS, TCP portu, client ID, kimlik bilgileri ve buffer boyutunu teşhis sketch'i ve seri loglarla tek tek test edin.

Güncellendi · 8 dk okuma

ESP32 MQTT Bağlantısını Adım Adım Test Edin

Bir ESP32 MQTT broker'ıyla konuşmayı reddettiğinde seri monitörde genellikle pek işe yaramayan tek bir satır görünür: failed, rc=-2 try again in 5 seconds. Bu durumdan çıkmanın en hızlı yolu bağlantıyı katman katman test etmek (Wi-Fi, DNS, TCP portu, MQTT el sıkışması, ardından publish) ve hata veren ilk katmanda durmaktır.

Bu rehber, Arduino core'u (PubSubClient 2.8 ile ESP32 core 3.x) için tam olarak bunu yapan bir teşhis sketch'i sunuyor, her sonucu açıklıyor ve kartın gerçekten orada olduğunu broker tarafından nasıl doğrulayacağınızı gösteriyor.

Bir bakışta kontrol listesi

AdımNe ters gidebilirNasıl görünür
1. Seri logYanlış baud hızı, hiç log yokMonitörde anlamsız karakterler veya sessizlik
2. Wi-FiYanlış SSID/parola, 5 GHz ağ, zayıf sinyalWiFi.status() hiçbir zaman WL_CONNECTED (3) olmaz
3. DNSDHCP'den DNS sunucusu gelmemesi, host adında yazım hatasıhostByName başarısız olur
4. TCP portuFirewall, yanlış port, TLS portunda düz clientPubSubClient'tan rc=-2
5. MQTT CONNECTAynı client ID, hatalı kimlik bilgileri, ACLrc=2, rc=4, rc=5
6. PublishBuffer'dan büyük paketpublish() false döndürür
7. Bağlı kalmakloop() çağrılmıyor, keep alive çok kısaBir süre sonra rc=-3

Adım 1: okunabilir bir seri log alın

Monitörü Serial.begin() ile aynı hıza ayarlayın; genel kabul 115200'dür. Arduino IDE'de ayrıca Tools → Core Debug Level ayarını Info veya Verbose yapın: böylece ESP32 core'u kendi sketch'inizin hiç görmediği Wi-Fi olaylarını ve TLS hatalarını yazdırır. PlatformIO'da monitor_speed = 115200 ve build_flags = -DCORE_DEBUG_LEVEL=4 kullanın.

Adım 2–6: teşhis sketch'i

Asıl firmware'inize dokunmadan önce bu sketch'i yükleyin. Her katmanı sırayla kontrol eder ve tam olarak nerede durduğunu yazdırır.

esp32_mqtt_check.ino
#include <WiFi.h>
#include <PubSubClient.h>

const char* WIFI_SSID = "your-ssid";
const char* WIFI_PASS = "your-wifi-password";
const char* MQTT_HOST = "broker.connectmq.com";
const uint16_t MQTT_PORT = 1883;
const char* MQTT_USER = "username";   // broker anonim erişime izin veriyorsa nullptr
const char* MQTT_PASS = "password";

WiFiClient net;
PubSubClient mqtt(net);
String clientId;

bool check() {
  Serial.println("\n[1] Wi-Fi");
  WiFi.mode(WIFI_STA);
  WiFi.begin(WIFI_SSID, WIFI_PASS);
  unsigned long t0 = millis();
  while (WiFi.status() != WL_CONNECTED && millis() - t0 < 20000) { delay(250); Serial.print('.'); }
  if (WiFi.status() != WL_CONNECTED) {
    Serial.printf("\nWi-Fi failed, status=%d\n", WiFi.status());
    return false;
  }
  Serial.printf("\nIP %s  gateway %s  RSSI %d dBm\n", WiFi.localIP().toString().c_str(),
                WiFi.gatewayIP().toString().c_str(), WiFi.RSSI());

  Serial.println("[2] DNS");
  IPAddress ip;
  if (!WiFi.hostByName(MQTT_HOST, ip)) { Serial.println("DNS lookup failed"); return false; }
  Serial.printf("%s -> %s\n", MQTT_HOST, ip.toString().c_str());

  Serial.println("[3] TCP port");
  if (!net.connect(ip, MQTT_PORT)) { Serial.println("TCP connect failed"); return false; }
  Serial.println("TCP OK");
  net.stop();

  Serial.println("[4] MQTT CONNECT");
  clientId = "esp32-" + WiFi.macAddress();
  clientId.replace(":", "");
  mqtt.setServer(MQTT_HOST, MQTT_PORT);
  mqtt.setBufferSize(1024);
  mqtt.setKeepAlive(30);
  if (!mqtt.connect(clientId.c_str(), MQTT_USER, MQTT_PASS)) {
    Serial.printf("MQTT failed, rc=%d\n", mqtt.state());
    return false;
  }
  Serial.printf("MQTT OK as %s\n", clientId.c_str());

  Serial.println("[5] PUBLISH");
  String topic = "testmqtt/esp32-check/" + clientId + "/hello";
  bool ok = mqtt.publish(topic.c_str(), "ESP32 connection test passed");
  Serial.printf("publish to %s: %s\n", topic.c_str(), ok ? "OK" : "FAILED");
  return ok;
}

void setup() {
  Serial.begin(115200);
  delay(1000);
  Serial.println(check() ? "\nALL CHECKS PASSED" : "\nCHECK FAILED - see the last step above");
}

void loop() {
  mqtt.loop();
}

Sonuçları okumak

Wi-Fi durum kodları

statusAnlamıÇözüm
1 WL_NO_SSID_AVAILAğ bulunamadıSSID yazımını kontrol edin; ağın 2,4 GHz'de yayın yaptığından emin olun
4 WL_CONNECT_FAILEDReddedildi, genellikle yanlış parolaParolayı yeniden yazın; yalnızca WPA3 kullanan ağlar WPA2/WPA3 karma mod gerektirebilir
6 WL_DISCONNECTEDHâlâ deniyor veya bağlantı koptuYaklaştırın; yaklaşık -80 dBm altındaki RSSI güvenilir değildir

İyi bir RSSI kabaca -50 ile -70 dBm arasındadır. Wi-Fi bağlanıp sonra kopuyorsa ESP32 Wi-Fi ve MQTT kopmaları yazısına bakın.

DNS ve TCP

DNS lookup failed, kartın DHCP'den kullanılabilir bir DNS sunucusu almadığı ya da host adının yanlış olduğu anlamına gelir. Aynı adı aynı ağdaki bir dizüstü bilgisayardan nslookup broker.connectmq.com ile kontrol edin. Geçici bir test olarak IP ile bağlanabilirsiniz, ama bunu üretime göndermeyin.

TCP connect failed (ve kendi firmware'inizde rc=-2), o host ve portta hiçbir şeyin yanıt vermediği anlamına gelir. Sık görülen nedenler: 1883'ü engelleyen bir misafir ağı veya kurumsal firewall, portta yazım hatası ya da 8883 portunun düz bir WiFiClient ile kullanılması; TLS portları ESP32 ile TLS üzerinden MQTT yazısında gösterildiği gibi WiFiClientSecure ve bir CA sertifikası gerektirir. Aynı Wi-Fi'daki bir dizüstünden nc -vz broker.connectmq.com 1883 ile doğrulayın.

PubSubClient dönüş kodları

rcSabitOlası neden
-4MQTT_CONNECTION_TIMEOUTCONNACK zamanında gelmedi veya keep alive süresi doldu
-3MQTT_CONNECTION_LOSTBağlantı koptu; loop() yeterince sık çağrılmıyor
-2MQTT_CONNECT_FAILEDTCP bağlantısı başarısız (yukarıya bakın)
-1MQTT_DISCONNECTEDTemiz bağlantı kesme / hiç bağlanmadı
1MQTT_CONNECT_BAD_PROTOCOLBroker MQTT 3.1.1 kabul etmiyor
2MQTT_CONNECT_BAD_CLIENT_IDClient ID reddedildi (boş, çok uzun, geçersiz karakterler)
3MQTT_CONNECT_UNAVAILABLEBroker kullanılamıyor
4MQTT_CONNECT_BAD_CREDENTIALSKullanıcı adı veya parola yanlış
5MQTT_CONNECT_UNAUTHORIZEDYetkisiz: kimlik bilgileri eksik veya client'a izin verilmiyor

Pozitif değerler broker'ın kendi CONNACK yanıtıdır; yani ağ sorunsuzdur ve geriye yalnızca yapılandırma kalır. Reason code referansı karşılık gelen MQTT kodlarını listeler, PubSubClient bağlanmıyor yazısı da her birini ayrıntılı ele alır.

publish() false döndürüyor

PubSubClient'ın varsayılan buffer'ı 256 bayttır ve paketin tamamını taşımalıdır: başlık, topic ve payload. Uzun bir topic üzerindeki 200 baytlık bir JSON payload bile bunu aşar ve publish() broker'a hiçbir şey ulaşmadan sadece false döndürür. Bağlanmadan önce setBufferSize() çağırın; paket boyutu hesaplayıcı bir paketin gerçekte ne kadar büyük olduğunu gösterir.

Adım 7: bağlı kalmak

mqtt.loop() sık çalışmalıdır, keep alive aralığı başına en az birkaç kez. loop() içindeki bir delay(60000) ya da bloklayan bir sensör okuması, broker hiçbir PINGREQ almadığı için yaklaşık bir buçuk keep alive süresi sonunda rc=-3 hatasını garanti eder. Uzun gecikmeleri millis() tabanlı zamanlayıcılarla değiştirin ve bir while (!mqtt.connected()) döngüsünde bloklamak yerine backoff ile yeniden bağlanın.

Broker tarafından doğrulayın

"OK" yazan bir seri satır, cihazın kendi görüşüdür. Bağımsız olarak doğrulayın: online MQTT client aracını açın, aynı broker'a bağlanın ve testmqtt/esp32-check/# topic'ine subscribe olun. Kartı resetleyin; hello mesajının birkaç saniye içinde gelmesi gerekir. Terminalden aynı kontrol şöyledir:

ESP32'nin test mesajını bekleyin
mosquitto_sub -h broker.connectmq.com -p 1883 \
  -u "$MQTT_USER" -P "$MQTT_PASS" \
  -t 'testmqtt/esp32-check/#' -v

ESP32'nizi tarayıcıda bekleyin

ESP32'deki MQTT sorunlarının çoğu aslında MQTT sorunu değildir; tek bir dönüş kodunun arkasına saklanmış Wi-Fi, DNS veya port sorunlarıdır. Her seferinde bir katmanı test edin, status veya rc değerini tam olarak okuyun ve asıl firmware'inize geçmeden önce broker tarafında doğrulayın. Arduino kurulumunun tamamı için Arduino ile ESP32 MQTT yazısıyla devam edin.

Sıkça sorulan sorular

ESP32'de "failed, rc=-2" ne anlama gelir?

PubSubClient'ın MQTT_CONNECT_FAILED kodudur: broker'a TCP bağlantısı açılamamıştır. Sebep MQTT'nin altındadır: Wi-Fi yok, host veya port yanlış, DNS hatası, bir firewall ya da düz WiFiClient ile kullanılan bir TLS portu.

ESP32'm bağlanıyor ama publish() neden false döndürüyor?

Çoğunlukla mesaj, topic ve başlık dahil varsayılan olarak 256 bayt olan PubSubClient buffer'ından büyüktür. Bağlanmadan önce setBufferSize(1024) veya daha büyük bir değer çağırın ve her publish'in dönüş değerini kontrol edin.

ESP32 MQTT için 5 GHz Wi-Fi destekliyor mu?

Klasik ESP32, S2, S3 ve C3 yalnızca 2,4 GHz radyoya sahiptir, bu yüzden sadece 5 GHz yayın yapan bir ağa katılamaz. ESP32-C5 gibi yeni çipler çift bantlıdır. MQTT'de hata ayıklamadan önce kullandığınız modülü kontrol edin.