MQTT client ID, bir istemcinin CONNECT içinde gönderdiği tanımlayıcıdır ve broker bağlantıları ve oturumları birbirinden ayırt etmek için bunu kullanır. Bu rehber, aynı kimliğe sahip iki istemcinin neden sürekli birbirinin bağlantısını kestiğini, tek bir prototipten koca bir filoya ölçeklenen kimlik formatlarının nasıl tasarlanacağını ve herkese açık bir broker'da test ederken oturum devralmalarının nasıl hızlıca teşhis edileceğini açıklıyor.
MQTT Client ID Ne İçin Kullanılır?
Her CONNECT paketi bir Client Identifier alanı taşır. MQTT broker bunu üç şey için kullanır:
- Bağlantı benzersizliği. Aynı anda client ID başına yalnızca bir ağ bağlantısı etkin olabilir.
- Oturum arama. Kalıcı oturum durumu (abonelikler ve kuyruktaki mesajlar) client ID altında saklanır.
- Operasyonlar. Loglar, bağlantı olayları ve izleme topic'leri istemcilere kimlikleriyle atıfta bulunur.
Client ID kendi başına bir kimlik doğrulama bilgisi değildir. Broker kimlikleri kimlik bilgilerine bağlamadığı sürece bağlanabilen herkes herhangi bir kimliği talep edebilir. ConnectMQ özel broker'larında client ID'ler portalda verilen kimlik bilgilerine bağlıdır; bu nedenle başka bir kullanıcı cihazınızın kimliğini yeniden kullanamaz.
Aynı Client ID'ler Neden Birbirini Atar?
Spesifikasyon bu konuda açıktır: bir istemci zaten bağlı olan bir kimlikle bağlanırsa broker mevcut istemcinin bağlantısını kesmek zorundadır. Buna oturum devralma (session takeover) denir. Bu mekanizma, bağlantısını sessizce kaybetmiş bir cihazın eski soketin zaman aşımına uğramasını beklemeden hemen yeniden bağlanabilmesi için vardır.
Sorun, iki farklı istemci aynı kimliği paylaştığında ortaya çıkar. Akış şöyle ilerler:
- İstemci A,
sensor-01olarak bağlanır. - İstemci B,
sensor-01olarak bağlanır. Broker A'nın bağlantısını keser. - A'nın otomatik yeniden bağlanması tetiklenir ve
sensor-01olarak bağlanır. Broker B'nin bağlantısını keser. - B yeniden bağlanır... ve döngü birkaç saniyede bir tekrarlanır.
Belirtiler arasında sürekli connect/disconnect logları, kaçırılan mesajlar, tekrar tekrar tetiklenen will mesajları ve yanıp sönen bir "çevrimiçi/çevrimdışı" göstergesi bulunur. MQTT 5'te atılan istemci 0x8E (Session taken over) reason code'lu bir DISCONNECT alır; bu da soketin doğrudan kapandığı 3.1.1'e kıyasla teşhisi çok daha kolaylaştırır.
Yaygın Nedenler
- Sabit kodlanmış bir kimlikle birçok karta yüklenen aynı firmware imajı.
testveyaesp32clientgibi bir kimlik içeren, kopyala-yapıştır yapılmış örnek kod.- Aynı yapılandırılmış kimlikle birkaç container'da veya pod'da çalışan bir servis.
- Aynı betiği iki terminalde çalıştıran bir geliştirici.
- Hem bir masaüstü MQTT aracının hem de bir cihazın cihazın kimliğini kullanması.
Bir MQTT Client ID Formatı Tasarlamak
İyi kimlikler benzersiz, kararlı, okunabilir ve her broker için güvenlidir.
Format Kuralları
| Kural | Neden |
|---|---|
Yalnızca a-z, A-Z, 0-9, - ve _ kullanın |
Her broker bu karakterleri kabul etmek zorundadır |
| Kısa tutun, ideal olarak 23 karakter veya daha az | MQTT 3.1.1 yalnızca 23 bayta kadar desteği garanti eder; çoğu broker daha fazlasına izin verir |
| Üretimde asla boş bırakmayın | Boş kimlikler kalıcı oturumları engeller ve birçok broker bunları reddeder |
| Oturum kullanan cihazlarda kararlı tutun | Değişen bir kimlik her seferinde yeni bir oturum demektir |
| Çalışan her örnek için benzersiz yapın | Devralma döngülerini önler |
| Gizli bilgilerden ve kişisel verilerden kaçının | Kimlikler loglarda ve izleme araçlarında görünür |
İşe Yarayan Kalıplar
- Cihazlar: bir önek artı donanımdan türetilmiş bir tanımlayıcı; örneğin
env-artı MAC adresinin son baytları (env-a4cf12b3) veya üretim veritabanınızdaki bir seri numarası. - Backend servisleri: servis adı artı örnek tanımlayıcısı; örneğin bir StatefulSet sıra numarasından gelen
alarm-worker-0. Örnekler tamamen birbirinin yerine geçebiliyorsa ve oturuma ihtiyaç duymuyorsa rastgele bir sonek de uygundur. - Tarayıcı dashboard'ları: sekme başına bir önek artı rastgele bir dize ve temiz oturumlar; çünkü kimsenin bir dashboard'un oturumunu sürdürmesi gerekmez.
- Test betikleri: her çalıştırmada rastgele bir sonek; örneğin
test-artı 6 rastgele hex karakter.
Kimlikleri Kodda Üretmek
Kararlı bir cihaz kimliği için MAC adresini veya test istemcileri için rastgele bir token'ı kullanan Python:
import secrets
import uuid
import paho.mqtt.client as mqtt
def device_client_id(prefix: str = "env") -> str:
mac = uuid.getnode() # int olarak 48 bitlik donanım adresi
return f"{prefix}-{mac:012x}" # ör. env-a4cf12b3c4d5
def test_client_id(prefix: str = "test") -> str:
return f"{prefix}-{secrets.token_hex(3)}" # ör. test-9f2c1a
client_id = device_client_id()
client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2,
client_id=client_id,
protocol=mqtt.MQTTv5)
print("Using client ID:", client_id)
Kimliği efuse MAC adresinden türeten PubSubClient'lı ESP32:
#include <WiFi.h>
#include <PubSubClient.h>
WiFiClient net;
PubSubClient mqttClient(net);
String makeClientId() {
uint64_t mac = ESP.getEfuseMac();
char id[24];
snprintf(id, sizeof(id), "env-%04x%08x",
(uint16_t)(mac >> 32), (uint32_t)mac);
return String(id);
}
void connectMqtt() {
String clientId = makeClientId();
mqttClient.setServer("broker.connectmq.com", 1883);
while (!mqttClient.connected()) {
if (mqttClient.connect(clientId.c_str())) {
Serial.println("Connected as " + clientId);
} else {
Serial.printf("Failed, state=%d. Retrying in 5 s\n", mqttClient.state());
delay(5000);
}
}
}
Wi-Fi dahil kartın tam kurulumu ESP32 MQTT eğitiminde yer alıyor.
Boş Client ID'ler ve Atanan Kimlikler
MQTT 3.1.1, sıfır uzunluklu bir client ID'ye yalnızca clean session true olarak ayarlandığında izin verir; bu durumda broker dahili olarak bir kimlik üretir. MQTT 5 bir adım daha ileri gider: broker CONNACK içinde bir Assigned Client Identifier döndürür, böylece istemci kendi adını öğrenir. Bu tek kullanımlık istemciler için kullanışlıdır, ancak kontrol etmediğiniz bir kimlikle yeniden bağlanamayacağınız için kalıcı oturumları imkânsız kılar. ConnectMQ herkese açık broker'ı dahil birçok broker boş olmayan bir kimliği zorunlu tutar; bu zaten daha güvenli bir alışkanlıktır.
Client ID Devralması Nasıl Tespit Edilir?
İşte herkese açık MQTT test broker'ında tekrarlanabilir bir test. Kendi rastgele sonekinizi kullanın ve herkese açık alanın herkes tarafından okunabildiğini unutmayın.
- Birinci terminalde bir kimlik ve debug çıktısıyla bağlanın:
mosquitto_sub -h broker.connectmq.com -p 1883 -V mqttv5 \
-i dup-demo-k7q1 -d -t 'connectmq/demo/k7q1/#'
- İkinci terminalde tam olarak aynı komutu çalıştırın.
- Birinci terminalin bağlantısı hemen kesilir;
-dile broker'ın bağlantıyı kapattığını görebilirsiniz. mosquitto sürümünüze bağlı olarak ya çıkar ya da yeniden bağlanır; ikinci durumda iki terminal birbirini atmaya başlar ki bu tam olarak yukarıda anlatılan döngüdür. - Üçüncü bir terminalde broker'ın bu istemciye dair görünümünü izleyin:
mosquitto_sub -h broker.connectmq.com -p 1883 -i watcher-k7q1 -v \
-t '$SYS/broker/connection/dup-demo-k7q1/state'
Üretimde cihazlar sürekli bağlanıp koptuğunda kullanabileceğiniz hızlı bir kontrol listesi:
- Şüpheli tüm cihazlardan client ID'leri toplayın ve yinelenenleri arayın.
- Bağlantı kesilme reason code'larının 0x8E (session taken over) gösterip göstermediğini kontrol edin.
- Bağlantı durumu değişikliklerini her cihazın yeniden bağlanma zaman damgalarıyla karşılaştırın; dönüşümlü kalıplar tek bir kimlik için kavga eden bir çifti ortaya çıkarır.
- Bir cihazın kimliğini kullanıyor olabilecek masaüstü araçlarını veya VS Code oturumlarını kapatın.
- Kimlikler benzersiz olduğu halde kopmalar devam ediyorsa bunun yerine keep alive ve ağ zaman aşımlarına bakın.
Üretimde MQTT Client ID'leri
Birkaç operasyonel alışkanlık, client ID kaynaklı olayların çoğunu önler. Kimlikleri çalışma zamanında değil, provizyon sırasında üretin; böylece aynı cihaz fabrika ayarlarına sıfırlandıktan sonra bile hep aynı kimliği alır. Destek ekibinin log kayıtlarını donanımla eşleştirebilmesi için kimliği cihazın kimlik bilgilerinin yanında saklayın. Arızalı bir birimi değiştirdiğinizde yeni cihazın eski kimliği (ve oturumunu) devralıp almayacağına ya da yeni bir kimlik alıp almayacağına bilinçli olarak karar verin. Servislerde örnek tanımlayıcısının, her replikanın paylaştığı bir yapılandırma dosyasından değil orkestratörünüzden gelmesini sağlayın.
Filolar büyüdükçe client ID'leri provizyon sürecinizin bir parçası olarak ele alın: seri numaralarıyla birlikte kaydedin, donanımdan türetin ve bir kimliği asla farklı bir fiziksel cihaz için yeniden kullanmayın. MQTT'yi sıfırdan öğreniyorsanız MQTT eğitimi kimliklerin, oturumların ve topic'lerin nasıl bir araya geldiğini açıklıyor.
Client ID'leri ConnectMQ ile Güvenle Yönetin
ConnectMQ, oluşturduğunuz her broker için bir kullanıcı adı, parola ve client ID veren ve diğer kiracıların bunları ele geçirememesi için client ID'leri bu kimlik bilgilerine bağlayan tamamen yönetilen bir MQTT servisidir. Bağlantı durumu portalda canlı olarak görülebilir; bu da devralma döngülerini fark etmeyi kolaylaştırır. Kredi kartı gerektirmeden ücretsiz bir Serverless broker oluşturun ve YOUR_USERNAME, YOUR_PASSWORD ve YOUR_CLIENT_ID ile bağlanın.
Sık Sorulan Sorular
İki MQTT istemcisi aynı client ID'yi kullanırsa ne olur?
Broker zaten bağlı olan istemcinin bağlantısını keser ve yenisini tutar. Her iki istemci de otomatik yeniden bağlanıyorsa bir döngü içinde birbirlerini atmaya devam ederler.
Bir MQTT client ID ne kadar uzun olabilir?
MQTT 3.1.1, harf ve rakamlardan oluşan 1 ila 23 baytlık kimlikleri desteklemeyi garanti eder; broker'lar daha uzun kimliklere ve daha fazla karaktere izin verebilir. Kimlikleri kısa ve tirelerle birlikte alfanümerik tutmak en taşınabilir seçimdir.
MQTT client ID rastgele mi olmalı?
Oturuma ihtiyaç duymayan kısa ömürlü veya birbirinin yerine geçebilen istemciler için rastgele bir kimlik kullanın. Kalıcı oturumlara dayanan cihazlar ve servisler, yeniden bağlanmalar boyunca aynı kalan kararlı ve benzersiz bir kimliğe ihtiyaç duyar.
Client ID bir güvenlik kimlik bilgisi midir?
Hayır. Onu yalnızca bir tanımlayıcı olarak görün ve her zaman kullanıcı adı ve parola veya sertifikalarla kimlik doğrulaması yapın; ConnectMQ'nun yaptığı gibi kimlikleri kimlik bilgilerine bağlayan broker'lar, kimliğe bürünmeye karşı ek koruma sağlar.



