MQTT Nedir?
MQTT (Message Queuing Telemetry Transport), IoT (Nesnelerin İnterneti) cihazları için tasarlanmış hafif, açık kaynaklı bir mesajlaşma protokolüdür. 1999 yılında IBM tarafından geliştirilen MQTT, düşük bant genişliği, yüksek gecikme ve sınırlı işlem gücüne sahip ortamlarda çalışmak üzere tasarlanmıştır.
MQTT, yayıncı/abone (publish/subscribe) modeli üzerine kurulmuştur ve cihazlar arasında verimli bir şekilde veri alışverişi yapılmasını sağlar. Bu model, geleneksel istemci/sunucu modelinden farklı olarak, mesaj gönderen (yayıncı) ve mesaj alan (abone) tarafların birbirlerini doğrudan tanımasını gerektirmez. Bunun yerine, bir aracı (broker) üzerinden iletişim kurulur.
MQTT'nin Temel Özellikleri
- Hafif ve düşük bant genişliği
- Düşük güç tüketimi
- Farklı güvenilirlik seviyeleri (QoS)
- Güvenlik özellikleri
- Ölçeklenebilirlik
MQTT Mimarisi
Yayıncı/Abone Modeli
MQTT, yayıncı/abone (publish/subscribe) modelini kullanır. Bu modelde, mesaj gönderen (yayıncı) ve mesaj alan (abone) taraflar birbirlerini doğrudan tanımazlar. Bunun yerine, bir aracı (broker) üzerinden iletişim kurarlar.
Temel Bileşenler:
- Yayıncı (Publisher): Belirli bir konuda (topic) mesaj yayınlayan cihaz veya uygulama
- Abone (Subscriber): Belirli bir konuya abone olan ve bu konuda yayınlanan mesajları alan cihaz veya uygulama
- Broker: Yayıncılardan gelen mesajları alıp ilgili abonelere ileten merkezi sunucu
- Konu (Topic): Mesajların kategorize edildiği hiyerarşik yapı (örn. "ev/salon/sıcaklık")
- Mesaj: Yayıncıdan abonelere iletilen veri paketi
MQTT Mesaj Akışı
MQTT protokolünde mesaj akışı şu şekilde gerçekleşir:
- Bağlantı Kurma: İstemciler (yayıncılar ve aboneler) MQTT broker'a bağlanır
- Abonelik: İstemciler ilgilendikleri konulara abone olur
- Yayınlama: Yayıncılar belirli bir konuda mesaj yayınlar
- Dağıtım: Broker, mesajı ilgili konuya abone olan tüm istemcilere iletir
- Bağlantı Sonlandırma: İstemciler işleri bittiğinde bağlantıyı sonlandırabilir
Bu akış, cihazların birbirlerini doğrudan tanımasını gerektirmez ve ağ bant genişliğini verimli kullanır. Ayrıca, cihazların aynı anda çevrimiçi olması gerekmez; broker, çevrimdışı aboneler için mesajları saklayabilir.
MQTT Kalite Seviyeleri (QoS)
QoS 0: En Fazla Bir Kez
En temel seviye olan QoS 0, "ateşle ve unut" prensibiyle çalışır. Mesaj bir kez gönderilir ve teslim edilip edilmediği kontrol edilmez.
Özellikler:
- En düşük ağ trafiği
- En yüksek performans
- Mesaj kaybı olabilir
- Mesaj tekrarı olmaz
Veri kaybının önemli olmadığı, düzenli veri akışı olan senaryolarda kullanılır (örn. periyodik sensör okumaları).
QoS 1: En Az Bir Kez
QoS 1, mesajın en az bir kez teslim edilmesini garanti eder. Yayıncı, broker'dan PUBACK (onay) mesajı alana kadar mesajı saklar ve gerekirse yeniden gönderir.
Özellikler:
- Orta düzeyde ağ trafiği
- İyi performans
- Mesaj kaybı olmaz
- Mesaj tekrarı olabilir
Mesajın mutlaka iletilmesi gereken, ancak tekrar edilmesinin büyük sorun olmadığı senaryolarda kullanılır (örn. alarm bildirimleri).
QoS 2: Tam Olarak Bir Kez
En yüksek seviye olan QoS 2, mesajın tam olarak bir kez teslim edilmesini garanti eder. Dört aşamalı bir el sıkışma protokolü kullanır.
Özellikler:
- En yüksek ağ trafiği
- En düşük performans
- Mesaj kaybı olmaz
- Mesaj tekrarı olmaz
Mesajın hem kaybolmaması hem de tekrarlanmaması gereken kritik senaryolarda kullanılır (örn. ödeme işlemleri, kritik komutlar).
MQTT Konuları ve Abonelikler
Konu Yapısı
MQTT konuları (topics), mesajların kategorize edildiği hiyerarşik yapılardır. Konular, eğik çizgi (/) ile ayrılan seviyelerden oluşur ve UTF-8 karakter dizileri olarak tanımlanır.
Konu Örnekleri:
ev/salon/sicaklik
- Salondaki sıcaklık sensörüev/salon/nem
- Salondaki nem sensörüev/mutfak/sicaklik
- Mutfaktaki sıcaklık sensörüarac/motor/sicaklik
- Araç motor sıcaklığıarac/yakit/seviye
- Araç yakıt seviyesi
Bu hiyerarşik yapı, mesajların organize edilmesini ve filtrelenmesini kolaylaştırır.
Joker Karakterler
MQTT, abonelerin birden fazla konuya tek bir abonelikle abone olmasını sağlayan joker karakterler sunar:
- Tek Seviye Joker Karakteri (+): Tek bir seviyeyi temsil eder
- Çok Seviye Joker Karakteri (#): Birden fazla seviyeyi temsil eder ve konu dizisinin sonunda olmalıdır
Joker Karakter Örnekleri:
ev/+/sicaklik
- Evdeki tüm odaların sıcaklık sensörleriev/salon/+
- Salondaki tüm sensörlerev/#
- Evdeki tüm sensörler ve cihazlar+/+/sicaklik
- Tüm lokasyonlardaki tüm odaların sıcaklık sensörleri
Joker karakterler, özellikle çok sayıda cihazın bulunduğu sistemlerde abonelik yönetimini kolaylaştırır.
MQTT Güvenliği
Güvenlik Zorlukları
- Kimlik Doğrulama: Yetkisiz cihazların broker'a bağlanması
- Yetkilendirme: Cihazların yetkisiz konulara erişimi
- Veri Gizliliği: İletim sırasında verilerin dinlenmesi
- Veri Bütünlüğü: İletim sırasında verilerin değiştirilmesi
- DoS Saldırıları: Hizmet engelleme saldırıları
Güvenlik Çözümleri
- TLS/SSL: İletişimin şifrelenmesi
- Kullanıcı Adı/Şifre: Temel kimlik doğrulama
- X.509 Sertifikaları: Güçlü kimlik doğrulama
- ACL (Erişim Kontrol Listeleri): Konu bazlı yetkilendirme
- Payload Şifreleme: Mesaj içeriğinin uçtan uca şifrelenmesi