Bir MQTT projesini prototipten canlı ortama taşımak, büyük ölçüde bir demonun göz ardı edebileceği boşlukları kapatmakla ilgilidir: kim bağlanabilir, veriyi kim okuyabilir, topic'ler nasıl düzenlenir ve bir şey bozulduğunda bunu nasıl öğrenirsiniz. Bu rehber, tipik bir hobi projesini herkese açık test broker'ından, düzenli bir namespace'e ve temel izlemeye sahip, TLS korumalı özel bir broker'a, en az yeniden çalışmaya yol açacak sırayla taşır.
Başlangıç Noktası: Çalışan Bir Prototip
Çoğu MQTT projesi aynı şekilde başlar. Bir sensör veya bir ESP32, herkese açık bir MQTT test broker'ına JSON yayınlar, bir dizüstü bilgisayar mosquitto_sub ya da bir Node-RED akışı çalıştırır ve veri görünür. Tipik bir prototip şöyledir:
mosquitto_pub -h broker.connectmq.com -p 1883 -i proto-dev-x9f3 \
-t "connectmq/demo/x9f3/temp" -m '{"c":22.1}'
Bu, başlamak için gayet iyi bir yoldur. Ama beş nedenle canlı ortam değildir:
- Kimlik doğrulama yok. Herkes bağlanabilir; broker.connectmq.com'un herkese açık alanını herkes okuyabilir.
- Şifreleme yok. Port 1883 kimlik bilgilerini ve payload'ları düz metin olarak gönderir.
- Plansız topic'ler. Topic ağacı kendiliğinden büyümüştür ve birkaç cihazdan fazlasını kaldıramaz.
- Varlık bilgisi yok. Çevrimdışı bir cihazı sessiz bir cihazdan ayırt edemezsiniz.
- Görünürlük yok. Veri durduğunda bunu bir grafiğin düz göründüğünü fark ederek öğrenirsiniz.
Aşağıdaki adımlar bu boşlukları sırayla kapatır.
Adım 1: Özel Kimlik Bilgilerine Geçin
app.connectmq.com'da bir hesap oluşturun, bir plan seçin, bir broker oluşturun ve üretilen kullanıcı adını, parolayı ve client ID'yi kopyalayın. Ücretsiz Serverless planı 25 bağlantıya kadar bir pilot için yeterlidir; ücretli Serverless planı bunu 1.000'e çıkarır ve QoS 2, 1 MB mesajlar ve shared subscription ekler.
İki kural, geçişin geri kalanını zahmetsiz hale getirir:
- Cihaz veya servis başına bir kimlik bilgisi seti. Client ID'ler üretilen kimlik bilgilerine bağlıdır; bu yüzden bir seti iki cihaz arasında paylaşmak, cihazların birbirinin bağlantısını koparmasına yol açar.
- Kimlik bilgilerini kaynak kontrolünün dışında tutun. Bunları ortam değişkenlerinden, git'ten hariç tutulan bir secrets dosyasından ya da fabrikadaki bir provisioning adımından yükleyin.
# .env (bu dosyayı asla commit etmeyin)
MQTT_HOST=broker.connectmq.com
MQTT_PORT=8883
MQTT_USERNAME=YOUR_USERNAME
MQTT_PASSWORD=YOUR_PASSWORD
MQTT_CLIENT_ID=YOUR_CLIENT_ID
Adım 2: TLS'i Her Yerde Açın
Canlı ortam trafiği cihazlar için 8883 portunda TLS, tarayıcılar için ise /mqtt yoluyla 8084 portunda Secure WebSocket kullanmalıdır. ConnectMQ bir Let's Encrypt sertifikası kullanır; bu yüzden çoğu işletim sistemi ve dil çalışma ortamı ona zaten güvenir. Mikrodenetleyicilerde genellikle ISRG Root X1 sertifikasını gömersiniz; ESP32 MQTT SSL rehberimiz ayrıntıları gösterir.
Aşağıda, prototip publisher'ın paho-mqtt 2.x ile Python'da canlı ortam için yeniden yazılmış hali var. Kimlik bilgilerini ortamdan okur, MQTT 5 ile TLS üzerinden bağlanır, broker'ın beklenmedik bağlantı kopmalarını duyurabilmesi için bir Last Will ayarlar ve retained bir online durumu yayınlar.
import json
import os
import time
import paho.mqtt.client as mqtt
from paho.mqtt.properties import Properties
from paho.mqtt.packettypes import PacketTypes
HOST = os.environ["MQTT_HOST"]
PORT = int(os.environ.get("MQTT_PORT", "8883"))
CLIENT_ID = os.environ["MQTT_CLIENT_ID"]
BASE = "acme/site1/greenhouse/zone2/sensor-01" # canlı ortam namespace'i
def on_connect(client, userdata, flags, reason_code, properties):
if reason_code.is_failure:
print("connect failed:", reason_code)
return
print("connected")
client.publish(f"{BASE}/status", "online", qos=1, retain=True)
def on_disconnect(client, userdata, flags, reason_code, properties):
print("disconnected:", reason_code)
client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2,
client_id=CLIENT_ID, protocol=mqtt.MQTTv5)
client.username_pw_set(os.environ["MQTT_USERNAME"], os.environ["MQTT_PASSWORD"])
client.tls_set()
client.will_set(f"{BASE}/status", "offline", qos=1, retain=True)
client.reconnect_delay_set(min_delay=1, max_delay=60)
client.on_connect = on_connect
client.on_disconnect = on_disconnect
connect_props = Properties(PacketTypes.CONNECT)
connect_props.SessionExpiryInterval = 3600 # çevrimdışıyken oturumu bir saat tut
client.connect(HOST, PORT, keepalive=60, properties=connect_props)
client.loop_start()
try:
while True:
reading = {"ts": int(time.time()), "temp_c": 22.1, "rh": 61}
client.publish(f"{BASE}/telemetry", json.dumps(reading), qos=1)
time.sleep(30)
except KeyboardInterrupt:
client.publish(f"{BASE}/status", "offline", qos=1, retain=True).wait_for_publish()
client.disconnect()
client.loop_stop()
Prototiple karşılaştırıldığında ne kadar az şeyin değiştiğine dikkat edin: hostname, port, kimlik bilgileri, TLS ve birkaç özellik. Uçtan uca standart MQTT kullanmanın amacı da budur.
Adım 3: Canlı Ortam İçin Bir Topic Namespace'i Tasarlayın
connectmq/demo/x9f3/temp gibi bir prototip topic'i tek bir sensör için işe yarar. Canlı ortam namespace'i ise hiçbir şeyi yeniden adlandırmadan yeni tesislere, yeni cihaz türlerine ve yeni tüketicilere dayanabilmelidir. İyi bir yapı genelden özele ilerler ve veriyi komutlardan ve durumdan ayırır.
| Seviye | Örnek | Amaç |
|---|---|---|
| Organizasyon veya kiracı | acme |
Müşterileri veya iş birimlerini izole eder |
| Tesis | site1 |
Fiziksel konum |
| Alan | greenhouse |
Bina, hat veya oda |
| Birim | zone2 |
Mantıksal cihaz grubu |
| Cihaz | sensor-01 |
Kalıcı cihaz tanımlayıcısı |
| Mesaj sınıfı | telemetry, status, cmd, cmd/ack |
Mesajın ne olduğu |
İleride sıkıntıdan kurtaran pratik kurallar:
- Seviyeleri küçük harfle, boşluksuz ve başta eğik çizgi olmadan yazın.
- Subscriber'ların wildcard ile filtreleyebilmesi için cihaz ID'sini yalnızca payload'a değil, topic'e de koyun.
- Cihazların dar kapsamlı abone olabilmesi için komutlarda ayrı bir
cmddalı kullanın. - Sonradan abone olanların güncel durumu hemen görmesi için durum topic'lerini retained yapın.
- Derinliği makul tutun; herkese açık broker 8 seviyeye izin verir ve bu her yerde mantıklı bir sınırdır.
Projeniz endüstriyelse, en baştan ISA-95 seviyeleriyle uyum sağlamayı düşünün. Topic'leriniz bu kalıbı izlediğinde ConnectMQ'nun cihazlar görünümü istemcileri ISA-95 seviyelerine göre gruplar. Konut projeleri için akıllı ev MQTT topic yapısı rehberimize bakabilirsiniz.
Adım 4: Cihaz Varlığını Takip Edin
Yukarıdaki kodda olduğu gibi Last Will ile birlikte retained online ve offline durum mesajları, her subscriber'a hangi cihazların bağlı olduğuna dair güvenilir bir görünüm sunar. Broker tarafı durumu $SYS/broker/connection/{clientId}/state üzerinden de izleyebilirsiniz; bu, belirli bir istemcinin bağlantısı koptuğunda bunu bilmesi gereken bir backend servisi için kullanışlıdır.
mosquitto_sub -h broker.connectmq.com -p 8883 --capath /etc/ssl/certs \
-u YOUR_USERNAME -P YOUR_PASSWORD -i YOUR_CLIENT_ID -V mqttv5 \
-t 'acme/site1/+/+/+/status' -v
Adım 5: İzleme ve Alarmlar Ekleyin
Canlı ortam, sorunları kullanıcılardan önce birinin öğrenmesi demektir. Basit başlayın:
- Her dağıtımdan sonra verinin aktığını doğrulamak için portal dashboard'unu ve canlı topic gezginini kullanın.
- Aralık dışına çıkan bir sıcaklık gibi önemli değerler için eşik değeri alarm kuralları oluşturun ve alarm günlüğünü gözden geçirin.
- Kota ve yetkilendirme sorunlarının teşhis edilebilmesi için her istemcide MQTT 5 reason code'larını loglayın.
- Uzun süreli depolama veya özel bildirimlere ihtiyacınız varsa, broker'a normal bir MQTT istemcisi olarak bağlanan ve veritabanınıza ya da mesajlaşma aracınıza yazan kendi subscriber'ınızı çalıştırın; örneğin bir Python servisi, Telegraf veya Node-RED.
Daha kapsamlı bir liste için MQTT broker izleme rehberimizi okuyun.
Canlı Ortama Hazırlık Kontrol Listesi
Yayına almadan önce her maddeyi doğrulayın:
- Her cihazın ve servisin kendi kimlik bilgileri ve client ID'si var.
- Tüm bağlantılar TLS (8883) veya Secure WebSocket (8084) kullanıyor.
- Firmware kaynak kontrolünde hiçbir kimlik bilgisi bulunmuyor.
- Topic namespace'i belgelenmiş ve bir organizasyon veya kiracı seviyesiyle başlıyor.
- Cihazlar Last Will ile retained durum yayınlıyor.
- Yeniden bağlanma mantığı jitter'lı exponential backoff kullanıyor.
- Payload'lar planın mesaj boyutu limitinin oldukça altında kalıyor.
- Komutlar en az QoS 1 kullanıyor ve iki kez alınmaları güvenli.
- Kimlik bilgilerini yenileyen firmware güncellemeleri için bir planınız var.
- Kritik değerler veya cihaz varlığı değiştiğinde alarmlar bir insana ulaşıyor.
Liste tamamlandığında, MQTT canlı ortam kontrol listesi ve MQTT güvenliği en iyi uygulamaları sıkılaştırma konusunda daha ileri gider.
Canlı Ortam İçin Doğru Planı Seçmek
Bağlantı sayınızı pay bırakarak karşılayan en küçük planla başlayın. 25'ten fazla bağlantıya, QoS 2'ye, daha büyük mesajlara ya da backend tüketicileri için shared subscription'a ihtiyaç duyduğunuzda ücretli Serverless'a geçin. İzole bir cluster istediğinizde Dedicated'ı, broker'ın kendi bulut hesabınızda çalışması gerektiğinde BYOC'yi, kendiniz çalıştırmanız gerektiğinde ise Self Managed Enterprise'ı seçin. Bulut MQTT broker rehberi bu barındırma modellerini daha ayrıntılı karşılaştırır.
Prototipinizi ConnectMQ ile Canlı Ortama Taşıyın
ConnectMQ, prototipinizin zaten konuştuğu standart MQTT üzerinde özel kimlik bilgileri, TLS, MQTT 5 ve canlı topic gezgini ile alarm kurallarına sahip bir portal sunar. app.connectmq.com adresinden kaydolun, kredi kartı gerekmeden ücretsiz Serverless planında bir broker oluşturun ve prototipinizi dakikalar içinde ona yönlendirin. Hiçbir altyapıyı kendiniz çalıştırmak istemiyorsanız, en kısa yol yönetilen bir MQTT broker'dır.
Sık Sorulan Sorular
Canlı ortamda herkese açık broker'ı kullanmaya devam edebilir miyim?
Hayır. broker.connectmq.com'un herkese açık alanını herkes okuyabilir ve istemci başına sıkı limitleri vardır; bu yüzden yalnızca test amaçlıdır. Canlı ortam verisi, kimlik bilgileri ve TLS ile korunan özel bir broker'da olmalıdır.
Canlı ortama geçmek için cihaz kodumu değiştirmem gerekir mi?
Genellikle yalnızca bağlantı ayarları değişir: hostname, port 8883, kimlik bilgileri ve TLS. Yeni bir namespace benimserseniz topic adları da değişir; bunu ölçeklenmeden önce yapmaya değer.
Çok sayıda cihazda kimlik bilgilerini nasıl yönetmeliyim?
Cihaz başına bir kimlik bilgisi seti üretin, bunu ortak bir firmware'e derlemek yerine provisioning sırasında yükleyin ve diğerlerine dokunmadan tek bir cihazı iptal edebilmek için kayıt tutun.
Küçük bir pilot hangi planı kullanmalı?
25'e kadar eşzamanlı bağlantıya sahip bir pilot ücretsiz Serverless planına sığar. Daha fazla bağlantıya, QoS 2'ye veya daha büyük mesajlara ihtiyaç duyduğunuzda ücretli Serverless'a geçin.



