MQTT Temelleri

MQTT vs CoAP: TCP Üzerinde Pub/Sub ve UDP Üzerinde İstek/Yanıt

MQTT ve CoAP'nin ikisi de kısıtlı IoT cihazlarını hedefler ama zıt yaklaşımlar benimser: TCP üzerinde broker tabanlı pub/sub ve UDP üzerinde RESTful istek/yanıt. İşte nasıl karşılaştırıldıkları ve hangisinin ne zaman kullanılacağı.

Bir CoAP sunucusuna UDP datagramları gönderen sensör ile broker'a TCP üzerinden bağlı sensörü yan yana göstererek MQTT vs CoAP karşılaştıran çizim
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 vs CoAP, aynı tür donanım için, yani kayıplı ağlardaki küçük pilli cihazlar için geliştirilmiş ama birbirinin tam tersi şekilde çalışan iki protokol arasında bir seçimdir. MQTT, bir broker üzerinden TCP ile publish/subscribe yapar; CoAP ise uç noktalar arasında doğrudan, UDP üzerinde RESTful istek/yanıt kullanır. Bu rehber taşıma katmanlarını, header'ları, güvenliği, multicast'i ve veri akışını karşılaştırarak cihazlarınıza ve backend'inize hangisinin uyduğuna karar vermenize yardımcı oluyor.

Kısa Cevap

Cihazlarınız bir TCP bağlantısını açık tutabiliyorsa ve verilerinizin buluttaki birden fazla tüketiciye ulaşması gerekiyorsa, broker'lı MQTT genellikle daha basit yoldur. Cihazlarınız 6LoWPAN veya Thread gibi kısıtlı bir IPv6 ağında bulunuyor, zamanının çoğunu uykuda geçiriyor ve küçük web sunucuları gibi adresleniyorsa CoAP doğal bir seçimdir. Büyük kurulumların çoğu yerel kısıtlı ağda CoAP, gateway'den buluta ise MQTT kullanır.

CoAP Nasıl Çalışır?

CoAP (Constrained Application Protocol, RFC 7252), REST modelini mikrodenetleyicilere taşır. Her cihaz /sensors/temp gibi kaynaklar sunar ve istemciler bunlar üzerinde GET, POST, PUT ve DELETE kullanır; tıpkı HTTP gibi, ancak UDP üzerinde kompakt bir ikili formatla. Yanıtlar, HTTP durum kodlarından esinlenen kodlar taşır; örneğin 2.05 Content veya 4.04 Not Found.

UDP teslim garantisi vermediğinden CoAP kendi hafif güvenilirlik mekanizmasını ekler: bir mesaj, alıcının onaylaması gereken Confirmable (CON) ya da gönder-ve-unut tipindeki Non-confirmable (NON) olabilir. Yeniden gönderimler üstel geri çekilme (exponential backoff) kullanır.

CoAP'nin ayrıca bir Observe seçeneği vardır (RFC 7641). Bir istemci bir kaynağa ilgisini kaydeder ve sunucu kaynak her değiştiğinde bir bildirim gönderir. Bu, CoAP'de MQTT'nin subscribe'ına en yakın şeydir; ancak bir istemci ile tek bir sunucu arasında noktadan noktayadır.

MQTT Nasıl Çalışır?

MQTT istemcileri bir broker'a TCP bağlantısı (isteğe bağlı olarak TLS) açar, ardından topic'lere mesaj publish eder ve topic filtrelerine subscribe olur. Cihazlar birbirleriyle hiçbir zaman doğrudan konuşmaz; fan-out'u, retained son bilinen değerleri, çevrimdışı subscriber'lar için kalıcı oturumları ve beklenmedik bağlantı kopmaları için Last Will mesajlarını broker yönetir. Broker kavramı sizin için yeniyse MQTT broker nedir yazısıyla başlayın; adım adım bir giriş için MQTT eğitimine bakın.

