HiveMQ Migration

HiveMQ Sonrası MQTT İstemcilerini Yeniden Yapılandırma: ESP32, Python, Node.js ve Node-RED Örnekleri

HiveMQ Cloud Serverless'tan ayrılan her istemcinin yeni bir hostname'e, kimlik bilgilerine, client ID'ye ve TLS ayarlarına ihtiyacı var. ESP32 (Arduino), Python, Node.js, Node-RED ve mosquitto istemcileri için önce/sonra örnekleri ile bağlantı hatalarına yol açan yaygın yanlışlar.

ESP32, Python ve Node.js için MQTT istemci bağlantı ayarlarının bir HiveMQ Cloud hostname'inden broker.connectmq.com adresine değiştirildiğini gösteren kod editörü
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

Bir istemciyi HiveMQ Cloud Serverless'tan taşımak dört şeyi değiştirir: hostname, kimlik bilgileri, client ID ve bazen TLS güven ayarları. Topic'leriniz, payload'larınız ve uygulama mantığınız aynı kalır. Bu makale, hedef olarak özel bir ConnectMQ broker kullanan önce/sonra örnekleriyle en yaygın istemcilerde tam olarak neyin değişmesi gerektiğini gösteriyor.

Genel süreç HiveMQ Serverless geçiş rehberinde yer alıyor.

Neler Değişiyor, Neler Aynı Kalıyor?

Ayar HiveMQ Cloud Serverless ConnectMQ
Hostname <cluster-id>.s1.eu.hivemq.cloud broker.connectmq.com
TLS üzerinden MQTT 8883 8883
Secure WebSocket 8884, path /mqtt 8084, path /mqtt
Kullanıcı adı ve parola HiveMQ konsolunda oluşturulur ConnectMQ portalında her broker için üretilir
Client ID Serbestçe seçilir Verilen client ID, isteğe bağlı olarak bir _suffix ile
Kök sertifika Herkes tarafından güvenilen Let's Encrypt (ISRG Root X1), herkes tarafından güvenilen
Topic'ler, payload'lar, QoS Değişmez Değişmez

Secure WebSocket portuna dikkat edin: tarayıcı dashboard'ları genellikle 8884'ü koda gömer, ConnectMQ ise 8084 kullanır. Kümenizin kullandığı kesin değerler için HiveMQ konsolunuzu kontrol edin.

Arduino ve PubSubClient ile ESP32

Önce (HiveMQ Cloud):

const char* MQTT_HOST = "abc123.s1.eu.hivemq.cloud";
const char* MQTT_USER = "hivemq-user";
const char* MQTT_PASS = "hivemq-pass";
String clientId = "sensor-" + WiFi.macAddress();

Sonra (ConnectMQ):

#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <PubSubClient.h>

const char* MQTT_HOST = "broker.connectmq.com";
const int   MQTT_PORT = 8883;
const char* MQTT_USER = "YOUR_USERNAME";
const char* MQTT_PASS = "YOUR_PASSWORD";
const char* CLIENT_ID_BASE = "YOUR_CLIENT_ID";

// ISRG Root X1 (Let's Encrypt), PEM'i letsencrypt.org/certificates adresinden yapıştırın
static const char ROOT_CA[] PROGMEM = R"EOF(
-----BEGIN CERTIFICATE-----
...ISRG Root X1...
-----END CERTIFICATE-----
)EOF";

WiFiClientSecure net;
PubSubClient mqtt(net);

void connectMqtt() {
  String mac = WiFi.macAddress();
  mac.replace(":", "");
  String clientId = String(CLIENT_ID_BASE) + "_" + mac;   // verilen ID + benzersiz son ek
  while (!mqtt.connected()) {
    if (mqtt.connect(clientId.c_str(), MQTT_USER, MQTT_PASS)) {
      mqtt.publish("site1/esp32/status", "online", true);  // retained durumu yeniden yayınla
      mqtt.subscribe("site1/esp32/cmd");
    } else {
      delay(5000);
    }
  }
}

