MQTT broker, her MQTT mesajını alan ve onu talep eden client'lara ileten merkezi sunucudur. Bu başlangıç rehberinde publish/subscribe modelinin nasıl çalıştığını, bir MQTT broker'ın perde arkasında neler yaptığını, topic ve wildcard'ların nasıl yapılandırıldığını, MQTT 3.1.1 ile 5.0 arasındaki farkları ve ilk mesajlarınızı komut satırından ve Python'dan nasıl göndereceğinizi öğreneceksiniz.
MQTT Nedir?
MQTT; bant genişliği, enerji veya işlem gücü sınırlı cihazlar için tasarlanmış hafif bir mesajlaşma protokolüdür. TCP üzerinde (tarayıcılar için WebSocket üzerinde) çalışır, yalnızca iki baytlık küçücük bir sabit başlığa sahiptir ve sürekli sorgulama (polling) yapmak yerine tek, uzun ömürlü bir bağlantıyı açık tutar. Bu da onu sensörler, gateway'ler, araçlar, akıllı sayaçlar ve endüstriyel makineler için doğal bir seçim yapar; bu cihazların verisini tüketen dashboard'lar ve backend servisleri için de aynı derecede kullanışlıdır.
MQTT açık bir OASIS standardıdır; protokolün resmi adresi mqtt.org'dur.
Publish/Subscribe Modeli
HTTP gibi klasik istek/yanıt sistemlerinde client belirli bir sunucuyu çağırır ve yanıtı bekler. MQTT ise bunun yerine publish/subscribe kullanır:
- Bir publisher, örneğin
home/livingroom/temperaturegibi bir topic'e mesaj gönderir. - Bir subscriber, broker'a hangi topic'lerle ilgilendiğini söyler.
- Broker ortada durur ve her mesajı, aboneliği topic ile eşleşen tüm subscriber'lara iletir.
Akış kabaca şöyledir:
[Temperature sensor] --PUBLISH home/livingroom/temperature 22.5--> [MQTT broker]
[MQTT broker] --deliver--> [Mobile app] (subscribed to home/+/temperature)
[MQTT broker] --deliver--> [Analytics service] (subscribed to home/#)
Bu modeli güçlü kılan üç tür ayrışma (decoupling) vardır:
- Mekân: Sensör uygulamanın adresini, uygulama da sensörün adresini bilmez. İkisi de yalnızca broker'ı bilir.
- Zaman: Kalıcı oturumlar ve retained message'lar sayesinde subscriber'ın mesaj yayınlandığı anda çevrimiçi olması gerekmez.
- Ölçek: Onuncu ya da bininci subscriber'ı eklemek publisher'da hiçbir şeyi değiştirmez.
MQTT Broker Ne İş Yapar?
MQTT broker basit bir aktarıcıdan çok daha fazlasıdır. Aynı anda birkaç görevden sorumludur.
Bağlantıları yönetmek
Her client bir TCP, TLS veya WebSocket bağlantısı açar ve client ID, isteğe bağlı kullanıcı adı ve parola, keep-alive aralığı ve oturum bayraklarını içeren bir CONNECT paketi gönderir. Broker client'ın kimliğini doğrular, CONNACK ile yanıt verir ve ardından ölü client'ları fark edebilmek için bağlantıyı PINGREQ/PINGRESP ile izler.
Oturumları saklamak
Bir oturum, client'ın aboneliklerini ve çevrimdışıyken kuyruğa alınan mesajları tutar. Clean session ile bağlantı kesildiğinde durum silinir. Kalıcı oturumda ise broker bu durumu saklar; böylece mobil ağdan düşen bir cihaz geri döndüğünde kaçırdıklarını alır. MQTT 5, eski açık/kapalı bayrağının yerine saniye cinsinden bir session expiry aralığı getirir.
Topic'e göre yönlendirmek
Gelen her PUBLISH, wildcard filtreleri dahil tüm aktif aboneliklerle karşılaştırılır ve eşleşen client'lara iletilir. Yönlendirme MQTT broker'ın kalbidir ve topic tasarımının neden önemli olduğunu da açıklar.
Retained message'lar
Publisher retain bayrağını ayarlayabilir. Broker her topic için son retained mesajı saklar ve yeni abone olan her client'a hemen gönderir. Bu, device/42/status = online veya en güncel yapılandırma gibi durum bilgileri için idealdir: sonradan açılan bir dashboard, bir sonraki güncellemeyi beklemeden mevcut değeri görür.
Last Will and Testament
Client bağlanırken örneğin device/42/status = offline gibi bir "last will" mesajı kaydedebilir. Client düzgün bir DISCONNECT göndermeden kaybolursa (elektrik kesintisi, ağ arızası, keep-alive zaman aşımı) broker bu mesajı client adına yayınlar. Retained bir online mesajıyla birlikte kullanıldığında güvenilir bir çevrimiçi/çevrimdışı tespiti elde edersiniz.
Quality of Service
MQTT üç teslimat garantisi tanımlar ve broker bunları yolculuğun her iki ayağında da (publisher'dan broker'a, broker'dan subscriber'a) uygular:
| QoS | Ad | Garanti | Tipik kullanım |
|---|---|---|---|
| 0 | En fazla bir kez | Gönder ve unut, onay yok | Bir örneğin kaçmasının sorun olmadığı sık sensör okumaları |
| 1 | En az bir kez | PUBACK ile onaylanır, tekrarlanabilir | Çoğu telemetri ve olay |
| 2 | Tam olarak bir kez | Dört adımlı el sıkışma, tekrar yok | Faturalama, tekrarlanmaması gereken komutlar |
Bir subscriber için geçerli QoS, yayın QoS'u ile abonelik QoS'undan düşük olanıdır. Daha ayrıntılı bilgi için MQTT QoS Seviyeleri yazısını okuyun.
MQTT Topic'leri ve Wildcard'lar
Topic'ler, eğik çizgiyle seviyelere ayrılan UTF-8 dizeleridir. Anında oluşturulurlar: önceden tanımlamanız gereken hiçbir şey yoktur.
factory1/line1/cnc1/temperature
factory1/line1/cnc1/spindle_rpm
factory1/line2/press3/status
home/kitchen/light/state
İyi bir topic tasarımı genelden özele doğru okunur, baştaki eğik çizgilerden ve boşluklardan kaçınır ve topic adlarına hassas veri koymaz. $ ile başlayan topic'ler broker'a ayrılmıştır; örneğin ConnectMQ $SYS/broker/connection/{clientId}/state topic'ini yayınlar.
Tek seviyeli wildcard: +
Artı işareti tam olarak bir seviyeyle eşleşir.
| Abonelik filtresi | Eşleşir | Eşleşmez |
|---|---|---|
factory1/+/cnc1/temperature |
factory1/line1/cnc1/temperature |
factory1/line1/cell2/cnc1/temperature |
home/+/light/state |
home/kitchen/light/state |
home/light/state |
Çok seviyeli wildcard:
Diyez işareti sıfır dahil herhangi sayıda seviyeyle eşleşir ve filtrenin son karakteri olmalıdır.
| Abonelik filtresi | Eşleşir |
|---|---|
factory1/# |
factory1, factory1/line1/cnc1/temperature, factory1/line2/press3/status |
factory1/line1/# |
factory1/line1 altındaki her şey |
# |
Client'ın görmesine izin verilen, $ ile başlamayan tüm topic'ler |
Wildcard'lar yalnızca abone olurken kullanılabilir; yayını her zaman somut bir topic'e yaparsınız. Endüstriyel projelerde ISA-95 (kurum, saha, alan, hat, hücre) gibi tutarlı bir hiyerarşi bir Unified Namespace'e dönüşür; bu desen için MQTT Sparkplug B ve Unified Namespace yazısına bakın.
MQTT 3.1.1 ve MQTT 5.0 Karşılaştırması
Günümüzde çoğu broker ve kütüphane her iki sürümü de destekler. MQTT 5.0 aynı modeli korur ve büyük kurulumların işletilmesini kolaylaştıran özellikler ekler.
| Yetenek | MQTT 3.1.1 | MQTT 5.0 |
|---|---|---|
| Hata geri bildirimi | Sınırlı dönüş kodları | Çoğu onayda reason code (örneğin 0x97 Quota exceeded) |
| Oturum ömrü | Clean session açık/kapalı | Session expiry aralığı |
| Mesaj ömrü | Yok | Message expiry aralığı |
| Yük dengeleme | Standartta yok | Shared subscription'lar $share/{group}/{filter} |
| Bant genişliği tasarrufu | Her seferinde tam topic | Topic alias'lar |
| İstek/yanıt | Duruma özel gelenekler | Response topic ve correlation data |
| Broker limitleri | Örtük | CONNACK içinde bildirilir (Maximum QoS, Receive Maximum vb.) |
| Meta veri | Yalnızca payload | User property'ler |
Yeni bir projeye başlıyorsanız, bir cihaz kütüphanesi yalnızca 3.1.1'i desteklemiyorsa MQTT 5.0 kullanın. Tam spesifikasyon OASIS tarafından docs.oasis-open.org adresinde yayımlanmıştır; MQTT 5 özellikleri yazımız ise pratikte öne çıkanları özetler.
Uygulamalı: Beş Dakikada Bir MQTT Broker Deneyin
Bir MQTT broker'ı anlamanın en hızlı yolu onu kullanmaktır. broker.connectmq.com anonim testler için bir public alan sunar.
| Protokol | Port | URL |
|---|---|---|
| MQTT (TCP) | 1883 | mqtt://broker.connectmq.com:1883 |
| TLS üzerinden MQTT | 8883 | mqtts://broker.connectmq.com:8883 |
| WebSocket | 8083 | ws://broker.connectmq.com:8083/mqtt |
| Güvenli WebSocket | 8084 | wss://broker.connectmq.com:8084/mqtt |
Public alanın kuralları: kullanıcı adı veya parola olmadan bağlanın, benzersiz ve boş olmayan bir client ID kullanın (boş olanlar reddedilir) ve yayınladığınız her şeyin herkes tarafından okunabildiğini unutmayın. connectmq/demo/<your-random-id>/ gibi rastgele bir önek seçin ve asla kişisel veya hassas veri göndermeyin. Limitler mesaj başına 64 KB, client başına saniyede 10 mesaj ve 10 abonelik ile en fazla 8 topic seviyesidir.
mosquitto ile abone olun ve yayın yapın
Eclipse Mosquitto komut satırı client'larını kurun, ardından bir terminal açıp wildcard ile abone olun. k9x2 yerine kendi rastgele dizenizi yazın:
mosquitto_sub -h broker.connectmq.com -p 1883 -i sub-k9x2 \
-t "connectmq/demo/k9x2/#" -v
İkinci bir terminalde bir ölçüm yayınlayın:
mosquitto_pub -h broker.connectmq.com -p 1883 -i pub-k9x2 \
-t "connectmq/demo/k9x2/room1/temp" -m '{"temp":22.5}' -q 1
İlk terminal şunu yazdırır:
connectmq/demo/k9x2/room1/temp {"temp":22.5}
Şimdi bir retained message deneyin. -r ile bir durum yayınlayın, ardından yalnızca tek seviyeli wildcard kullanan yeni bir subscriber başlatın:
mosquitto_pub -h broker.connectmq.com -p 1883 -i pub-k9x2 \
-t "connectmq/demo/k9x2/room1/status" -m "online" -r
mosquitto_sub -h broker.connectmq.com -p 1883 -i sub2-k9x2 \
-t "connectmq/demo/k9x2/+/status" -v -C 1
Yeni subscriber, mesaj gönderildikten sonra bağlanmış olmasına rağmen online değerini hemen alır. Bu, broker'ın retained değeri saklayıp yeniden oynatmasıdır. Temizlemek için -r -n ile boş bir retained mesaj yayınlayın.
Şifreli trafik için 8883 portuna geçin ve client'ı sisteminizin CA sertifikalarına yönlendirin (örneğin Linux'ta --capath /etc/ssl/certs); MQTT 5.0 konuşmak için de -V mqttv5 ekleyin.
Last will içeren Python örneği
paho-mqtt 2.x'i pip install paho-mqtt ile kurun ve şunu çalıştırın:
import json
import uuid
import paho.mqtt.client as mqtt
BROKER = "broker.connectmq.com"
PREFIX = f"connectmq/demo/{uuid.uuid4().hex[:8]}"
CLIENT_ID = f"py-{uuid.uuid4().hex[:8]}"
def on_connect(client, userdata, flags, reason_code, properties):
print("Connected:", reason_code)
client.subscribe(f"{PREFIX}/#", qos=1)
client.publish(f"{PREFIX}/sensor1/status", "online", qos=1, retain=True)
client.publish(f"{PREFIX}/sensor1/temp", json.dumps({"temp": 21.8}), qos=1)
def on_message(client, userdata, msg):
print(f"{msg.topic} -> {msg.payload.decode()}")
client = mqtt.Client(
mqtt.CallbackAPIVersion.VERSION2,
client_id=CLIENT_ID,
protocol=mqtt.MQTTv5,
)
client.will_set(f"{PREFIX}/sensor1/status", "offline", qos=1, retain=True)
client.on_connect = on_connect
client.on_message = on_message
client.connect(BROKER, 1883, keepalive=30)
client.loop_forever()
Betik bir last will kaydeder, retained bir mesajla kendini online olarak duyurur ve kendi wildcard aboneliği üzerinden geri aldığı bir sıcaklık ölçümü yayınlar. Süreci aniden sonlandırırsanız, keep-alive süresi dolduğunda broker durum topic'ine offline yayınlar.
Bunun yerine tarayıcıyı mı kullanmak istiyorsunuz? Aynı broker 8083 ve 8084 portlarında WebSocket bağlantılarını kabul eder; WebSocket üzerinden MQTT yazısına bakın.
Public Test Broker'dan Üretime
Public bir MQTT broker öğrenmek ve prototip geliştirmek için mükemmeldir; ancak üretim; özel kimlik bilgileri, TLS ve diğer kullanıcılardan izolasyon gerektirir. ConnectMQ broker'ı sizin için çalıştırır: portalda bir broker oluşturun, kullanıcı adı, parola ve client ID alın ve 8883 portunda mqtts:// üzerinden bağlanın. Topic'leriniz diğer kiracılardan ve public alandan izole kalır; portal ise canlı topic gezgini, dashboard'lar ve alarm kuralları sunar. Barındırma seçeneklerini karşılaştırmak için Yönetilen MQTT Broker Nedir? yazısını okuyun.
ConnectMQ ile Başlayın
Ücretsiz Serverless planında kendi MQTT broker'ınızı oluşturmak için app.connectmq.com adresinden kaydolun; kredi kartı gerekmez. Az önce denediğiniz komutların aynısıyla birkaç dakika içinde TLS üzerinden mesaj gönderiyor olacaksınız.
Sık Sorulan Sorular
En basit haliyle MQTT broker nedir?
MQTT broker, yayın yapan client'lardan mesajları alan ve eşleşen bir topic'e abone olan her client'a ileten sunucudur. Cihazlar birbiriyle doğrudan konuşmaz; yalnızca broker ile konuşur.
MQTT broker ile MQTT client arasındaki fark nedir?
Client, sensör veya dashboard gibi yayın yapan ya da abone olan herhangi bir cihaz veya uygulamadır. Broker ise ortadaki sunucudur: client'ların kimliğini doğrular, oturumları saklar ve mesajları aralarında yönlendirir.
MQTT broker hangi portu kullanır?
Standart portlar düz MQTT için 1883 ve TLS üzerinden MQTT için 8883'tür. WebSocket bağlantıları genellikle ayrı portlar kullanır; broker.connectmq.com üzerinde bunlar /mqtt yoluyla 8083 ve 8084'tür.
Test edebileceğim ücretsiz bir MQTT broker var mı?
Evet. broker.connectmq.com test için anonim bir public alana sahiptir; ConnectMQ'nun ücretsiz Serverless planı ise kimlik bilgileri ve TLS içeren özel bir broker sunar.
MQTT 3.1.1 mi yoksa MQTT 5.0 mı kullanmalıyım?
Yeni projelerde MQTT 5.0 kullanın; reason code'lar, session ve message expiry, shared subscription'lar ve topic alias'lar ekler. Yalnızca bir cihaz kütüphanesi 5. sürümü desteklemiyorsa 3.1.1'e dönün.