Bir Bakışta MQTT vs CoAP

Özellik MQTT CoAP
Standart OASIS MQTT 3.1.1 ve 5.0 IETF RFC 7252 ve uzantıları
Taşıma TCP (veya TCP üzerinde WebSocket) UDP (RFC 8323'te TCP ve WebSocket varyantları var)
Desen Broker üzerinden publish/subscribe Uç noktalar arası istek/yanıt ve Observe
Header En az 2 baytlık sabit header ve topic 4 baytlık sabit header, token ve seçenekler
Güvenilirlik TCP ve QoS 0, 1, 2 Confirmable ve non-confirmable mesajlar
Güvenlik TLS DTLS (veya nesne güvenliği için OSCORE)
Keşif Protokolde yok; topic'ler birer konvansiyon /.well-known/core kaynak keşfi
Multicast Hayır Evet, grup istekleri için IP multicast üzerinden
Birçok tüketiciye fan-out Broker sayesinde yerleşik Bir proxy ya da her istemcinin observe etmesi gerekir
Çevrimdışı yönetim Kalıcı oturumlar, retained message'lar Cihaz erişilebilir olmalı ya da proxy'lenmeli
NAT ve firewall geçişi Kolay: cihaz giden TCP bağlantısı açar Daha zor: UDP eşlemeleri zaman aşımına uğrar
Tipik ağ Wi-Fi, Ethernet, hücresel, gateway'ler 6LoWPAN, Thread, kısıtlı IPv6 mesh ağları

Taşıma Katmanı: TCP vs UDP

Farkların çoğunun kökü taşıma katmanıdır. TCP, MQTT'ye sıralı ve güvenilir bayt akışları sağlar; ancak bağlanmak için üç yönlü bir handshake gerektirir ve her iki uçta durum tutar. Kayıplı bir telsiz bağlantısında TCP yeniden gönderimleri ve head-of-line blocking gecikme ekleyebilir. Taşıma katmanı sorusu hakkında daha fazlası için MQTT TCP mi UDP mi yazısına bakın.

UDP, CoAP'nin bir ölçümü bağlantı kurmadan tek bir datagramla göndermesini sağlar; bu da kısa süreliğine uyanıp veri gönderen ve yeniden uykuya dalan cihazlara uyar. Bunun karşılığında güvenilirliği, tekrarların ayıklanmasını ve tıkanıklık kontrolünü uygulamanın, yani bu örnekte CoAP'nin kendisinin yönetmesi gerekir. Ayrıca UDP eşlemeleri hızla zaman aşımına uğradığından NAT arkasındaki cihazlara ulaşmak zorlaşır.

Header Boyutu ve Ek Yük

Her iki protokol de kompakttır. Bir MQTT PUBLISH çok küçük olabilir, ancak MQTT 5 topic alias'larını kullanmadığınız sürece topic dizesi her mesajla birlikte gider. CoAP 4 baytlık bir header, kısa bir token ve delta olarak kodlanan seçenekler kullanır; dolayısıyla URI path de kompakttır. Pratikte mesaj başına ek yük ikisinde de benzer küçük bir aralıktadır; asıl büyük fark bağlantı ek yüküdür (MQTT için TCP ve TLS, CoAP için hiç ya da DTLS).

Güvenlik: TLS vs DTLS

MQTT, HTTPS'i de koruyan ve iyi bilinen aynı yığın olan TCP üzerinde TLS kullanır; cihaz SDK'larında, gateway'lerde ve bulut broker'larında olgun bir desteğe sahiptir. Yönetilen bir broker genellikle sertifikaları sizin için yönetir; örneğin ConnectMQ, TLS için 8883 portunda ve güvenli WebSocket için 8084 portunda bir Let's Encrypt sertifikası sunar.

CoAP, TLS'in datagram sürümü olan DTLS'i kullanır. Çalışır, ancak oturum durumu, kayıplı bağlantılarda handshake yeniden gönderimi ve NAT yeniden bağlama işlemleri karmaşıklık ekler; araç desteği de daha az yaygındır. OSCORE (RFC 8613), proxy'lerden geçerken korunan uçtan uca nesne güvenliği sunar; bu, çok atlamalı kısıtlı ağlarda caziptir ama kendi anahtar yönetimini de beraberinde getirir.

Her iki protokol için de pratik kural aynıdır: cihazdan çıkan her atlamayı şifreleyin ve asla yalnızca ağ izolasyonuna güvenmeyin. MQTT güvenliği için en iyi uygulamalar rehberi, MQTT kurulumları için kimlik bilgilerini, TLS'i ve topic tasarımını ele alıyor.

Observe vs Subscribe

CoAP Observe ve MQTT subscribe, güncellemeleri polling olmadan iletir, ancak topolojileri farklıdır. Observe ile ilgilenen her istemci doğrudan cihazın kendisine kaydolur. On dashboard, belki yalnızca birkaç kilobayt RAM'i olan bir mikrodenetleyici üzerinde on observer demektir. MQTT'de ise cihaz broker'a bir kez publish eder ve broker istenen sayıda subscriber'ı yönetir. Bu yüzden veri çok sayıda tüketiciye sahip olduğunda MQTT daha iyi ölçeklenir; CoAP ise tek bir kontrolcünün çok sayıda küçük cihazla konuştuğu durumlarda iyi çalışır.

Multicast ve Yerel Keşif

Bu, CoAP'nin net avantajıdır. Bir istemci tek bir isteği bir IP multicast grubuna gönderebilir, örneğin bir kattaki tüm ışıkları kapatmak için, ve grubun her üyesi yanıt verir. /.well-known/core üzerindeki kaynak keşfiyle birleştiğinde CoAP, cihazların merkezi bir sunucu olmadan birbirini bulduğu yerel bina ve ev otomasyonu ağlarına uygundur. MQTT'de multicast yoktur; her mesaj broker'dan geçer.

Yaygın Bir Hibrit Desen

Kısıtlı mesh ağların ve bulutun ihtiyaçları farklıdır; bu nedenle birçok sistem ikisinin arasına bir gateway koyar:

  1. Thread veya 6LoWPAN mesh ağındaki sensörler CoAP kaynakları sunar.
  2. Bir sınır gateway'i bu kaynakları observe eder ya da CoAP POST'larını alır.
  3. Gateway her güncellemeyi TLS'li MQTT üzerinden bir bulut MQTT broker'a publish eder; örneğin site1/floor2/room14/temperature topic'ine.
  4. Dashboard'lar, historian'lar ve alarm servisleri broker'a subscribe olur.

Aşağıda bu gateway'in bulut tarafı Python ile verilmiştir. CoAP işleme kısmı kullandığınız kütüphaneye bağlı olduğundan bir ölçüm alan bir fonksiyonla temsil ediliyor; MQTT kısmı ise eksiksizdir.

import json
import ssl
import time
import paho.mqtt.client as mqtt

client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id="YOUR_CLIENT_ID")
client.username_pw_set("YOUR_USERNAME", "YOUR_PASSWORD")
client.tls_set(cert_reqs=ssl.CERT_REQUIRED)
client.will_set("site1/gateway1/status", "offline", qos=1, retain=True)