void setup() {
  // ... önce Wi-Fi'ye bağlanın ...
  net.setCACert(ROOT_CA);
  mqtt.setServer(MQTT_HOST, MQTT_PORT);
  mqtt.setBufferSize(1024);
  connectMqtt();
}

void loop() {
  if (!mqtt.connected()) connectMqtt();
  mqtt.loop();
}

HiveMQ firmware'iniz setInsecure() kullanıyorsa, bu fırsatı sertifikaları düzgün doğrulamak için değerlendirin. Daha fazla ayrıntı ESP32 MQTT over SSL yazısında. Bazı TLS yığınları için ESP32'nin doğru saate ihtiyaç duyduğunu unutmayın; bağlanmadan önce NTP ile saati senkronize edin.

paho-mqtt 2.x ile Python

Önce:

client.username_pw_set("hivemq-user", "hivemq-pass")
client.connect("abc123.s1.eu.hivemq.cloud", 8883)

Sonra:

# pip install "paho-mqtt>=2.0"
import os, ssl
import paho.mqtt.client as mqtt

def on_connect(client, userdata, flags, reason_code, properties):
    print("Connected:", reason_code)
    client.subscribe("site1/#", qos=1)

client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2,
                     client_id=os.environ["MQTT_CLIENT_ID"] + "_ingest",
                     protocol=mqtt.MQTTv5)
client.username_pw_set(os.environ["MQTT_USERNAME"], os.environ["MQTT_PASSWORD"])
client.tls_set(cert_reqs=ssl.CERT_REQUIRED)   # sistem CA deposu Let's Encrypt'e güvenir
client.on_connect = on_connect
client.on_message = lambda c, u, m: print(m.topic, m.payload.decode())
client.connect("broker.connectmq.com", 8883)
client.loop_forever()

on_connect içinde abone olmak önemlidir: her yeniden bağlanmadan sonra abonelikleri geri yükler; böylece istemci hiçbir zaman broker'da saklanan oturum durumuna bağımlı olmaz. paho-mqtt Python ve paho-mqtt yeniden bağlanma yazılarına bakın.

MQTT.js ile Node.js

// npm install mqtt
const mqtt = require("mqtt");

const client = mqtt.connect("mqtts://broker.connectmq.com:8883", {
  // önceden: mqtts://abc123.s1.eu.hivemq.cloud:8883
  username: process.env.MQTT_USERNAME,
  password: process.env.MQTT_PASSWORD,
  clientId: `${process.env.MQTT_CLIENT_ID}_api`,
  protocolVersion: 5,
  reconnectPeriod: 2000,
});

client.on("connect", () => client.subscribe("site1/+/telemetry", { qos: 1 }));
client.on("message", (topic, payload) => console.log(topic, payload.toString()));
client.on("error", (err) => console.error("MQTT error:", err.message));

Bir tarayıcı dashboard'u için aynı seçeneklerle wss://broker.connectmq.com:8084/mqtt kullanın. Node.js ile MQTT.js ve WebSocket üzerinden MQTT yazılarına bakın.

Node-RED

Node-RED'de tüm MQTT node'ları tek bir broker yapılandırma node'unu paylaşır; bu yüzden geçiş genellikle tek bir düzenlemeden ibarettir:

  1. Herhangi bir mqtt in veya mqtt out node'unu açın ve sunucunun yanındaki kalem simgesine tıklayın.
  2. Connection sekmesi: Server'ı broker.connectmq.com, Port'u 8883 olarak ayarlayın, Use TLS kutusunu işaretleyin ve sunucu sertifikasını doğrulayan bir TLS yapılandırması seçin. MQTT 5 özelliklerini kullanıyorsanız Protocol'ü MQTT V5 olarak ayarlayın.
  3. Client ID: verilen client ID'nizi bir son ekle girin, örneğin YOUR_CLIENT_ID_nodered.
  4. Security sekmesi: yeni kullanıcı adını ve parolayı girin.
  5. Deploy edin ve node'ların connected gösterdiğini kontrol edin.

