MQTT tedarikçi bağımlılığı (vendor lock-in) kulağa çelişkili gelir, çünkü MQTT açık bir OASIS standardıdır. Yine de birçok IoT ekibi, cihazlarını başka bir sağlayıcıya taşımanın firmware'i yeniden yazmak anlamına geldiğini fark eder. Bu makale bağımlılığın gerçekte nereden geldiğini, hangi özel uzantıların bunu yarattığını ve cihazlarınızı standart herhangi bir MQTT 3.1.1/5.0 broker arasında taşınabilir tutan somut tasarım kurallarını açıklıyor.
Protokol Açıktır; Çevresi Değildir
MQTT'nin kendisi, mqtt.org adresinde yayımlanan OASIS MQTT 3.1.1 ve 5.0 spesifikasyonlarıyla tanımlanır. Uyumlu her istemci uyumlu her broker ile konuşabilir: connect, publish, subscribe, QoS, retained message'lar, will message'lar ve MQTT 5'te session expiry, message expiry, topic alias'ları ve response topic'leri gibi özellikler.
Bağımlılık, protokolün çevresindeki her şeyden sızar:
- Cihazların kullanmak zorunda olduğu ayrılmış, platform tanımlı topic'ler.
- Yalnızca tek bir platformun anladığı özel kimlik doğrulama akışları.
- MQTT'yi platforma özgü kavramlarla saran tedarikçi cihaz SDK'ları.
- Bir platformun kendi dilinde yazılmış kurallar, yönlendirmeler ya da dönüşümler gibi sunucu tarafı mantık.
- Cihazların dayandığı shadow'lar ya da twin'ler gibi platform durum hizmetleri.
- Yalnızca platformun araçlarının çözümleyebildiği standart dışı payload kuralları.
Bunların her biri iyi bir özellik olabilir. Sorun, firmware'iniz bir soyutlama katmanı olmadan onlara bağımlı olduğunda ortaya çıkar.
MQTT Tedarikçi Bağımlılığının Yaygın Kaynakları
| Kaynak | Örnek desen | Neden bağımlı kılar | Taşınabilir alternatif |
|---|---|---|---|
| Ayrılmış topic'ler | Tedarikçi önekli platform shadow ya da event topic'leri | Firmware yalnızca tek bir hizmetin anladığı yolları koda gömer | Kendi hiyerarşiniz, ör. site/area/line/device/telemetry |
| Yalnızca cihazdan buluta modeller | Cihaz başına sabit telemetri ve komut topic'leri | Cihazlar birbirine ya da paylaşımlı topic'lere abone olamaz | Joker karakterlerle standart publish/subscribe |
| Özel kimlik doğrulama | Bir tedarikçi SDK'sının ürettiği imzalı token'lar | Taşınmak için her cihaz yeni kimlik bilgisi mantığına ihtiyaç duyar | Standart TLS üzerinden kullanıcı adı/parola ya da X.509 |
| Tedarikçi SDK'ları | Shadow'lar, job'lar ve provisioning için platform istemci kütüphaneleri | Uygulama kodu MQTT'yi değil, platform API'lerini çağırır | Paho, MQTT.js, PubSubClient, ESP-MQTT |
| Broker içi kurallar | Bir platform kural dilinde yazılmış yönlendirme mantığı | Taşınmak için iş mantığının yeniden yazılması gerekir | Sahibi olduğunuz harici aboneler, Node-RED ya da akış işleme |
| Platform durum hizmetleri | Shadow ya da twin belgeleri | Durum modeli tek bir API'ye bağlıdır | Durum topic'lerinde retained message'lar |
Platform özellikleri kötü değildir. AWS, Azure ve diğer sağlayıcılar bunları gerçek bir iş yükünden tasarruf sağladıkları için sunar. Amaç, onları benimsemeyi bir kaza değil bilinçli bir karar haline getirmek ve değişikliklerin en pahalı olduğu cihaz firmware'inin dışında tutmaktır.
Taşınabilir MQTT Sistemleri için Yedi Kural
- Topic ad alanınızın sahibi olun. ISA-95 tarzı
enterprise/site/area/line/cell/devicegibi işinizi tanımlayan bir hiyerarşi tasarlayın. Cihaz topic'lerinde tedarikçi öneklerinden kaçının. - Standart istemci kütüphaneleri kullanın. Paho, MQTT.js, PubSubClient, AsyncMqttClient ya da ESP-MQTT her broker ile çalışır.
- Bağlantı ayarlarını yapılandırmada tutun. Host, port, TLS ayarları, kimlik bilgileri ve client ID; kodun içine dağılmış sabitlerden değil, bir yapılandırma dosyasından, NVS depolamadan ya da provisioning'den gelmelidir.
- Standart kimlik doğrulama kullanın. TLS üzerinden kullanıcı adı ve parola ya da istemci sertifikaları her ciddi broker tarafından anlaşılır.
- Durumu retained message'larla temsil edin. Retained topic'lerdeki raporlanan ve istenen durum her yerde aynı şekilde davranır.
- Entegrasyon mantığını broker'ın dışına koyun. Bir Node-RED akışı, Telegraf ajanı ya da küçük bir abone servisi broker'a normal bir istemci olarak bağlanır ve sizi herhangi bir sağlayıcıya kadar takip edebilir.
- Payload sözleşmelerinizi belgeleyin. JSON şemaları da Sparkplug B de açıktır; belgelenmemiş ikili biçimler ise kendi elinizle yarattığınız bir bağımlılıktır.
Örnek: Yapılandırma Odaklı Bağlantılar
En basit bağımlılık karşıtı teknik, broker ayrıntılarını tek bir yapılandırma dosyasında tutmaktır. İşte bir YAML dosyası ve paho-mqtt 2.x kullanan bir Python yükleyicisi:
# broker.yaml - sağlayıcı değiştirmek için kodunuzu değil, bu dosyayı değiştirin
host: broker.connectmq.com
port: 8883
tls: true
username: YOUR_USERNAME
password: YOUR_PASSWORD
client_id: YOUR_CLIENT_ID
topic_root: acme/plant1/packaging/line2
# pip install paho-mqtt pyyaml
import json
import ssl
import time
import yaml
import paho.mqtt.client as mqtt
with open("broker.yaml", encoding="utf-8") as f:
cfg = yaml.safe_load(f)
root = cfg["topic_root"]
def on_connect(client, userdata, flags, reason_code, properties):
print("Connected:", reason_code)
client.subscribe(f"{root}/+/cmd", qos=1)
def on_message(client, userdata, msg):
print("Command:", msg.topic, msg.payload.decode())
client = mqtt.Client(
mqtt.CallbackAPIVersion.VERSION2,
client_id=cfg["client_id"],
protocol=mqtt.MQTTv5,
)
if cfg.get("username"):
client.username_pw_set(cfg["username"], cfg.get("password"))
if cfg.get("tls"):
client.tls_set(cert_reqs=ssl.CERT_REQUIRED)
client.on_connect = on_connect
client.on_message = on_message
client.connect(cfg["host"], cfg["port"], keepalive=60)
client.loop_start()
try:
while True:
reading = {"speed": 118.5, "ts": int(time.time())}
client.publish(f"{root}/filler1/telemetry", json.dumps(reading), qos=1)
client.publish(f"{root}/filler1/state/reported",
json.dumps({"mode": "running"}), qos=1, retain=True)
time.sleep(10)
except KeyboardInterrupt:
client.loop_stop()
client.disconnect()
Uygulama mantığındaki hiçbir şey hangi sağlayıcıyla konuştuğunu bilmez. Broker değiştirmek, beş satırlık YAML'ı düzenlemek demektir.
Cihazın Ötesindeki Bağımlılık
Firmware, bağımlı kalınacak en pahalı yerdir; çünkü onu değiştirmek sahadaki her cihaza dokunmak anlamına gelir. Ancak tek yer değildir.
Arka uç tüketicileri genellikle bir sağlayıcının teslim mekanizmasına bağımlıdır; örneğin yalnızca tek bir platformda var olan özel bir olay akışına. Historian'ınız, dashboard'larınız ve alarm sisteminiz bunun yerine broker'a MQTT üzerinden abone olursa sizinle birlikte taşınırlar.
Operasyonel bilgi daha sessiz bir bağımlılık biçimidir. Runbook'lar, alarm eşikleri ve hata ayıklama alışkanlıkları tek bir konsol etrafında büyür. Bağlantı sayıları, mesaj hızları ve belirli topic'ler gibi hangi sinyalleri izlediğinizi yazıya dökmek, bunları başka bir yerde yeniden oluşturmayı kolaylaştırır.
Ticari koşullar da önemlidir. Uzun taahhütler, veri çıkış (egress) maliyetleri ve plan yapıları, teknoloji taşınabilir olsa bile taşınmayı pahalı hale getirebilir. Bunları teknik tasarımla aynı özenle gözden geçirin.
ConnectMQ gibi yönetilen bir broker altyapıyı sizin için yönetirken cihazlar, tüketiciler ve dashboard'lar düz MQTT konuşur. Bu kombinasyon size, hizmetten ayrılmayı zorlaştırmadan bir hizmetin kolaylığını sunar.
İhtiyaç Duymadan Önce Bir Taşınabilirlik Testi Yapın
Taşınabilirliğin en iyi kanıtı, altyapınızı gerçekten ikinci bir broker'a karşı çalıştırmaktır. Ücretsiz bir private broker ya da public MQTT test broker yeterlidir:
# Bir aboneyi ikinci broker'a yönlendirin ve test paketinizi yeniden çalıştırın
mosquitto_sub -h broker.connectmq.com -p 1883 -i porttest-5d1e \
-t "connectmq/demo/5d1e/#" -v
broker.yaml dosyasının bir kopyasında topic_root değerini connectmq/demo/5d1e olarak ayarlayın, public broker için TLS ve kimlik bilgilerini devre dışı bırakın ve aynı programı çalıştırın. Değiştirmeden çalışıyorsa cihaz kodunuz taşınabilirdir. Bozuluyorsa hatalar tam olarak kaldırmanız gereken bağımlılığı işaret eder.
Biz Dahil Her Sağlayıcı Hakkında Dürüst Olmak
Hiçbir yönetilen hizmet mükemmel biçimde tarafsız değildir. ConnectMQ standartlara dayalı bir MQTT 3.1.1/5.0 broker'dır ve cihazlarınız sıradan istemciler ile kullanıcı adı/parola kimlik doğrulamasıyla bağlanır. Sparkplug B'nin connectmq/ öneki altındaki topic'lere yeniden yayınlanması, eşik alarmları ya da ISA-95 cihaz görünümü gibi bazı portal kolaylıkları bu hizmete özgüdür. Bunları operasyonlar ve dashboard'lar için özgürce kullanın, ancak cihaz firmware'inin kendi topic ağacınıza yayın yapmasını sürdürün; böylece onu başka bir yere taşıyabilirsiniz. Aynı tavsiye diğer her sağlayıcının ekstraları için de geçerlidir.
Bir Çıkış Planı Kontrol Listesi
Bunu bir kez yazın ve her yıl gözden geçirin:
- Her cihaz tipi için broker host'u, portu ve kimlik bilgileri nerede saklanıyor?
- Cihazlar yeni bağlantı ayarlarını uzaktan alabiliyor mu?
- Hangi özelliklerin başka bir yerde yeniden inşa edilmesi gerekir (kurallar, alarmlar, dashboard'lar)?
- Hangi topic'ler ya da payload biçimleri sağlayıcıya özgü?
- Taşıma sırasında eski ve yeni broker'ları, örneğin bir bridge ile, paralel olarak nasıl çalıştırırsınız?
Kendi sunucunuzda vs yönetilen MQTT broker karşılaştırması ve IoT platformu vs MQTT broker makalesi, gerçekte hangi katmanı dış kaynağa vermek istediğinize karar vermenize yardımcı olur.
Standartlara Dayalı Bir Broker Üzerine İnşa Edin
Taşınabilirlik sizin için önemliyse firmware'inizin yoluna çıkmayan bir broker ile başlayın. Kredi kartı gerektirmeden ücretsiz bir Serverless broker oluşturun, yukarıdaki YAML odaklı istemciyi çalıştırın ve topic tasarımınızın tam kontrolünü elinizde tutun. Genel tablo için bulut MQTT broker rehberini okuyun, bir MQTT broker'ın ne yaptığını öğrenin ya da ConnectMQ'yu ziyaret edin.
Sık Sorulan Sorular
MQTT gibi açık bir protokolle tedarikçi bağımlılığı oluşabilir mi?
Evet. Protokol taşınabilirdir, ancak ayrılmış topic'ler, özel kimlik doğrulama, tedarikçi SDK'ları ve broker içi mantık cihazları tek bir sağlayıcıya bağlayabilir.
Bir platformun rules engine'ini kullanmak her zaman bağımlılık mıdır?
Bir bağımlılık yaratır, ancak bu kabul edilebilir bir ödünleşim olabilir. Böyle bir mantığı cihaz firmware'inin dışında tutun; böylece ileride taşınmak yalnızca arka ucu etkiler.
Cihazlarımın taşınabilir olup olmadığını kontrol etmenin en hızlı yolu nedir?
Bir test cihazını yalnızca yapılandırmasını değiştirerek standartlara dayalı ikinci bir broker'a yönlendirin. Bozulan her şey bir bağımlılığı ortaya çıkarır.
Sparkplug B tedarikçi bağımlılığına yol açar mı?
Hayır. Sparkplug B, birçok araç ve broker tarafından desteklenen açık bir Eclipse spesifikasyonudur; bu nedenle endüstriyel payload'lar için taşınabilir bir seçimdir.



