MQTT Temelleri

MQTT vs WebSocket: Protokol mü, Taşıma Katmanı mı?

WebSocket ve MQTT sıkça karşılaştırılır, ancak biri taşıma katmanı, diğeri bir mesajlaşma protokolüdür. Ham WebSocket uygulamalarının kendi başına neleri inşa etmesi gerektiğini ve tarayıcıda MQTT'yi güvenli WebSocket üzerinden nasıl çalıştıracağınızı öğrenin.

Bir tarayıcıdan broker'a uzanan WebSocket bağlantısının içinde taşınan MQTT paketlerini gösteren ve MQTT vs WebSocket farkını açıklayan katmanlı diyagram
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 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:

  1. 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.
  2. Yeni açılan bir dashboard güncel değerleri hemen göstermelidir; bu yüzden son değerler için bir önbellek eklersiniz.
  3. Mobil istemciler sık sık düşer; bu yüzden tarayıcıya heartbeat'ler ve yeniden bağlanma mantığı eklersiniz.
  4. Komutların onaylanması gerekir; bu yüzden mesaj ID'leri ve onaylar eklersiniz.
  5. 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 /mqtt bekler. 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.

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