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:
- Herhangi bir mqtt in veya mqtt out node'unu açın ve sunucunun yanındaki kalem simgesine tıklayın.
- Connection sekmesi: Server'ı
broker.connectmq.com, Port'u8883olarak 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. - Client ID: verilen client ID'nizi bir son ekle girin, örneğin
YOUR_CLIENT_ID_nodered. - Security sekmesi: yeni kullanıcı adını ve parolayı girin.
- 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.