Node sürekli "connecting" gösteriyorsa Node-RED MQTT bağlanmıyor ve Node-RED MQTT TLS yazılarına bakın.

mosquitto Komut Satırı İstemcileri

mosquitto_sub -h broker.connectmq.com -p 8883 --capath /etc/ssl/certs \
  -u YOUR_USERNAME -P YOUR_PASSWORD -i YOUR_CLIENT_ID_cli \
  -t 'site1/#' -v

Windows veya macOS'ta --capath yerine ISRG Root X1 içeren bir PEM paketiyle --cafile kullanın.

Başarısız Bağlantılarda Sorun Giderme

Belirti Olası neden Çözüm
Not authorized / hatalı kullanıcı adı veya parola Eski HiveMQ kimlik bilgileri hâlâ kullanılıyor Yeni kimlik bilgilerini portaldan kopyalayın
CONNECT'ten hemen sonra bağlantı reddediliyor Client ID, verilen ID veya _suffix deseniyle eşleşmiyor YOUR_CLIENT_ID veya YOUR_CLIENT_ID_<suffix> kullanın
İki cihaz sürekli birbirinin bağlantısını koparıyor İkisinde de aynı client ID var MAC veya seri numarasından benzersiz bir son ek türetin
TLS handshake hatası Cihazın güven deposunda ISRG Root X1 yok veya saat yanlış Kök sertifikayı ekleyin, saati senkronize edin. MQTT TLS handshake başarısız yazısına bakın
Tarayıcı bağlanamıyor Yanlış WebSocket portu veya path wss://broker.connectmq.com:8084/mqtt kullanın
Bağlantı çalışıyor, yayınlar reddediliyor QoS 2 veya plan limitinin üzerinde payload Serverless (Free) üzerinde QoS 1 kullanın, payload'ları 256 KB altında tutun veya yükseltin
Reason code 0x97 Planın bağlantı kotası aşıldı Bir sonraki dalgadan önce planı yükseltin

Bir Sonraki Değişikliği Kolaylaştırın

Zaten her istemciyi düzenlerken hostname, port, kimlik bilgileri ve client ID'yi uzaktan güncellenebilen bir yapılandırmaya taşıyın: bir yapılandırma dosyası, ortam değişkenleri, bir provisioning servisi veya bir OTA ayar payload'u. Böylece gelecekte kimlik bilgilerini yenilemek veya broker değiştirmek bir firmware projesi değil, bir yapılandırma gönderimi olur.

Bu örneklerin herhangi birini şu anda app.connectmq.com adresindeki ücretsiz bir broker'a karşı test edebilirsiniz.

Sık Sorulan Sorular

HiveMQ Cloud'dan ayrılırken topic'lerimi değiştirmem gerekiyor mu?

Hayır. Topic'ler, payload'lar ve QoS seviyeleri aynı kalır. Yalnızca bağlantı ayarları değişir.

ConnectMQ neden belirli bir client ID istiyor?

Client ID'leri kimlik bilgilerine bağlamak, başka bir kiracının veya sızdırılmış bir kimlik bilgisinin cihazlarınızı taklit etmesini önler. Benzersiz bir son ek ekleyerek tek bir kimlik bilgisi setiyle yine de çok sayıda istemci çalıştırabilirsiniz.

Port 8883 her iki broker'da da aynı mı?

Evet, TLS üzerinden MQTT her ikisinde de 8883 kullanır. Secure WebSocket portu farklıdır: ConnectMQ, /mqtt path'i ile 8084 kullanır.

ESP32'de setInsecure kullanmaya devam edebilir miyim?

Bağlanır, ancak sunucu doğrulamasını atlar ve cihazları taklit saldırılarına açık bırakır. Bunun yerine ISRG Root X1 sertifikasını kullanın.

İlgili yazılar

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.