MQTT Temelleri

MQTT Broker Nedir? Publish/Subscribe Mesajlaşmaya Başlangıç Rehberi

MQTT broker, IoT cihazları ile uygulamalar arasındaki her mesajı yönlendiren merkezdir. Publish/subscribe modelini, topic ve wildcard'ları, oturumları, QoS'u, retained message'ları ve last will'i öğrenin, ardından dakikalar içinde uygulamalı deneyin.

Yayın yapan sensörler ile abone uygulamalar arasında mesajları yönlendiren bir MQTT broker çizimi
Bunu kendi MQTT broker’ınızda çalıştırınFree planla özel, yönetilen bir MQTT broker alın ve hazır kod örnekleriyle başlayın.
Ücretsiz deneyin Kod örnekleri Kart gerekmez

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/temperature gibi 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.

İlgili yazılar

MQTT'yi Kim İcat Etti? Petrol Boru Hatlarından IoT'ye Uzanan Tarih

MQTT, 1999'da IBM'den Andy Stanford-Clark ve Arcom'dan Arlen Nipper tarafından petrol boru hatlarını uydu üzerinden izlemek için icat edildi. Açık kaynağa, OASIS'e, ISO'ya ve bugünün yönetilen bulut broker'larına uzanan yolculuğunu izleyin.

7 dk okuma

MQTT Maksimum Mesaj Boyutu: Sınırlar ve Büyük Payload Stratejileri

MQTT teknik olarak 256 MB'lık bir paket taşıyabilir, ancak broker'lar, istemci kütüphaneleri ve cihazlar çok daha düşük sınırlar uygular. Gerçek sınırların nerede olduğunu, aşıldıklarında ne olduğunu ve büyük payload'ların nasıl gönderileceğini öğrenin.

6 dk okuma

Tüm yazılar →

Özel MQTT broker’ınız birkaç tık uzağınızda

Hesabınızı oluşturun, broker kimlik bilgilerinizi alın ve ilk cihazınızı bağlayın — kurulacak, yamalanacak ya da ölçeklendirilecek sunucu yok.