MQTT Protokolü ile IoT Mesajlaşma Altyapısı Kurulumu
MQTT Protokolüne Giriş
Nesnelerin İnterneti (IoT) dünyasında cihazlar arasında verimli, güvenilir ve hafif bir iletişim kurmak kritik öneme sahiptir. MQTT (Message Queuing Telemetry Transport), bu ihtiyaca yanıt veren, yayınla/abone ol (publish/subscribe) modelini kullanan bir mesajlaşma protokolüdür. 1999 yılında Andy Stanford-Clark (IBM) ve Arlen Nipper tarafından geliştirilen MQTT, düşük bant genişliği, yüksek gecikme süresi veya güvenilmez ağ koşullarında bile etkin çalışacak şekilde tasarlanmıştır.
MQTT'nin IoT projelerinde bu kadar yaygın kullanılmasının başlıca nedenleri şunlardır:
- Düşük bant genişliği tüketimi: Protokol başlığı yalnızca 2 byte kadar küçük olabilir, bu da onu kısıtlı kaynaklara sahip cihazlar için ideal kılar.
- Yayınla/Abone ol mimarisi: Cihazlar birbirini doğrudan tanımak zorunda kalmaz; merkezi bir broker üzerinden iletişim kurar.
- QoS (Quality of Service) seviyeleri: Mesaj teslimatı için üç farklı güvenilirlik seviyesi sunar.
- Kalıcı oturumlar ve son irade mesajları: Bağlantı kopması durumlarında bile veri bütünlüğünü korumaya yardımcı olur.
- TLS/SSL desteği: Güvenli iletişim için şifreleme altyapısı sağlar.
MQTT Mimarisi ve Temel Kavramlar
Broker (Aracı Sunucu)
MQTT mimarisinin merkezinde broker bulunur. Broker, tüm mesajları alan, filtreleyen ve ilgili abonelere dağıtan sunucudur. İstemciler hiçbir zaman birbirleriyle doğrudan iletişim kurmaz; tüm trafik broker üzerinden akar. Bu yapı, sisteme ölçeklenebilirlik ve esneklik kazandırır.
Topic (Konu)
Mesajlar, hiyerarşik bir yapıya sahip topic'ler üzerinden yönlendirilir. Topic'ler eğik çizgi (/) ile ayrılan seviyelerden oluşur. Örneğin:
ev/salon/sicaklikfabrika/hat1/motor/devirarac/plaka123/konum
Abone olurken joker karakterler kullanılabilir: + tek bir seviyeyi, # ise o seviyeden itibaren tüm alt seviyeleri kapsar. Örneğin ev/+/sicaklik ifadesi evin tüm odalarındaki sıcaklık verilerini yakalar.
QoS Seviyeleri
- QoS 0 (At most once): Mesaj en fazla bir kez gönderilir, teslimat garantisi yoktur. En hızlı seviyedir.
- QoS 1 (At least once): Mesaj en az bir kez teslim edilir, ancak mükerrer mesajlar olabilir.
- QoS 2 (Exactly once): Mesaj tam olarak bir kez teslim edilir. En güvenilir ancak en yavaş seviyedir.
Mosquitto Broker Kurulumu
Eclipse Mosquitto, en yaygın kullanılan açık kaynaklı MQTT broker'ıdır. Hafif yapısı ve geniş topluluk desteği ile hem geliştirme hem de üretim ortamları için uygundur.
Ubuntu/Debian Üzerinde Kurulum
sudo apt update
sudo apt install -y mosquitto mosquitto-clients
sudo systemctl enable mosquitto
sudo systemctl start mosquitto
sudo systemctl status mosquitto
Temel Yapılandırma
Mosquitto yapılandırma dosyası /etc/mosquitto/mosquitto.conf yolunda bulunur. Güvenli bir üretim ortamı için aşağıdaki yapılandırmayı öneriyorum:
# /etc/mosquitto/conf.d/custom.conf
# Dinlenecek port
listener 1883
# Anonim erişimi kapat
allow_anonymous false
# Parola dosyası
password_file /etc/mosquitto/passwd
# Kalıcılık ayarları
persistence true
persistence_location /var/lib/mosquitto/
# Log ayarları
log_dest file /var/log/mosquitto/mosquitto.log
log_type all
Kullanıcı Oluşturma
# Yeni kullanıcı ekle (parola sorulacaktır)
sudo mosquitto_passwd -c /etc/mosquitto/passwd iot_cihaz1
# Ek kullanıcı eklemek için -c yerine -b kullanın
sudo mosquitto_passwd -b /etc/mosquitto/passwd iot_cihaz2 gucluParola123
# Servisi yeniden başlat
sudo systemctl restart mosquitto
TLS/SSL ile Güvenli İletişim
IoT cihazları genellikle hassas veriler taşıdığından, iletişimin şifrelenmesi büyük önem taşır. Mosquitto broker için TLS yapılandırması şu şekilde gerçekleştirilir:
# Sertifika otoritesi (CA) anahtarı ve sertifikası oluşturma
openssl genrsa -out ca.key 2048
openssl req -new -x509 -days 3650 -key ca.key -out ca.crt \
-subj "/CN=MQTT CA"
# Sunucu anahtarı ve sertifikası oluşturma
openssl genrsa -out server.key 2048
openssl req -new -key server.key -out server.csr \
-subj "/CN=mqtt.sirketim.com"
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key \
-CAcreateserial -out server.crt -days 3650
Ardından Mosquitto yapılandırmasına TLS ayarlarını ekleyin:
# /etc/mosquitto/conf.d/tls.conf
listener 8883
cafile /etc/mosquitto/certs/ca.crt
certfile /etc/mosquitto/certs/server.crt
keyfile /etc/mosquitto/certs/server.key
tls_version tlsv1.2
Python ile MQTT İstemci Uygulaması
Python'un paho-mqtt kütüphanesi, MQTT istemcisi geliştirmek için en popüler seçenektir. Öncelikle kütüphaneyi kuralım:
pip install paho-mqtt
Sensör Verisi Yayınlayan (Publisher) Uygulama
import paho.mqtt.client as mqtt
import json
import time
import random
BROKER_HOST = "mqtt.sirketim.com"
BROKER_PORT = 8883
KULLANICI = "iot_cihaz1"
PAROLA = "gucluParola123"
CIHAZ_ID = "sicaklik_sensoru_01"
def baglanti_callback(client, userdata, flags, rc, properties=None):
if rc == 0:
print("Broker'a başarıyla bağlanıldı.")
else:
print(f"Bağlantı hatası. Kod: {rc}")
# İstemci oluştur
client = mqtt.Client(
client_id=CIHAZ_ID,
callback_api_version=mqtt.CallbackAPIVersion.VERSION2
)
client.username_pw_set(KULLANICI, PAROLA)
client.tls_set(ca_certs="ca.crt")
# Callback ata
client.on_connect = baglanti_callback
# Son irade mesajı (Last Will and Testament)
client.will_set(
topic=f"cihaz/{CIHAZ_ID}/durum",
payload=json.dumps({"durum": "cevrimdisi"}),
qos=1,
retain=True
)
# Bağlan
client.connect(BROKER_HOST, BROKER_PORT, keepalive=60)
client.loop_start()
try:
while True:
sicaklik = round(random.uniform(18.0, 32.0), 2)
nem = round(random.uniform(30.0, 80.0), 2)
veri = {
"cihaz_id": CIHAZ_ID,
"sicaklik": sicaklik,
"nem": nem,
"zaman_damgasi": time.time()
}
topic = f"ev/salon/sicaklik"
client.publish(topic, json.dumps(veri), qos=1)
print(f"Yayınlandı: {veri}")
time.sleep(5)
except KeyboardInterrupt:
print("Uygulama durduruluyor...")
client.loop_stop()
client.disconnect()
Veri Dinleyen (Subscriber) Uygulama
import paho.mqtt.client as mqtt
import json
BROKER_HOST = "mqtt.sirketim.com"
BROKER_PORT = 8883
def baglanti_callback(client, userdata, flags, rc, properties=None):
if rc == 0:
print("Broker'a bağlanıldı. Topic'lere abone olunuyor...")
client.subscribe("ev/#", qos=1)
client.subscribe("cihaz/+/durum", qos=1)
else:
print(f"Bağlantı hatası. Kod: {rc}")
def mesaj_callback(client, userdata, msg):
try:
veri = json.loads(msg.payload.decode())
print(f"\n[{msg.topic}] QoS: {msg.qos}")
print(f" Veri: {json.dumps(veri, indent=2, ensure_ascii=False)}")
# Sıcaklık eşik kontrolü
if "sicaklik" in veri and veri["sicaklik"] > 30.0:
print(" ⚠ UYARI: Sıcaklık eşik değerini aştı!")
except json.JSONDecodeError:
print(f"[{msg.topic}] Ham veri: {msg.payload.decode()}")
client = mqtt.Client(
client_id="izleyici_01",
callback_api_version=mqtt.CallbackAPIVersion.VERSION2
)
client.username_pw_set("iot_cihaz2", "gucluParola123")
client.tls_set(ca_certs="ca.crt")
client.on_connect = baglanti_callback
client.on_message = mesaj_callback
client.connect(BROKER_HOST, BROKER_PORT, keepalive=60)
client.loop_forever()
Docker ile MQTT Altyapısı
Üretim ortamında tekrarlanabilir dağıtımlar için Docker kullanmak büyük kolaylık sağlar. Aşağıdaki docker-compose.yml dosyası ile Mosquitto broker'ını kolayca ayağa kaldırabilirsiniz:
version: "3.8"
services:
mosquitto:
image: eclipse-mosquitto:2
container_name: mqtt_broker
ports:
- "1883:1883"
- "8883:8883"
- "9001:9001"
volumes:
- ./mosquitto/config:/mosquitto/config
- ./mosquitto/data:/mosquitto/data
- ./mosquitto/log:/mosquitto/log
- ./mosquitto/certs:/mosquitto/certs
restart: unless-stopped
# Konteyneri başlat
docker compose up -d
# Logları izle
docker compose logs -f mosquitto
Komut Satırından Test
Mosquitto istemci araçları ile broker'ınızı hızlıca test edebilirsiniz:
# Terminal 1 - Abone ol
mosquitto_sub -h localhost -p 1883 \
-u iot_cihaz2 -P gucluParola123 \
-t "ev/#" -v
# Terminal 2 - Mesaj yayınla
mosquitto_pub -h localhost -p 1883 \
-u iot_cihaz1 -P gucluParola123 \
-t "ev/salon/sicaklik" \
-m '{"sicaklik": 24.5, "nem": 55.2}'
MQTT Bridge ile Çoklu Broker Yapısı
Coğrafi olarak dağınık IoT dağıtımlarında, birden fazla broker'ı köprü (bridge) yapılandırmasıyla birbirine bağlayabilirsiniz. Bu yaklaşım, yerel ağdaki gecikmeyi azaltırken merkezi veri toplama imkânı da sunar:
# /etc/mosquitto/conf.d/bridge.conf
connection merkez_kopru
address merkez-broker.sirketim.com:8883
topic ev/# out 1
topic komut/# in 1
bridge_cafile /etc/mosquitto/certs/ca.crt
remote_username kopru_kullanici
remote_password kopruParola456
notifications true
notification_topic kopru/durum
İzleme ve Sistem Metrikleri
Mosquitto, $SYS topic hiyerarşisi üzerinden broker istatistiklerini yayınlar. Bu veriler izleme ve uyarı sistemlerinize entegre edilebilir:
# Tüm sistem metriklerini izle
mosquitto_sub -h localhost -p 1883 \
-u admin -P adminParola \
-t '$SYS/#' -v
Önemli metriklerden bazıları şunlardır:
$SYS/broker/clients/connected— Bağlı istemci sayısı$SYS/broker/messages/received— Alınan toplam mesaj sayısı$SYS/broker/messages/sent— Gönderilen toplam mesaj sayısı$SYS/broker/load/bytes/received— Alınan toplam bayt miktarı$SYS/broker/uptime— Broker'ın çalışma süresi
ACL ile Erişim Kontrolü
Üretim ortamında her cihazın yalnızca yetkili olduğu topic'lere erişmesi gerekir. Mosquitto'nun ACL (Access Control List) dosyası ile bunu sağlayabilirsiniz:
# /etc/mosquitto/acl
# iot_cihaz1 yalnızca kendi verilerini yayınlayabilir
user iot_cihaz1
topic write ev/salon/sicaklik
topic write cihaz/sicaklik_sensoru_01/durum
topic read komut/sicaklik_sensoru_01/#
# izleyici tüm ev verilerini okuyabilir ama yazamaz
user iot_cihaz2
topic read ev/#
topic read cihaz/+/durum
# admin her şeye erişebilir
user admin
topic readwrite #
Bu dosyayı yapılandırmaya ekleyin:
# /etc/mosquitto/conf.d/custom.conf dosyasına ekleyin
acl_file /etc/mosquitto/acl
Üretim Ortamı İçin En İyi Uygulamalar
- Anonim erişimi her zaman kapatın. Varsayılan yapılandırmalarda anonim erişim açık olabilir; bunu mutlaka devre dışı bırakın.
- TLS kullanımını zorunlu kılın. Şifresiz 1883 portunu yalnızca geliştirme ortamında açık bırakın; üretimde yalnızca 8883 portunu kullanın.
- Retain mesajlarını bilinçli kullanın. Retain mesajları broker'da kalıcı olarak saklanır; gereksiz kullanımı bellek tüketimini artırır.
- Keepalive süresini optimize edin. Mobil ağlarda veya pil ile çalışan cihazlarda keepalive süresini uzatarak gereksiz trafik oluşmasını önleyin.
- QoS seviyesini ihtiyaca göre seçin. Her mesaj için QoS 2 kullanmak gereksiz yük oluşturur; sıcaklık verileri gibi periyodik okumalarda QoS 0 yeterlidir.
- Son irade (LWT) mesajlarını kullanın. Cihaz bağlantısı koptuğunda sistemin durumdan haberdar olması için Last Will and Testament yapılandırmasını mutlaka ekleyin.
- Topic hiyerarşisini baştan planlayın. İyi tasarlanmış bir topic ağacı, ileride filtreleme ve yetkilendirme işlemlerini büyük ölçüde kolaylaştırır.
- Broker'ı izleme sistemine bağlayın. Prometheus ve Grafana gibi araçlarla broker metriklerini izlemek, sorunları erken tespit etmenizi sağlar.
Sonuç
MQTT, IoT ekosisteminde cihazlar arası iletişim için fiili standart haline gelmiş güçlü bir protokoldür. Bu yazıda Mosquitto broker kurulumundan TLS yapılandırmasına, Python istemci geliştirmeden Docker dağıtımına ve erişim kontrolüne kadar üretim düzeyinde bir MQTT altyapısı oluşturmanın temel adımlarını ele aldık. Doğru yapılandırılmış bir MQTT altyapısı; düşük gecikme süresi, güvenilir mesaj teslimatı ve ölçeklenebilir bir mimari sunarak IoT projelerinizin sağlam bir temele oturmasını sağlayacaktır.