Bu MQTT eğitimi, sizi tek oturumda sıfırdan çalışan bir publish/subscribe kurulumuna taşır. MQTT'yi çalıştıran bir avuç kavramı öğrenecek, ardından her adımı ücretsiz public broker broker.connectmq.com üzerinde komut satırı, Python ve tarayıcı ile gerçekten uygulayacaksınız. Sonunda topic tasarlamayı, QoS seviyesi seçmeyi, retained message ve Last Will kullanmayı ve ne zaman özel bir broker'a geçmeniz gerektiğini bileceksiniz.
MQTT Nedir ve Neden Öğrenmelisiniz?
MQTT, TCP üzerinde çalışan hafif bir publish/subscribe mesajlaşma protokolüdür. Güvenilmez ağlar ve küçük cihazlar için tasarlanmıştır; bu yüzden bugün IoT'nin varsayılan dili hâline gelmiştir: sensörler, gateway'ler, PLC adaptörleri, mobil uygulamalar ve backend servisleri hep bu dili konuşur. Güncel sürümler MQTT 3.1.1 ve MQTT 5.0'dır; ikisi de OASIS tarafından standartlaştırılmıştır (tam metin mqtt.org üzerinde yayımlanır).
Popülerliğini üç özellik açıklar:
- Çok düşük ek yük. Bir paketin sabit başlığı iki bayt kadar küçük olabilir; bu sayede MQTT hücresel bağlantılarda, uydu üzerinden ve yoğun Wi-Fi ağlarında çalışır.
- Ayrıştırma (decoupling). Yayıncılar abonelerle asla doğrudan konuşmaz. Birbirlerinin IP adreslerini bilmeleri gerekmez, hatta aynı anda çevrimiçi olmaları bile gerekmez.
- Sorgulama değil, itme (push). Bir client abone olduktan sonra veri, yayımlandığı anda gelir. Pil ve bant genişliği tüketen bir istek döngüsü yoktur.
İşe koyulmadan önce paket akışına daha yakından bakmak isterseniz MQTT'nin perde arkasında nasıl çalıştığını okuyun. Aksi hâlde devam edin: aşağıdaki kavramlar gerçek sistemler kurmak için yeterlidir.
Beş Dakikada Temel Kavramlar
Broker
Broker, ortadaki sunucudur. Her client ona uzun ömürlü tek bir TCP bağlantısı açar ve broker yayımlanan her mesajı aboneliği eşleşen tüm client'lara yönlendirir. Ayrıca oturumları takip eder, retained message'ları saklar ve Last Will mesajlarını tetikler. Bir mesaj kuyruğundan farkı dahil olmak üzere bir MQTT broker'ın ne yaptığına dair ayrıntılı açıklama için özel rehberimize göz atın.
Client'lar
Broker'a bağlanan her şey bir client'tır: bir ESP32, bir Python betiği, bir Node-RED akışı, tarayıcıdaki bir dashboard. Bir client publish, subscribe ya da her ikisini birden yapabilir. Her bağlantı, broker'ın oturumu tanımlamak için kullandığı bir client ID taşır. Aynı ID'ye sahip iki client birbirini bağlantıdan düşürür; bu yüzden ID'yi her zaman benzersiz yapın.
Topic'ler
Topic, eğik çizgiyle ayrılmış seviyelerden oluşan bir UTF-8 dizesidir; örneğin factory1/line2/press3/temperature. Topic'ler önceden oluşturulmaz; biri onlara yayın yaptığı anda var olurlar. İyi topic tasarımı bir MQTT projesindeki en önemli karardır; bu yüzden konuyu MQTT topic adlandırma kuralları yazımızda ayrıntılı olarak ele alıyoruz.
Publish ve Subscribe
Yayıncı bir topic'e mesaj gönderir. Abone bir topic filtresine ilgisini kaydeder. Broker ikisini eşleştirir. Bu, publish/subscribe modelidir ve tek bir cihaza dokunmadan yeni bir dashboard ya da yeni bir veritabanı yazıcısı eklemenizi sağlayan da budur.
Wildcard'lar
Aboneler iki wildcard kullanabilir:
+tam olarak bir seviyeyle eşleşir:factory1/+/press3/temperature#kalan tüm seviyelerle eşleşir ve en sonda olmalıdır:factory1/#
Yayıncılar wildcard kullanamaz. $SYS topic'leriyle ilgili uç durumlar dahil tüm eşleşme kuralları MQTT wildcard'ları rehberimizde yer alıyor.
Adım 1: Bu MQTT Eğitimi İçin Bir Broker Seçin
Konuşacağınız bir broker'a ihtiyacınız var. Yerel olarak kurmak da işe yarar, ancak ilk saatinize güvenlik duvarı, port ve servis yönetimi ekler. En hızlı yol bir public test broker'ıdır. Bu eğitimde ConnectMQ tarafından işletilen ücretsiz public MQTT broker broker.connectmq.com'u kullanıyoruz. Tüm standart portlarda anonim bağlantıları kabul eder:
| Taşıma | Port | URL | Kullanım alanı |
|---|---|---|---|
| TCP üzerinden MQTT | 1883 | mqtt://broker.connectmq.com:1883 | CLI araçları, hızlı testler |
| TLS üzerinden MQTT | 8883 | mqtts://broker.connectmq.com:8883 | Şifreli cihaz ve sunucu bağlantıları |
| WebSocket | 8083 | ws://broker.connectmq.com:8083/mqtt | Yerel web denemeleri |
| Güvenli WebSocket | 8084 | wss://broker.connectmq.com:8084/mqtt | Tarayıcılar ve HTTPS sayfaları |
Başlamadan önce bilmeniz gereken kurallar:
- Her bağlantıda boş olmayan, benzersiz bir client ID kullanın.
- Tüm topic'lerin başına başkasının kullanmayacağı bir önek ekleyin; örneğin
connectmq/demo/<random-id>/. Rastgele ID'nizi şimdi seçin, örneğina7k2q9. - Public alandaki her şeyi herkes okuyabilir. Asla parola, kişisel veri veya hassas herhangi bir şey yayımlamayın.
- Public broker'ın limitleri vardır: mesaj başına 64 KB, client başına saniyede 10 mesaj, client başına 10 abonelik, en fazla 8 topic seviyesi ve en geç 30 dakikada sona eren oturumlar. Bu limitler öğrenmek için cömert, production için ise bilerek küçük tutulmuştur.
Bu dört portun neden var olduğunu ve kurumsal bir güvenlik duvarının arkasında hangisini seçmeniz gerektiğini anlamak istiyorsanız MQTT portları yazımızı okuyun.
Adım 2: Komut Satırından İlk Publish ve Subscribe İşleminiz
Mosquitto komut satırı client'ları, MQTT'yi çalışırken görmenin en basit yoludur. Paket yöneticinizle kurun:
# Debian / Ubuntu / Raspberry Pi OS
sudo apt install mosquitto-clients
# macOS (Homebrew)
brew install mosquitto
Windows'ta Mosquitto projesinin yükleyicisi mosquitto_pub.exe ve mosquitto_sub.exe dosyalarını içerir.
Bir terminal açın ve önekinizin altındaki her şeye abone olun. -v bayrağı her payload'ın yanına topic'i yazdırır:
mosquitto_sub -h broker.connectmq.com -p 1883 -i sub-a7k2q9 \
-t "connectmq/demo/a7k2q9/#" -v
İkinci bir terminal açın ve yayın yapın:
mosquitto_pub -h broker.connectmq.com -p 1883 -i pub-a7k2q9 \
-t "connectmq/demo/a7k2q9/room1/temperature" -m "21.5"
İlk terminal hemen connectmq/demo/a7k2q9/room1/temperature 21.5 çıktısını verir. MQTT döngüsünün tamamı budur: bağlan, abone ol, yayımla, al.
Şimdi şifreli portu deneyin. broker.connectmq.com bir Let's Encrypt sertifikası kullandığı için sisteminizin CA paketi bu sertifikayı doğrulayabilir:
mosquitto_pub -h broker.connectmq.com -p 8883 --capath /etc/ssl/certs \
-i pub-tls-a7k2q9 -t "connectmq/demo/a7k2q9/room1/humidity" -m "48"
macOS veya Windows'ta --capath yerine --cafile ile bir CA paket dosyasını gösterin.
Adım 3: QoS, Retained Message ve Last Will
Bu üç özellik, MQTT'yi sıradan bir soketten ayıran şeydir. Her birini şimdi deneyin.
Hizmet Kalitesi (QoS)
Her publish ve abonelik bir QoS seviyesi taşır:
| QoS | Garanti | Paket akışı | Tipik kullanım |
|---|---|---|---|
| 0 | En fazla bir kez | PUBLISH | Kaçırılan bir örneğin önemli olmadığı yüksek frekanslı telemetri |
| 1 | En az bir kez | PUBLISH, PUBACK | IoT verilerinin ve komutlarının çoğu; yinelenen mesajlar mümkündür |
| 2 | Tam olarak bir kez | PUBLISH, PUBREC, PUBREL, PUBCOMP | Faturalama olayları, sayaçlar, asla yinelenmemesi gereken her şey |
Bir abone için geçerli QoS, publish QoS'u ile abonelik QoS'undan düşük olanıdır. Onaylı teslimatı görmek için -q 1 ile yayın yapın ve -q 1 ile abone olun. QoS 0, 1 ve 2 arasında seçim rehberimiz, gerçek hata senaryolarıyla avantaj ve dezavantajları adım adım anlatır.
Retained Message'lar
Retained message, broker tarafından bir topic'in "bilinen son değeri" olarak saklanır ve her yeni aboneye anında teslim edilir. Bir tane yayımlayın:
mosquitto_pub -h broker.connectmq.com -p 1883 -i pub-a7k2q9 -r \
-t "connectmq/demo/a7k2q9/room1/setpoint" -m "22"
Şimdi yeni bir abone başlatın. Bağlandıktan sonra hiçbir şey yayımlanmamış olsa bile 22 değerini hemen alır. Bir retained message'ı temizlemek için retain bayrağıyla boş bir payload yayımlayın: -r -n. Retained message'ların kafa karıştırdığı durumlar dahil daha fazla kalıp MQTT retained message'ları yazımızda.
Last Will and Testament
Bir client bağlanırken bir "vasiyet" (will) mesajı kaydedebilir. Client düzgün bir bağlantı kesme olmadan ortadan kaybolursa (elektrik kesintisi, ağ kopması, çökme) broker vasiyeti onun adına yayımlar. Bunu retained bir "online" mesajıyla birleştirdiğinizde güvenilir bir cihaz varlık takibi elde edersiniz:
mosquitto_sub -h broker.connectmq.com -p 1883 -i dev-a7k2q9 \
-t "connectmq/demo/a7k2q9/room1/cmd" \
--will-topic "connectmq/demo/a7k2q9/room1/status" \
--will-payload "offline" --will-retain --will-qos 1 -k 10
Bu süreci terminalinizin kapatma düğmesiyle sonlandırın (bazı derlemelerde yine de düzgün bir bağlantı kesme gönderebilen Ctrl+C ile değil) ve yaklaşık bir buçuk keep-alive aralığı sonra wildcard abonenize offline mesajının geldiğini izleyin.
Adım 4: Aynı MQTT Eğitimi Python ile
Komut satırı keşfetmek için harikadır; gerçek projeler ise bir kütüphane kullanır. paho-mqtt 2.x'i kurun:
pip install "paho-mqtt>=2.0"
Bu betik MQTT 5 ile bağlanır, kendi komut topic'ine abone olur, her beş saniyede bir okuma yayımlar ve varlığını retained bir durum mesajı ile Last Will kullanarak duyurur:
import json
import random
import time
import uuid
import paho.mqtt.client as mqtt
BROKER = "broker.connectmq.com"
PREFIX = "connectmq/demo/a7k2q9"
CLIENT_ID = f"tutorial-py-{uuid.uuid4().hex[:8]}"
def on_connect(client, userdata, flags, reason_code, properties):
if reason_code.is_failure:
print(f"Connect failed: {reason_code}")
return
print("Connected as", CLIENT_ID)
client.publish(f"{PREFIX}/room1/status", "online", qos=1, retain=True)
client.subscribe(f"{PREFIX}/room1/cmd", qos=1)
def on_message(client, userdata, msg):
print(f"Command on {msg.topic}: {msg.payload.decode()}")
def on_disconnect(client, userdata, flags, reason_code, properties):
print(f"Disconnected: {reason_code}")
client = mqtt.Client(
mqtt.CallbackAPIVersion.VERSION2,
client_id=CLIENT_ID,
protocol=mqtt.MQTTv5,
)
client.will_set(f"{PREFIX}/room1/status", "offline", qos=1, retain=True)
client.on_connect = on_connect
client.on_message = on_message
client.on_disconnect = on_disconnect
client.tls_set() # Let's Encrypt sertifikasını sistem CA'larıyla doğrula
client.connect(BROKER, 8883, keepalive=30)
client.loop_start()
try:
while True:
reading = {"temperature": round(random.uniform(19, 24), 2), "ts": int(time.time())}
client.publish(f"{PREFIX}/room1/telemetry", json.dumps(reading), qos=1)
time.sleep(5)
except KeyboardInterrupt:
client.publish(f"{PREFIX}/room1/status", "offline", qos=1, retain=True).wait_for_publish()
client.disconnect()
client.loop_stop()
mosquitto_sub terminalinizi açık bırakın; telemetrinin aktığını göreceksiniz. mosquitto_pub -t "connectmq/demo/a7k2q9/room1/cmd" -m "reboot" ile geri bir komut gönderin, betik bunu yazdırır. paho 2.x ayrıntılarına dikkat edin: CallbackAPIVersion.VERSION2 zorunludur ve callback'ler reason_code ile properties argümanlarını alır. Eski 1.x örneklerini karıştırmak, buradaki hataların en yaygın kaynağıdır.
Adım 5: WebSocket ile Tarayıcıda MQTT
Tarayıcılar ham TCP soketleri açamaz; bu yüzden MQTT'yi WebSocket üzerinden konuşurlar. Bunu index.html olarak kaydedin ve herhangi bir modern tarayıcıda açın:
// Önce HTML'inizde MQTT.js'i bir CDN'den yükleyin:
// <script src="https://unpkg.com/mqtt@5.10.1/dist/mqtt.min.js"></script>
const clientId = "tutorial-web-" + Math.random().toString(16).slice(2, 10);
const prefix = "connectmq/demo/a7k2q9";
const client = mqtt.connect("wss://broker.connectmq.com:8084/mqtt", {
clientId,
protocolVersion: 5,
clean: true,
reconnectPeriod: 2000,
});
client.on("connect", () => {
console.log("Connected", clientId);
client.subscribe(`${prefix}/#`, { qos: 1 });
client.publish(`${prefix}/room1/cmd`, "hello from the browser", { qos: 1 });
});
client.on("message", (topic, payload) => {
console.log(topic, payload.toString());
});
client.on("error", (err) => console.error("MQTT error", err.message));
Geliştirici konsolunu açın; Python telemetrisini, retained setpoint ve durum mesajlarını ve kendi komutunuzun geri yansımasını göreceksiniz. HTTPS sayfalarından kullanılması gereken, /mqtt yoluyla birlikte 8084 portudur; çünkü tarayıcılar güvenli kaynaklardan yapılan güvensiz WebSocket bağlantılarını engeller. WebSocket üzerinden MQTT rehberimiz tarayıcıda proxy'leri, framework'leri ve kimlik doğrulamayı ele alır.
Ölçeklenen Topic ve Payload Tasarımı
Mesajlar akmaya başladığında sistemin bakımı kolay kalıp kalmayacağını tasarım belirler. Pratikte işe yarayan birkaç kural:
- Genelden özele gidin.
site/area/line/device/measurementyapısı, tek bir wildcard ile bütün bir hatta abone olmanızı sağlar. - Eğik çizgiyle başlamayın.
/factory/line1her filtreyi karmaşıklaştıran boş bir ilk seviye oluşturur. - Tanımlayıcıları sabit tutun. Değişecek insan dostu adlar yerine cihaz ID'leri kullanın.
- Veriyi komutlardan ayırın.
.../telemetry,.../statusve.../cmdayrı topic'ler olmalıdır ki izinler ve QoS farklılaşabilsin. - Tek bir payload formatı seçin. JSON okunabilir ve hata ayıklaması kolaydır; Protobuf gibi ikili formatlar kısıtlı bağlantılarda bant genişliği tasarrufu sağlar. Hangisini seçerseniz seçin, bir zaman damgası ve birimler ekleyin.
- Her okuma için ayrı topic kullanmaktan kaçının. Her saniye on değeri on ayrı topic'e yayımlamak paket ek yükünü katlar; küçük bir JSON nesnesi genellikle daha iyidir.
Endüstriyel sistemlerde ISA-95 ile uyumlu bir hiyerarşi (kurum, saha, alan, hat, hücre) yaygın bir kural hâline gelmiştir ve Sparkplug B ve Unified Namespace yazımızda açıklanan Unified Namespace kalıbının temelini oluşturur.
Yeni Başlayanların Sık Yaptığı Hatalar ve Çözümleri
| Belirti | Olası neden | Çözüm |
|---|---|---|
| İki client sürekli birbirini düşürüyor | Aynı client ID iki kez kullanılmış | Her süreç için benzersiz bir ID üretin; bkz. MQTT client ID kuralları |
| Abone hiçbir şey almıyor | Topic'te yazım hatası veya büyük/küçük harf uyuşmazlığı | Topic'ler büyük/küçük harfe duyarlıdır; gerçekte neyin geldiğini görmek için prefix/#'e abone olun |
| Mesajlar iki kez geliyor | Yeniden bağlantı sonrası QoS 1 yeniden teslimatı | Tüketicileri idempotent yapın veya yinelemenin önemli olduğu yerlerde QoS 2 kullanın |
| 8883 portunda bağlantı reddediliyor | Client'ta TLS yapılandırılmamış | TLS'i etkinleştirin (tls_set(), mqtts://) veya düz testler için 1883 portunu kullanın |
| Tarayıcı bağlanamıyor | HTTPS sayfasından ws:// kullanımı veya eksik /mqtt yolu |
wss://broker.connectmq.com:8084/mqtt kullanın |
| Eski retained değer görünmeye devam ediyor | Retained message hâlâ saklanıyor | Temizlemek için boş bir retained payload yayımlayın |
| Python callback imza hataları | paho 2.x ile 1.x örnek kodu | CallbackAPIVersion.VERSION2 geçin ve v2 imzalarını kullanın |
Eğitimden Production'a
Public broker öğrenmek için idealdir, ötesi için değil. Gerçek cihazlar canlıya geçmeden önce özel kimlik bilgilerine, her yerde TLS'e, diğer kullanıcılardan izolasyona ve filonuza göre boyutlandırılmış limitlere ihtiyacınız vardır. Kendi broker'ınızı çalıştırabilirsiniz, ancak bu durumda yamaları, sertifikaları, izlemeyi ve kapasite planlamasını siz üstlenirsiniz. Yönetilen bir MQTT broker bu işi sağlayıcıya devreder.
ConnectMQ ile geçiş büyük ölçüde bir yapılandırma değişikliğidir. Kaydolun, bir plan seçin, bir broker oluşturun; portal size otomatik üretilmiş bir kullanıcı adı, parola ve client ID verir. Bu eğitimdeki kodun aynısı, kimlik bilgilerini eklediğinizde çalışır:
client = mqtt.Client(
mqtt.CallbackAPIVersion.VERSION2,
client_id="YOUR_CLIENT_ID",
protocol=mqtt.MQTTv5,
)
client.username_pw_set("YOUR_USERNAME", "YOUR_PASSWORD")
client.tls_set()
client.connect("broker.connectmq.com", 8883, keepalive=30)
Portal ayrıca tarayıcı içi bir MQTT client'ı ve canlı bir topic gezgini içerir; böylece bu eğitimin her adımını hiçbir şey kurmadan özel broker'ınızda tekrarlayabilirsiniz. Paylaşımlı serverless katmandan dedicated bir kümeye ya da kendi bulut hesabınıza kadar dağıtım seçeneklerini karşılaştırmak için bulut MQTT broker seçim rehberimizi okuyun. Ardından sahadaki ilk cihazı bağlamadan önce MQTT güvenliği en iyi uygulamalarını gözden geçirin.
Bu Eğitimden Sonraki Öğrenme Yolunuz
| Sonraki konu | Neden önemli |
|---|---|
| MQTT 5 özellikleri | Mesaj süre sonu, paylaşımlı abonelikler, reason code'lar ve user property'ler |
| ESP32 MQTT eğitimi | MQTT'yi gerçek donanıma taşıyın |
| MQTT kalıcı oturumları | Client çevrimdışıyken gelen mesajları alın |
| MQTT keep alive aralığı | Broker'ın kopan bir bağlantıyı ne kadar hızlı fark edeceğini ayarlayın |
| MQTT ve HTTP karşılaştırması | MQTT'nin ne zaman doğru araç olduğunu, ne zaman olmadığını bilin |
ConnectMQ ile Başlayın
Az önce public bir broker üzerinde MQTT'nin tüm temel özelliklerini kullandınız. Özel topic'lere ve gerçek cihazlara hazır olduğunuzda app.connectmq.com adresinden ücretsiz bir broker oluşturun. Serverless ücretsiz plan kredi kartı gerektirmez, TCP, TLS ve WebSocket üzerinde MQTT 3.1.1 ve 5.0'ı destekler ve ilk projenizi kurmanız için 25 bağlantıya kadar imkân sunar. ConnectMQ kimlik bilgileriniz yukarıdaki koda doğrudan yerleşir.
Sık Sorulan Sorular
MQTT öğrenmesi zor mu?
Hayır. Temel model yalnızca client'lar, bir broker, topic'ler ve publish/subscribe'dan oluşur; CLI ile ilk mesajınızı beş dakikadan kısa sürede gönderebilirsiniz. Derinlik daha sonra oturumlar, QoS ödünleşimleri ve topic tasarımıyla gelir.
Bu MQTT eğitimini takip etmek için bir broker kurmam gerekir mi?
Hayır. Her adım, anonim bağlantıları kabul eden broker.connectmq.com üzerinde çalışır. Yalnızca Mosquitto client araçlarına, Python'a veya bir tarayıcıya ihtiyacınız var.
MQTT 3.1.1 mi yoksa MQTT 5 mi öğrenmeliyim?
Kavramları bir kez öğrenin; ikisinde de aynıdır. Yeni projelerde MQTT 5 kullanın; çünkü reason code'lar, mesaj süre sonu, paylaşımlı abonelikler ve user property'ler ekler ve her iki sürümü destekleyen broker'larla uyumlu kalır.
Public broker gerçek veriler için güvenli mi?
Hayır. Public alandaki her şeyi herkes okuyabilir; bu yüzden onu yalnızca testler ve demolar için kullanın. Gerçek veriler, kimlik bilgileri ve TLS ile korunan özel bir broker'da olmalıdır.
Bu eğitimden sonra ne geliştirmeliyim?
Bir ESP32 veya Raspberry Pi ile gerçek bir sensör bağlayın, küçük bir abone betiğiyle okumaları bir veritabanında saklayın ve WebSocket üzerinden bir dashboard oluşturun. Bu adımların her biri burada öğrendiklerinizi aynen yeniden kullanır.



