MQTT over WebSockets'i test etmek için bağlantıyı iki aşamada doğrulayın: önce HTTP upgrade (doğru URL, doğru yol, mqtt alt protokolü, 101 Switching Protocols), ardından soketin içinde gerçek bir MQTT oturumu (CONNECT, CONNACK, publish, subscribe). WebSocket sorunlarının çoğu — 404'ler, kapanan soketler, karışık içerik engellemeleri — MQTT daha devreye girmeden, ilk aşamada yaşanır.
Örnekler broker.connectmq.com kullanır: 8083 portunda ws://, 8084 portunda wss://, ikisi de /mqtt yoluyla.
Çalışan bir MQTT WebSocket bağlantısı nasıl görünür
Bir MQTT WebSocket URL'si dört parçadan oluşur ve her biri yanlış olabilir:
| Parça | Örnek | Tipik hata |
|---|---|---|
| Şema | wss:// | HTTPS sayfasından ws:// (karışık içerik olarak engellenir) |
| Host | broker.connectmq.com | wss ile IP adresi — sertifika eşleşmez |
| Port | 8084 | TCP portu 1883 veya TLS portu 8883 kullanmak |
| Yol | /mqtt | Eksik veya yanlış yol — 404 Not Found |
İstemci ayrıca Sec-WebSocket-Protocol: mqtt başlığını gönderir. Broker HTTP/1.1 101 Switching Protocols ile yanıt vermeli ve Sec-WebSocket-Protocol: mqtt başlığını geri döndürmelidir. Bundan sonra soket sıradan ikili MQTT paketlerini taşır — TCP'deki CONNECT ve CONNACK'in aynısı. Arka plan için bkz. MQTT over WebSockets.
1. aşama: handshake'i test edin
curl ile
curl, upgrade isteğini elle gönderip ham yanıtı gösterebilir. Bu, HTTP kısmını tüm MQTT kütüphanelerinden ayırır:
curl -i --http1.1 --max-time 5 \
-H "Connection: Upgrade" \
-H "Upgrade: websocket" \
-H "Sec-WebSocket-Version: 13" \
-H "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==" \
-H "Sec-WebSocket-Protocol: mqtt" \
https://broker.connectmq.com:8084/mqttŞifresiz listener'ı test etmek için http://...:8083/mqtt kullanın. Sağlıklı bir uç nokta şöyle yanıt verir:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Sec-WebSocket-Protocol: mqttArdından curl --max-time dolana kadar bekler, çünkü soket açık kalır — bu beklenen davranıştır. Diğer yanıtlar neyi düzeltmeniz gerektiğini söyler:
| Yanıt | Anlamı |
|---|---|
Sec-WebSocket-Protocol: mqtt olmadan 101 | Broker veya proxy alt protokolü düşürüyor; tarayıcılar soketi kapatır |
404 Not Found | Yanlış yol — /mqtt, / veya broker'ınızın belgelenmiş yolunu deneyin (ayrıntılar) |
400 Bad Request / 426 Upgrade Required | Upgrade başlıkları eksik — çoğunlukla bunları iletmeyen bir proxy |
502 Bad Gateway | Reverse proxy broker'ın WebSocket listener'ına ulaşamıyor |
Empty reply from server veya reset | Port WebSocket değil, normal MQTT/TLS |
| SSL sertifika hatası | 8883'teki TLS sorunlarının aynısı — sertifika hostname ile eşleşmeli |
Broker Nginx veya başka bir proxy'nin arkasındaysa, 400 ya da eksik alt protokol neredeyse her zaman Upgrade ve Connection başlıklarının iletilmediği anlamına gelir — bkz. Nginx proxy arkasında MQTT.
wscat ile
wscat, alt protokolü doğru şekilde müzakere eden küçük bir WebSocket istemcisidir:
npx wscat -c wss://broker.connectmq.com:8084/mqtt -s mqttConnected (press CTRL+C to quit) handshake'in ve alt protokolün sorunsuz olduğu anlamına gelir. Birkaç saniye sonra broker soketi kapatır, çünkü hiçbir MQTT CONNECT paketi gelmemiştir — bu normaldir ve aslında orada bir MQTT broker'ının dinlediğini doğrular. -s mqtt olmadan birçok broker upgrade'i reddeder; bu da kullanışlı bir negatif testtir.
2. aşama: gerçek bir MQTT oturumunu test edin
mosquitto komut satırı istemcileri WebSocket üzerinden bağlanamaz, bu yüzden WebSocket destekleyen bir istemci kullanın. En hızlısı online MQTT istemcisidir: wss:// URL'sini girin, bağlanın, bir test topic'ine abone olun ve ona publish edin. Bu çalışıyorsa broker tarafı doğrudur ve kalan her sorun uygulamanızdadır.
Otomatik bir kontrol için bu MQTT.js 5 betiği Node.js'te veya neredeyse hiç değiştirmeden tarayıcıda çalışır:
import mqtt from "mqtt";
const url = "wss://broker.connectmq.com:8084/mqtt";
const topic = `testmqtt/ws/${Math.random().toString(16).slice(2, 10)}`;
const client = mqtt.connect(url, {
protocolVersion: 5,
username: process.env.MQTT_USER,
password: process.env.MQTT_PASS,
connectTimeout: 5000,
reconnectPeriod: 0, // test sırasında hızlı başarısız ol
});
const started = Date.now();
client.on("connect", (connack) => {
console.log(`CONNACK reason ${connack.reasonCode ?? 0} after ${Date.now() - started} ms`);
client.subscribe(topic, { qos: 1 }, () => client.publish(topic, "ping over websocket", { qos: 1 }));
});
client.on("message", (t, payload) => {
console.log(`round trip ok on ${t}: ${payload}`);
client.end();
});
client.on("error", (err) => { console.error("error:", err.message); process.exit(1); });
client.on("close", () => console.log("socket closed"));MQTT.js mqtt alt protokolünü otomatik olarak ayarlar. Python da çalışır — transport="websockets" ile paho-mqtt 2.x:
import os
import paho.mqtt.client as mqtt
c = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, transport="websockets", protocol=mqtt.MQTTv5)
c.ws_set_options(path="/mqtt")
c.tls_set() # 8083 portunda ws:// için kaldırın
c.username_pw_set(os.environ["MQTT_USER"], os.environ["MQTT_PASS"])
c.on_connect = lambda cl, u, f, rc, p: print("CONNACK:", rc)
c.connect("broker.connectmq.com", 8084)
c.loop_forever()paho'nun varsayılan WebSocket yolu zaten /mqtt'dir, bu yüzden burada ws_set_options isteğe bağlıdır — ancak / veya özel bir yol kullanan broker'lar, yolu açıkça ayarlayana kadar 404 ile yanıt verir.
Tarayıcı DevTools ile debug
Bir web uygulaması bağlanamadığında tarayıcı handshake'in her ayrıntısını gösterir:
- DevTools → Network sekmesini açın, WS ile filtreleyin (Chrome) veya tür filtresinde WS seçin (Firefox) ve sayfayı yenileyin.
- Soket isteğine tıklayın. Headers altında durumu (
101), URL'yi ve yolu, ayrıca hem istekte hem yanıttaSec-WebSocket-Protocol: mqttolduğunu kontrol edin. - Messages (Chrome) veya Response (Firefox) sekmesini açın. Giden ilk frame ikili MQTT CONNECT, gelen ilk frame CONNACK'tir. CONNECT gidiyor ve soket CONNACK olmadan kapanıyorsa broker WebSocket'i değil, MQTT oturumunu (kimlik bilgileri, client ID) reddetmiştir.
- Console'da şu tür hataları arayın:
WebSocket connection to 'wss://broker.example.com:8084/mqtt' failed:
Mixed Content: The page at 'https://app.example.com/' was loaded over HTTPS, but attempted to connect to the insecure WebSocket endpoint 'ws://broker.example.com:8083/mqtt'. This request has been blocked; this endpoint must be available over WSS.İki noktadan sonra hiçbir şey yazmayan ilki, tarayıcının genel hata mesajıdır — genellikle yanlış port, yol veya sertifika; Network sekmesine bakın. İkincisi yalnızca wss://'e geçerek çözülür (karışık içerik). 1006 kapanış kodu, bağlantının düzgün bir kapanış frame'i olmadan koptuğunu gösterir; çoğunlukla bir proxy zaman aşımı ya da bağlantıyı reddeden bir broker'dır. Nedenlerin tam listesi için bkz. MQTT WebSocket connection failed.
WebSocket test kontrol listesi
wss://URL'sine curl isteği101döndürüyor veSec-WebSocket-Protocol: mqttbaşlığını geri veriyor.-s mqttile wscat bağlanıyor; olmadan broker reddediyor veya kapatıyor.- Gerçek bir istemci CONNACK alıyor ve bir publish/subscribe gidiş-dönüşünü tamamlıyor.
- Tarayıcı, bir HTTPS sayfasından
wss://ile konsol hatası olmadan bağlanıyor. - Proxy veya load balancer üzerinden boşta kalan bağlantılar keep-alive aralığından daha uzun süre ayakta kalıyor.
- Kimlik bilgileri ve ACL'ler WebSocket listener'ında TCP'dekiyle aynı davranıyor.
WebSocket uç noktasını tarayıcınızda test edin
WebSocket sorunları, onları ikiye bölene kadar gizemli görünür. HTTP upgrade'i curl veya wscat ile, ardından MQTT oturumunu gerçek bir istemciyle kanıtlayın; birkaç dakika içinde URL'yi mi, proxy'yi mi yoksa MQTT kimlik bilgilerini mi düzeltmeniz gerektiğini bilirsiniz.
Sıkça sorulan sorular
MQTT için WebSocket yolu nedir?
Tek bir standart yoktur. En yaygını /mqtt'dir (EMQX, HiveMQ ve ConnectMQ bunu kullanır, Mosquitto'nun önündeki proxy'ler de genellikle bu yolu yönlendirir), ancak bazı broker'lar / veya özel bir yolda dinler. Yanlış yol, handshake sırasında genellikle HTTP 404 döndürür.
MQTT hangi WebSocket alt protokolünü kullanır?
Hem MQTT 3.1.1 hem MQTT 5 için mqtt. Eski MQTT 3.1 istemcileri mqttv3.1 kullanıyordu. İstemci bunu Sec-WebSocket-Protocol başlığında gönderir ve broker 101 yanıtında aynen geri döndürmelidir; döndürmezse tarayıcılar bağlantıyı keser.
mosquitto_pub WebSocket üzerinden bağlanabilir mi?
Hayır. mosquitto komut satırı istemcileri MQTT'yi yalnızca TCP ve TLS üzerinden konuşur. Bir WebSocket listener'ını test etmek için tarayıcı tabanlı bir istemci, MQTT.js, transport="websockets" ile paho-mqtt veya MQTTX gibi bir masaüstü istemcisi kullanın.


