Broker testleri

MQTT over WebSockets Nasıl Test Edilir (ws ve wss)

MQTT WebSocket uç noktasını adım adım test edin: /mqtt yolu, mqtt alt protokolü, curl ve wscat ile handshake kontrolü, tarayıcı DevTools ve bir MQTT.js testi.

Güncellendi · 8 dk okuma

MQTT over WebSockets Nasıl Test Edilir (ws ve wss)

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ÖrnekTipik hata
Şemawss://HTTPS sayfasından ws:// (karışık içerik olarak engellenir)
Hostbroker.connectmq.comwss ile IP adresi — sertifika eşleşmez
Port8084TCP portu 1883 veya TLS portu 8883 kullanmak
Yol/mqttEksik 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:

WebSocket handshake kontrolü
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:

Beklenen yanıt
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Sec-WebSocket-Protocol: mqtt

Ardı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ıtAnlamı
Sec-WebSocket-Protocol: mqtt olmadan 101Broker veya proxy alt protokolü düşürüyor; tarayıcılar soketi kapatır
404 Not FoundYanlış yol — /mqtt, / veya broker'ınızın belgelenmiş yolunu deneyin (ayrıntılar)
400 Bad Request / 426 Upgrade RequiredUpgrade başlıkları eksik — çoğunlukla bunları iletmeyen bir proxy
502 Bad GatewayReverse proxy broker'ın WebSocket listener'ına ulaşamıyor
Empty reply from server veya resetPort 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:

wscat
npx wscat -c wss://broker.connectmq.com:8084/mqtt -s mqtt

Connected (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:

ws-check.mjs (MQTT.js 5)
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:

ws_check.py (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:

  1. DevTools → Network sekmesini açın, WS ile filtreleyin (Chrome) veya tür filtresinde WS seçin (Firefox) ve sayfayı yenileyin.
  2. Soket isteğine tıklayın. Headers altında durumu (101), URL'yi ve yolu, ayrıca hem istekte hem yanıtta Sec-WebSocket-Protocol: mqtt olduğunu kontrol edin.
  3. 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.
  4. Console'da şu tür hataları arayın:
Tipik konsol hataları
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

  1. wss:// URL'sine curl isteği 101 döndürüyor ve Sec-WebSocket-Protocol: mqtt başlığını geri veriyor.
  2. -s mqtt ile wscat bağlanıyor; olmadan broker reddediyor veya kapatıyor.
  3. Gerçek bir istemci CONNACK alıyor ve bir publish/subscribe gidiş-dönüşünü tamamlıyor.
  4. Tarayıcı, bir HTTPS sayfasından wss:// ile konsol hatası olmadan bağlanıyor.
  5. Proxy veya load balancer üzerinden boşta kalan bağlantılar keep-alive aralığından daha uzun süre ayakta kalıyor.
  6. 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.