MQTT vs WebSocket, birbiriyle rekabet eden iki protokol arasında bir seçim gibi görünür; ama aslında bir katman sorusudur. WebSocket, bir tarayıcıya sunucuyla tam çift yönlü bir boru hattı sağlayan bir taşıma katmanıdır; MQTT ise topic'leri, subscription'ları, teslim garantilerini ve oturum durumunu tanımlayan bir mesajlaşma protokolüdür ve bu boru hattı üzerinde çalışabilir. Bu rehber aradaki farkı açıklıyor, ham bir WebSocket uygulamasının elle neleri inşa etmesi gerektiğini gösteriyor ve bir tarayıcıyı güvenli WebSocket üzerinden bir MQTT broker'a bağlamayı adım adım anlatıyor.
WebSocket Aslında Nedir?
WebSocket (RFC 6455), Upgrade: websocket header'ı taşıyan bir HTTP isteği olarak başlar. Sunucu kabul ettiğinde bağlantı, her iki tarafın da istediği zaman metin veya ikili mesaj gönderebildiği hafif bir framing formatına geçer. Tek ve belirli bir sorunu çözer: WebSocket'ten önce tarayıcılar sunucuya açık ve çift yönlü bir bağlantı tutamıyordu.
WebSocket'in neleri tanımlamadığı da en az bu kadar önemlidir. Topic yoktur, subscription yoktur, TCP'nin ötesinde onay yoktur, bir mesajı kimin alması gerektiğine dair bir kavram yoktur, yeniden bağlanma davranışı yoktur ve kopan bir bağlantıdan sonra hayatta kalan bir durum yoktur. Ham WebSocket üzerine kurulan her uygulama kendi mesaj formatını ve semantiğini icat eder.
MQTT Neler Ekler?
MQTT, iyi tanımlanmış bir paket kümesine sahip bir uygulama protokolüdür: CONNECT, PUBLISH, SUBSCRIBE, onay paketleri ve diğerleri. Size şunları sunar:
- Bir broker üzerinden,
+ve#wildcard'larıyla topic tabanlı yönlendirme. - Mesaj başına QoS 0, 1 ve 2 teslim garantileri.
- Yeni bir istemcinin bilinen son değeri hemen almasını sağlayan retained message'lar.
- Bir istemci çevrimdışıyken mesajları kuyruğa alan kalıcı oturumlar.
- Çevrimiçi/çevrimdışı tespiti için keep alive ve Last Will.
- Mesaj süresi dolumu, istek/yanıt için response topic'leri, user property'ler ve reason code'lar gibi MQTT 5 ekstraları.
MQTT normalde düz TCP veya TLS üzerinde çalışır, ancak spesifikasyon mqtt alt protokolünü kullanarak onu WebSocket üzerinden nasıl taşıyacağınızı da tanımlar. Bir tarayıcının bir ESP32 ile aynı protokolü konuşmasını sağlayan da budur. Broker'ın tüm bunları nasıl yönlendirdiğine dair arka plan için MQTT nasıl çalışır yazısına bakın.
MQTT vs WebSocket Karşılaştırma Tablosu
| Özellik | Ham WebSocket | MQTT (TCP veya WebSocket üzerinde) |
|---|---|---|
| Katman | Taşıma (frame'li, tam çift yönlü) | Uygulama mesajlaşma protokolü |
| Mesaj formatı | Sizin tanımladığınız her şey | Topic'ler ve property'ler içeren standart paketler |
| Yönlendirme | Sunucu kodunuz karar verir | Broker topic ve wildcard'a göre yönlendirir |
| Birçok istemciye fan-out | Bağlantıları takip edip döngüyle gönderirsiniz | Broker eşleşen tüm subscriber'lara iletir |
| Teslim garantileri | TCP'nin ötesinde yok | QoS 0, 1, 2 |
| Bilinen son durum | Bir önbellek inşa edersiniz | Retained message'lar |
| Çevrimdışı tamponlama | Kendiniz inşa edersiniz | Kalıcı oturumlar |
| Varlık (presence) bilgisi | Heartbeat'leri kendiniz inşa edersiniz | Keep alive ve Last Will |
| Cihaz desteği | Çoğunlukla tarayıcılar ve sunucular | Mikrodenetleyiciler, gateway'ler, sunucular, tarayıcılar |
| Birlikte çalışabilirlik | Yalnızca kendi sunucunuzla | Herhangi bir MQTT istemcisi ve broker'ı |
Ham Bir WebSocket Uygulamasının İnşa Etmesi Gerekenler
İşte ham WebSocket tabanlı bir dashboard backend'inin gerçekçi bir tablosu. Sunucu bağlı tarayıcıların bir haritasını tutar. Cihazlar ölçümlerini HTTP ya da kendi soketleri üzerinden gönderir. Bir ölçüm geldiğinde sunucu onu kimin alacağına karar verir, eşleşen soketler üzerinde döngüye girer ve JSON gönderir. Sonra gereksinimler gelmeye başlar:
- Tarayıcılar yalnızca görüntüledikleri sahaların verilerini almalıdır; bu yüzden bir "subscribe" mesaj tipi ve bir filtreleme şeması eklersiniz.
- Yeni açılan bir dashboard güncel değerleri hemen göstermelidir; bu yüzden son değerler için bir önbellek eklersiniz.
- Mobil istemciler sık sık düşer; bu yüzden tarayıcıya heartbeat'ler ve yeniden bağlanma mantığı eklersiniz.
- Komutların onaylanması gerekir; bu yüzden mesaj ID'leri ve onaylar eklersiniz.
- Yük için ikinci bir sunucuya ihtiyacınız olur; bu yüzden birindeki bir ölçümün diğerine bağlı tarayıcılara ulaşması için sunucular arasına bir pub/sub katmanı eklersiniz.
Bu noktada bir broker'ı, birlikte çalışabilirliği olmadan yeniden inşa etmiş olursunuz. WebSocket üzerinden MQTT ile bu özelliklerin her biri zaten mevcuttur ve cihazlar ile tarayıcılar tek bir sistemi paylaşır.
Ham WebSocket bazı işler için hâlâ doğru seçimdir: mevcut bir web uygulamasının içindeki bir sohbet özelliği, ortak düzenleme, bir oyun sunucusu ya da her iki ucun da kendi kodunuz olduğu ve mesaj semantiğinin uygulamanıza özgü olduğu her durum.
Bir Tarayıcıyı WebSocket Üzerinden MQTT'ye Bağlayın
ConnectMQ, WebSocket üzerinden MQTT'yi 8083 portunda, güvenli WebSocket üzerinden MQTT'yi ise 8084 portunda sunar; her ikisi de /mqtt path'indedir. HTTPS üzerinden sunulan tarayıcı sayfaları güvenli varyantı kullanmak zorundadır. Aşağıdaki örnek bir CDN'den MQTT.js'i ve ücretsiz herkese açık MQTT broker'ı kullanır; böylece bir HTML dosyası olarak kaydedip doğrudan açabilirsiniz.
// Önce MQTT.js'i yükleyin, örneğin:
// <script src="https://unpkg.com/mqtt@5.10.1/dist/mqtt.min.js"></script>
const prefix = "connectmq/demo/" + Math.random().toString(16).slice(2, 10);
const clientId = "browser-" + Math.random().toString(16).slice(2, 10);
const client = mqtt.connect("wss://broker.connectmq.com:8084/mqtt", {
clientId,
protocolVersion: 5,
clean: true,
keepalive: 30,
reconnectPeriod: 2000,
});
client.on("connect", () => {
console.log("connected as", clientId);
client.subscribe(prefix + "/sensors/+/temperature", { qos: 1 });
// Sonradan katılanların hemen görmesi için retained bir ölçüm publish et
client.publish(
prefix + "/sensors/room1/temperature",
JSON.stringify({ value: 22.3, ts: Date.now() }),
{ qos: 1, retain: true }
);
});
client.on("message", (topic, payload, packet) => {
console.log(topic, payload.toString(), "retain:", packet.retain);
});
client.on("reconnect", () => console.log("reconnecting..."));
client.on("error", (err) => console.error("mqtt error:", err.message));
console.log("Publish test data with:");
console.log(`mosquitto_pub -h broker.connectmq.com -p 1883 -i cli-${clientId} -t "${prefix}/sensors/room2/temperature" -m '{"value":19.8}'`);
Yazdırılan mosquitto_pub komutunu bir terminalden çalıştırın; tarayıcı konsolu, düz bir TCP istemcisinden gelen mesajı gösterecektir. WebSocket üzerinden MQTT'nin amacı da budur: taşıma katmanı farklıdır, topic'ler ve semantik aynıdır.
Özel bir broker için URL'deki host'u kendi broker adresinizle değiştirin ve seçeneklere clientId: "YOUR_CLIENT_ID" ile birlikte username: "YOUR_USERNAME" ve password: "YOUR_PASSWORD" ekleyin. Bir tarayıcıya gönderilen her şeyin kullanıcısı tarafından görülebileceğini unutmayın; bu yüzden cihaz veya backend kimlik bilgilerini yeniden kullanmak yerine tarayıcı istemcilerine kendi sınırlı kimlik bilgilerini verin. WebSocket üzerinden MQTT rehberi portları, proxy'leri ve sorun gidermeyi daha ayrıntılı ele alıyor; JavaScript ile tarayıcıda MQTT ise eksiksiz bir dashboard oluşturuyor.
Performans ve Ek Yük
WebSocket üzerinden MQTT, her MQTT paketinin üzerine küçük bir WebSocket frame header'ı ve başlangıçtaki HTTP upgrade isteğini ekler. Dashboard trafiği için bu maliyet önemsizdir. Kısıtlı cihazların ise WebSocket kullanması için hiçbir neden yoktur; 1883 portunda TCP veya 8883 portunda TLS üzerinden bağlanıp baytlardan tasarruf edin. Yaygın bir ayrım; cihazların 8883, tarayıcıların ise 8084 portunu kullanması ve her ikisinin de aynı broker'la konuşmasıdır.
Sık Yapılan Hatalar
- Yanlış path. ConnectMQ dahil birçok broker
/mqttbekler. Kök path'e bağlanmak bir handshake hatasıyla sonuçlanır. - Karışık içerik (mixed content). HTTPS üzerinden sunulan bir sayfa
ws://bağlantısı açamaz.wss://ve 8084 portunu kullanın. - Paylaşılan client ID'ler. Aynı sabit kodlanmış client ID'ye sahip iki tarayıcı sekmesi birbirini sürekli düşürür. Her sekme için ayrı bir ID üretin.
- Kurumsal proxy'ler. Bazı proxy'ler standart dışı portlardaki WebSocket upgrade isteklerine müdahale eder. Kullanıcılarınızın gerçekten kullandığı ağlardan test edin.
- Gizli bilgilerin sızması. Backend veya cihaz kimlik bilgilerini asla front-end koduna gömmeyin.
Hangisini Seçmelisiniz?
Her iki ucun da kendi web kodunuz olduğu ve semantiğin size özgü olduğu gerçek zamanlı bir özellik geliştiriyorsanız ham WebSocket yeterlidir. Tarayıcıların cihazlardan gelen verileri görmesi gerekiyorsa, birden fazla istemci aynı veriyi paylaşıyorsa ya da garantilere, retained duruma ve varlık bilgisine ihtiyacınız varsa MQTT'yi seçin ve tarayıcıda taşıma katmanı olarak WebSocket'i kullanın. Yönetilen bir MQTT broker, altyapıyı kendiniz işletmeden size her iki uç noktayı da sağlar: cihazlar için TCP, tarayıcılar için WSS. Protokole kapsamlı bir giriş için MQTT eğitimiyle başlayın.
ConnectMQ Üzerinde Gerçek Zamanlı Dashboard'lar Oluşturun
ConnectMQ, MQTT'yi 1883 ve 8883 portlarında, WebSocket üzerinden MQTT'yi ise 8083 ve 8084 portlarında bir Let's Encrypt sertifikasıyla sunar; böylece cihazlar ve tarayıcılar aynı broker'a bağlanır. app.connectmq.com adresinde kredi kartı gerekmeden ücretsiz bir Serverless broker oluşturun ve tek satır front-end kodu yazmadan önce portalın tarayıcı içi MQTT istemcisiyle test edin.
Sık Sorulan Sorular
MQTT, WebSocket'ten daha mı iyi?
İkisi aynı katmanda birbirinin alternatifi değildir. WebSocket bir taşıma katmanıdır; MQTT ise WebSocket üzerinde çalışabilen bir mesajlaşma protokolüdür. Topic'lere, fan-out'a ve teslim garantilerine ihtiyacınız olduğunda MQTT kullanın.
Bir tarayıcı doğrudan bir MQTT broker'a bağlanabilir mi?
Evet, broker WebSocket üzerinden MQTT'yi destekliyorsa. ConnectMQ ile wss://broker.connectmq.com:8084/mqtt adresini ve MQTT.js gibi bir kütüphaneyi kullanın.
MQTT WebSocket bağlantım neden HTTPS bir sayfada başarısız oluyor?
Tarayıcılar HTTPS sayfalardan güvensiz ws:// bağlantılarını engeller. 8084 portunda wss://'e geçin ve path'in /mqtt olduğunu kontrol edin.
IoT cihazları WebSocket üzerinden MQTT kullanmalı mı?
Genellikle hayır. Cihazlar, daha az ek yüke sahip olan TCP veya TLS üzerinden doğrudan MQTT kullanmalıdır. WebSocket esas olarak tarayıcılar ve yalnızca web trafiğine izin veren ağlar içindir.