def on_connect(client, userdata, flags, reason_code, properties):
    print("connected:", reason_code)
    client.publish("site1/gateway1/status", "online", qos=1, retain=True)

client.on_connect = on_connect
client.connect("broker.connectmq.com", 8883, keepalive=60)
client.loop_start()

def forward_coap_reading(resource_path, value):
    """Bunu CoAP observe callback'inizden çağırın."""
    topic = "site1/" + resource_path.strip("/").replace("sensors/", "")
    payload = json.dumps({"value": value, "ts": int(time.time())})
    client.publish(topic, payload, qos=1, retain=True)

# Örnek: coap://[fd00::12]/sensors/floor2/room14/temperature adresinden observe edilen bir ölçüm
forward_coap_reading("/sensors/floor2/room14/temperature", 21.6)
time.sleep(2)

Hesap açmadan denemek için bağlantıyı herhangi bir benzersiz client ID ve connectmq/demo/<random-id>/ gibi bir topic önekiyle client.connect("broker.connectmq.com", 1883) olarak değiştirin; ancak ücretsiz herkese açık MQTT broker'ın herkes tarafından okunabildiğini unutmayın.

Hangisi Ne Zaman Seçilmeli?

Şu durumlarda MQTT seçin:

  • Cihazlar Wi-Fi, Ethernet veya hücresel ağdadır ve giden bir TCP bağlantısını açık tutabilir.
  • Verinin birden fazla bulut tüketicisine ulaşması gerekir.
  • Retained durum, Last Will ile çevrimiçi durum bilgisi ve çevrimdışı subscriber'lar için tamponlama istersiniz.
  • Olgun, yaygın istemci kütüphanelerini ve yönetilen barındırmayı tercih edersiniz.

