Projeniz cihazdan buluta bir gateway yerine cihazlar, uygulamalar ve servisler arasında gerçek publish/subscribe gerektiriyorsa bir Azure IoT Hub alternatifini değerlendirmeye değer. Bu makale, IoT Hub'ın cihaz odaklı MQTT desteğinin tam bir MQTT 3.1.1/5.0 broker'dan nasıl farklılaştığını, her iki tarafta nelerin değerlendirilmesi gerektiğini ve filonuzu süreç boyunca çalışır halde tutan, standart bir broker'a aşamalı taşıma yolunu açıklıyor.
Azure IoT Hub Ne İçin Tasarlanmıştır
Azure IoT Hub, Azure'da cihazları bağlamak, yönetmek ve onlarla iletişim kurmak için yönetilen bir hizmettir. Güçlü yanları filo odaklıdır: bir cihaz kimlik kaydı, device twin'ler, direct method'lar, buluttan cihaza mesajlar ve telemetrinin diğer Azure hizmetlerine yönlendirilmesi. Cihazlar SAS token ya da X.509 sertifikası ile kimlik doğrulayarak MQTT, AMQP veya HTTPS kullanabilir.
IoT Hub ile MQTT kullandığınızda onun cihaz modeli içinde çalışırsınız. Cihazlar telemetriyi devices/{device_id}/messages/events/ gibi cihaza özgü bir topic'e yayınlar ve mesajları devices/{device_id}/messages/devicebound/# üzerinden alır. Twin güncellemeleri ve direct method'ların kendi ayrılmış topic'leri vardır. Hizmet, rastgele istemciler arasında mesaj aktaran bir broker değil, her cihazın karşı tarafıdır.
Bu, cihaz yönetimi ve buluta veri alımı için bilinçli bir tasarımdır. Yalnızca genel amaçlı bir MQTT broker ile aynı şey değildir. Microsoft, Azure Event Grid'de publish/subscribe senaryolarını hedefleyen bir MQTT broker yeteneği de sunar; Azure içinde kalmak istiyorsanız bunu değerlendirmeye değer. Her hizmetin kesin yetenekleri için Microsoft'un güncel dokümantasyonunu kontrol edin.
Cihaz Odaklı MQTT vs Tam Bir MQTT Broker
| Özellik | Cihaz odaklı (IoT Hub tarzı) | Tam MQTT broker (ör. ConnectMQ) |
|---|---|---|
| Topic ad alanı | Sabit, cihaz başına ayrılmış topic'ler | Kendi hiyerarşiniz, ör. tesis/alan/hat/cihaz |
| Cihazdan cihaza mesajlaşma | Bulut arka ucu üzerinden | Herhangi istemciler arasında doğrudan publish/subscribe |
| Cihazlar arası joker karakterli abonelikler | Modelin parçası değil; arka uç servisleri yönlendirilmiş veriyi okur | Topic ağacınız genelinde + ve # |
| Tarayıcı ve uygulama istemcileri | Genellikle bir arka uç API'si üzerinden | Doğrudan Secure WebSocket (8084, path /mqtt) |
| Retained message'lar ve MQTT 5 özellikleri | Güncel desteği kontrol edin | Retained message'lar, session expiry, topic alias, message expiry, response topic |
| Cihaz yönetimi | Twin'ler, direct method'lar, kayıt | Kendi durum topic'leriniz ve envanteriniz |
| Bulut yönlendirme | Azure hizmetlerine yerleşik yönlendirmeler | Node-RED veya Telegraf gibi harici MQTT istemcileri |
Cihaz yönetimi ve Azure entegrasyonu en önemli olduğunda sol sütun kazanır. Her yerde standart MQTT semantiği istediğinizde sağ sütun kazanır.
Tam Bir MQTT Broker'ın Daha Uygun Olduğunun İşaretleri
- Dashboard'lar ve uygulamalar canlı veriye doğrudan ihtiyaç duyuyor. Tam bir broker ile bir tarayıcı uygulaması, arka uç aktarıcısı olmadan Secure WebSocket üzerinden abone olur.
- Cihazlar ya da makineler birbiriyle konuşuyor. Bir kontrolcünün bir sensörün topic'ine abone olması MQTT'de doğaldır, cihazdan buluta bir modelde ise zahmetlidir.
- Bir Unified Namespace inşa ediyorsunuz. Bir ISA-95 topic hiyerarşisi, topic ağacının sahibi olduğunuz bir broker gerektirir. Bkz. MQTT Sparkplug B ve Unified Namespace.
- Taşınabilir firmware istiyorsunuz. Standart topic'ler ve standart kimlik doğrulama, cihazları herhangi bir buluttan bağımsız kılar.
- Sistemleriniz birden fazla buluta ya da şirket içi sahaya yayılıyor.
IoT Hub Kavramlarını Standart MQTT'ye Eşlemek
| IoT Hub kavramı | Standart MQTT karşılığı |
|---|---|
| Cihazdan buluta telemetri | site1/area1/line1/dev42/telemetry topic'ine yayın |
| Buluttan cihaza mesaj | Cihaz site1/area1/line1/dev42/cmd topic'ine abone olur |
| Device twin raporlanan özellikleri | .../dev42/state/reported üzerinde retained message |
| Device twin istenen özellikleri | .../dev42/state/desired üzerinde retained message |
| Direct method | Response topic ve correlation data kullanan MQTT 5 istek/yanıt |
| Bağlantı durumu olayları | ConnectMQ'da $SYS/broker/connection/{clientId}/state |
| Mesaj yönlendirme | Harici abone, Node-RED akışı ya da Telegraf ajanı |
MQTT 5'in response topic özelliği, direct method'ların yerini almak için özellikle faydalıdır: çağıran taraf bir response topic ile bir istek yayınlar ve cihaz yanıtını oraya yayınlar.
IoT Hub'dan Ayrıldığınızda Üstlendikleriniz
Adil bir karşılaştırma, sizin tarafınıza geçen işi de içerir. IoT Hub bir cihaz kaydını, twin depolamayı, method çağırmayı ve yönlendirmeyi bir arada sunar. Sade bir broker ile bu desenlerin sahibi siz olursunuz:
- Cihaz envanteri. Cihazların, kimlik bilgilerinin ve firmware sürümlerinin listesini kendi sisteminizde tutun.
- Durum kuralları. Raporlanan ve istenen durum payload'larının yapısında uzlaşın ve her firmware ekibinin aynı kuralları izlemesi için bunları belgeleyin.
- Komut güvenliği. Komut topic'lerine kimlerin yayın yapabileceğini tanımlayın ve her komutu uygulamadan önce cihazda doğrulayın.
- Veri yönlendirme. Veriyi depolama ve analitiğe taşıyan aboneleri ya da akışları çalıştırın ve izleyin.
Birçok ekip için bunlar küçük ve iyi bilinen görevlerdir. Diğerleri için, özellikle karmaşık provisioning süreçleriyle çok büyük filolar yönetenler için, bir platformun yerleşik cihaz yönetimini korumaya değer. Kendi filo boyutunuzu ve ekibinizi göz önünde bulundurarak karar verin.
Örnek: Taşıma Sonrası Cihaz Kodu
İşte PubSubClient kullanarak telemetri yayınlayan ve sizin tanımladığınız topic'lerde komutları dinleyen, ConnectMQ'ya TLS üzerinden bağlanan bir ESP32 sketch'i:
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <PubSubClient.h>
const char* WIFI_SSID = "YOUR_WIFI";
const char* WIFI_PASS = "YOUR_WIFI_PASSWORD";
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 = "YOUR_CLIENT_ID";
const char* TOPIC_TELEMETRY = "site1/area1/line1/dev42/telemetry";
const char* TOPIC_CMD = "site1/area1/line1/dev42/cmd";
WiFiClientSecure net;
PubSubClient mqtt(net);
void onMessage(char* topic, byte* payload, unsigned int length) {
String msg;
for (unsigned int i = 0; i < length; i++) msg += (char)payload[i];
Serial.printf("Command on %s: %s\n", topic, msg.c_str());
}
void connectMqtt() {
while (!mqtt.connected()) {
Serial.print("Connecting to MQTT... ");
if (mqtt.connect(CLIENT_ID, MQTT_USER, MQTT_PASS)) {
Serial.println("connected");
mqtt.subscribe(TOPIC_CMD, 1);
} else {
Serial.printf("failed, state=%d\n", mqtt.state());
delay(5000);
}
}
}
void setup() {
Serial.begin(115200);
WiFi.begin(WIFI_SSID, WIFI_PASS);
while (WiFi.status() != WL_CONNECTED) delay(500);
// Üretimde ISRG Root X1 CA'sını net.setCACert(...) ile sabitleyin
net.setInsecure();
mqtt.setServer(MQTT_HOST, MQTT_PORT);
mqtt.setCallback(onMessage);
}
void loop() {
if (!mqtt.connected()) connectMqtt();
mqtt.loop();
static unsigned long last = 0;
if (millis() - last > 10000) {
last = millis();
char payload[64];
snprintf(payload, sizeof(payload), "{\"temp\":%.1f}", 20.0 + random(0, 50) / 10.0);
mqtt.publish(TOPIC_TELEMETRY, payload);
}
}
setInsecure() yalnızca ilk test içindir. Üretimde cihazın broker'ı doğrulaması için Let's Encrypt kök sertifikasını setCACert() ile yükleyin. ESP32 MQTT eğitimi sertifika yönetimini ayrıntılı olarak ele alıyor.
Aşamalı Bir Taşıma Yolu
- Topic ağacını tasarlayın. Kurum/tesis/alan/hat/cihaz gibi bir hiyerarşiye karar verin ve telemetri, durum ve komut topic'lerini ayırın.
- Mevcut veriyi köprüleyin. Mevcut IoT Hub tüketicilerinizden (örneğin yerleşik event uç noktasından) okuyup yeni broker'ın topic'lerine yeniden yayınlayan küçük bir servis çalıştırın. Yeni dashboard'lar broker'ı hemen kullanabilir.
- Yönlendirmeleri değiştirin. Her Azure yönlendirmesini aynı hedefe yazan harici bir abone, Node-RED akışı ya da Telegraf çıktısı olarak yeniden oluşturun.
- Bir pilot grubu taşıyın. Birkaç cihazın firmware'ini ya da gateway yapılandırmasını güncelleyin. Yeniden bağlanma davranışını ve plan sınırlarını kontrol edin; ConnectMQ'da bir kota aşılırsa MQTT 5 istemcileri 0x97 reason code'unu alır.
- Dalgalar halinde yaygınlaştırın ve her dalga kararlı hale gelene kadar önceki yapılandırmayı hazır tutun.
Geçiş Sonrası Sorun Giderme
- Cihaz bağlanıyor, sonra birkaç saniyede bir bağlantısı kopuyor. İki cihaz aynı client ID'yi paylaşıyor. Her cihaza kendi kimlik bilgilerini ve client ID'sini verin.
- Arka uç servisi veri görmüyor. Abonelik filtresini kontrol edin.
site1/+/telemetryfiltresisite1/area1/line1/dev42/telemetryile eşleşmez;site1/#ya da doğru sayıda+seviyesi kullanın. - Komutlar iki kez geliyor. QoS 1 ile yinelenen mesajlar tasarım gereği mümkündür. Bir komut kimliği ekleyin ve tekrarları yok sayın. MQTT QoS seviyeleri rehberi nedenini açıklıyor.
- Yeniden başlatmadan sonra eski durum görünüyor. Retained message'lar değiştirilene ya da temizlenene kadar kalır. Birini temizlemek için boş bir retained payload yayınlayın.
Tam Bir MQTT Broker Deneyin
Herhangi bir cihazı değiştirmeden önce publish/subscribe modelini keşfedebilirsiniz. Kredi kartı gerektirmeden ücretsiz bir Serverless broker oluşturun, bir test cihazı ve bir tarayıcı istemcisi bağlayın ve mesajları canlı topic gezgininde izleyin. Daha geniş bağlam için buluttaki MQTT broker rehberini okuyun, AWS IoT Core alternatifi makalesiyle karşılaştırın ve bir MQTT broker'ın ne yaptığını gözden geçirin. Daha fazlasını connectmq.com adresinde öğrenin.
Sık Sorulan Sorular
Azure IoT Hub bir MQTT broker mıdır?
IoT Hub cihaz iletişimi için MQTT'yi destekler, ancak ayrılmış topic'lere sahip cihazdan buluta bir model içinde. Rastgele istemciler arasında genel bir publish/subscribe broker olarak tasarlanmamıştır.
Device twin'leri standart MQTT ile nasıl değiştiririm?
Raporlanan ve istenen durum topic'lerinde retained message'lar kullanın. Yeni aboneler bilinen son durumu hemen alır.
Başka bir broker'a geçtikten sonra Azure hizmetlerini kullanmaya devam edebilir miyim?
Evet. Harici bir abone ya da Node-RED akışı, veriyi broker'dan herhangi bir Azure hizmetine normal API'leri üzerinden iletebilir.
Güncel IoT Hub MQTT yeteneklerini nereden kontrol ederim?
Güncel sürüm için desteklenen MQTT özelliklerini ve sınırlarını anlatan Microsoft'un resmi Azure IoT Hub dokümantasyonunu kullanın.