Şu durumlarda CoAP seçin:

  • Cihazlar çok sınırlı RAM ve güce sahip kısıtlı IPv6 mesh ağlarında çalışır.
  • Merkezi bir sunucu olmadan multicast komutlara veya yerel keşfe ihtiyacınız vardır.
  • Etkileşim, bir cihaz ayarını okumak veya yazmak gibi doğası gereği istek/yanıt şeklindedir.

Projeniz MQTT tarafına daha yakın ama cihazlarınız aşırı kısıtlı ya da TCP kullanmıyorsa, MQTT semantiğini UDP'ye ve diğer datagram taşımalarına getiren MQTT-SN protokolüne de göz atın.

ConnectMQ ile Başlayın

Cihazlarınız ister doğrudan MQTT ister bir CoAP gateway'i üzerinden konuşsun, bulut tarafının güvenilir bir broker'a ihtiyacı vardır. ConnectMQ; MQTT 3.1.1 ve 5.0, 8883 portunda TLS ve her gateway'i çevrimiçi olduğu anda kontrol edebileceğiniz canlı bir topic gezgini sunan yönetilen bir broker'dır. app.connectmq.com adresinde kredi kartı gerekmeden ücretsiz bir Serverless broker oluşturun ve ilk gateway'inizi dakikalar içinde bağlayın.

Sık Sorulan Sorular

Pilli cihazlar için CoAP, MQTT'den daha mı iyi?

Seyrek uyanıp tek bir datagram gönderen cihazlar için olabilir, çünkü UDP bağlantı kurulumundan kaçınır. Sık veri bildiren veya komut alması gereken cihazlar için MQTT'nin kalıcı bağlantısı genellikle aynı derecede verimlidir ve işletmesi daha basittir.

CoAP bir broker'a ihtiyaç duyar mı?

Hayır. CoAP istemcileri doğrudan cihaz uç noktalarıyla konuşur. Proxy'ler önbellekleme ve protokol çevirisi ekleyebilir, ancak MQTT'deki gibi merkezi bir broker yoktur.

CoAP ve MQTT birlikte çalışabilir mi?

Evet. Bir gateway genellikle yerel mesh ağdaki CoAP kaynaklarını observe eder ve değerleri buluttaki bir MQTT broker'a publish eder; böylece hem yerel verimlilik hem de bulutta fan-out elde edersiniz.

MQTT UDP'yi destekler mi?

Standart MQTT, TCP veya WebSocket üzerinde çalışır. MQTT-SN ise UDP ve diğer datagram ağları için tasarlanmış ilgili bir protokoldür ve genellikle bir gateway aracılığıyla normal bir MQTT broker'a bağlanır.

İ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.