Python kullanarak Nesnelerin İnterneti için MQTT protokolünde uzmanlaşın. Bu derinlemesine rehber, prensipleri, Paho-MQTT kütüphanesini, güvenliği ve gerçek dünya proje uygulamasını kapsar.
Python ile Nesnelerin İnterneti: MQTT Uygulaması İçin Kapsamlı Bir Rehber
Bağlantılı Dünya: Neden IoT Protokolleri Önemlidir
Eşi benzeri görülmemiş bir bağlantı çağında yaşıyoruz. Nesnelerin İnterneti (IoT) artık fütüristik bir konsept değil; milyarlarca akıllı cihazın çevremizi izlediği, evlerimizi otomatikleştirdiği, endüstrilerimizi optimize ettiği ve şehirlerimizi kolaylaştırdığı küresel bir gerçektir. Seul'deki bir akıllı termostattan Kenya kırsalındaki bir tarladaki tarım sensörüne kadar bu cihazlar muazzam miktarda veri üretiyor. Ancak tüm bu cihazlar, özellikle de genellikle küçük, düşük güçlü ve güvenilmez ağlarda çalışan cihazlar, birbirleriyle ve bulutla nasıl konuşuyor? Cevap özel iletişim protokollerinde yatıyor.
Günlük kullandığımız web'in çoğunu çalıştıran HTTP protokolü, IoT'nin kısıtlı dünyası için genellikle çok ağır ve güç tüketen bir protoldür. İşte tam bu noktada makineden makineye (M2M) iletişim için özel olarak tasarlanmış protokoller öne çıkıyor. Bunlardan biri baskın bir güç olarak ortaya çıkmıştır: MQTT.
Bu kapsamlı rehber, IoT alanındaki en çok yönlü ve popüler programlama dillerinden biri olan Python'u kullanarak MQTT'nin gücünden yararlanmak isteyen dünya çapındaki geliştiriciler, mühendisler ve hobi meraklıları için tasarlanmıştır. MQTT'nin temel kavramlarından güvenli, sağlam ve ölçeklenebilir IoT uygulamaları oluşturmaya kadar bir yolculuk yapacağız.
MQTT Nedir? Kısıtlamalar İçin Tasarlanmış Bir Protokol
MQTT, Message Queuing Telemetry Transport (Mesaj Kuyruklama Telemetri Taşıma) anlamına gelir. 1999 yılında IBM'den Dr. Andy Stanford-Clark ve Arcom'dan (şimdi Cirrus Link) Arlen Nipper tarafından güvenilmez uydu ağları üzerinden petrol boru hatlarını izlemek için icat edilmiştir. Köken hikayesi amacını mükemmel bir şekilde özetlemektedir: önemli kısıtlamalar altındaki cihazlar için hafif, güvenilir ve verimli bir mesajlaşma protokolü olmak.
Yayınla/Abone Ol (Pub/Sub) Modeli Açıklaması
MQTT'nin kalbinde zarif yayınla/abone ol mimari deseni yatar. Bu, birçok geliştiricinin aşina olduğu HTTP'nin istek/yanıt modelinden temel bir sapmadır. Bir istemcinin doğrudan bir sunucudan bilgi istemesi yerine, iletişim ayrılmıştır.
Küresel bir haber ajansını hayal edin. Gazeteciler (yayıncılar) haberlerini doğrudan her okuyucuya göndermezler. Bunun yerine, haberlerini ajansın merkezi hub'ına (broker) gönderir ve bunları "Dünya Siyaseti" veya "Teknoloji" gibi belirli konular altında kategorize ederler. Okuyucular (aboneler) gazetecilerden güncellemeleri istemek zorunda kalmazlar; sadece ajansa hangi konularla ilgilendiklerini söylerler. Ajans daha sonra bu konulardaki yeni haberleri otomatik olarak ilgili okuyuculara iletir. Gazeteciler ve okuyucular birbirlerinin varlığını, konumunu veya durumunu bilmek zorunda kalmazlar.
MQTT'de bu model, veri gönderen cihazı (yayıncı) alan cihazdan veya uygulamadan (abone) ayırır. Bu, IoT için inanılmaz derecede güçlüdür çünkü:
- Alan Ayrımı: Yayıncı ve abone birbirlerinin IP adresini veya konumunu bilmek zorunda değildir.
- Zaman Ayrımı: Aynı anda çalışmak zorunda değiller. Bir sensör bir okuma yayınlayabilir ve sistem bunu yapacak şekilde tasarlandıysa, bir uygulama bunu saatler sonra alabilir.
- Senkronizasyon Ayrımı: Bir mesaj alışverişini tamamlamasını beklemek için her iki taraftaki işlemler de durdurulmak zorunda değildir.
MQTT Ekosisteminin Temel Bileşenleri
MQTT mimarisi birkaç temel bileşen üzerine inşa edilmiştir:
- Broker: Merkezi hub veya sunucu. MQTT dünyasının postaneleridir. Broker, yayıncılardan gelen tüm mesajları almak, konuya göre filtrelemek ve bunları ilgili abonelere göndermekten sorumludur. Popüler brokerlar arasında Mosquitto ve VerneMQ gibi açık kaynaklı seçenekler ve AWS IoT Core, Azure IoT Hub ve Google Cloud IoT Core gibi yönetilen bulut hizmetleri bulunur.
- İstemci: Brokera bağlanan herhangi bir cihaz veya uygulama. Bir istemci yayıncı, abone veya her ikisi birden olabilir. Bir IoT sensörü bir istemcidir ve sensör verilerini işleyen bir sunucu uygulaması da bir istemcidir.
- Konu (Topic): Mesajlar için adres veya etiket görevi gören bir UTF-8 dizesi. Broker, mesajları yönlendirmek için konuları kullanır. Konular hiyerarşiktir ve ayırıcı olarak eğik çizgi kullanır, tıpkı bir dosya sistemi yolu gibi. Örneğin, Londra'daki bir binanın 1. katındaki bir oturma odasındaki bir sıcaklık sensörü için iyi bir konu şöyle olabilir:
UK/London/Building-A/Floor-1/LivingRoom/Temperature. - Yük (Payload): Bu, mesajın gerçek veri içeriğidir. MQTT veri açısından bağımsızdır, yani yük her şey olabilir: basit bir dize, bir tam sayı, JSON, XML veya hatta şifrelenmiş ikili veri. JSON, esnekliği ve okunabilirliği nedeniyle çok yaygın bir seçimdir.
Neden MQTT IoT İletişiminde Hakim Durumda?
MQTT'nin tasarım prensipleri, onu IoT'nin zorlukları için olağanüstü derecede uygun hale getirir:
- Hafif: MQTT mesajları çok küçük bir başlığa sahiptir (en az 2 bayt), bu da ağ bant genişliği kullanımını en aza indirir. Bu, maliyetli hücresel planlara veya LoRaWAN gibi düşük bant genişlikli ağlara sahip cihazlar için kritik öneme sahiptir.
- Verimli: Protokolün düşük ek yükü doğrudan daha düşük güç tüketimine yol açar ve pil gücüyle çalışan cihazların aylarca hatta yıllarca çalışmasını sağlar.
- Güvenilir: Dalgalı, yüksek gecikmeli ağlarda bile mesaj teslimini sağlamak için özellikler içerir. Bu, Hizmet Kalitesi (Quality of Service) seviyeleri aracılığıyla yönetilir.
- Ölçeklenebilir: Tek bir broker, aynı anda binlerce hatta milyonlarca istemciden gelen bağlantıları işleyebilir, bu da onu büyük ölçekli dağıtımlar için uygun hale getirir.
- Çift Yönlü: MQTT, cihazdan buluta (telemetri) ve buluttan cihaza (komutlar) iletişime izin verir, bu da cihazları uzaktan kontrol etmek için hayati bir gereksinimdir.
Hizmet Kalitesini (QoS) Anlamak
MQTT, geliştiricilerin belirli kullanım durumları için güvenilirlik ve ek yük arasındaki doğru dengeyi seçmelerini sağlamak üzere üç Hizmet Kalitesi (QoS) seviyesi sunar.
- QoS 0 (En Fazla Bir Kez): Bu bir "gönder ve unut" seviyesidir. Mesaj bir kez gönderilir, brokerdan veya son abonedan teslim alındığına dair bir onay olmadan. En hızlı yöntemdir ancak teslimat garantisi sunmaz. Kullanım Senaryosu: Kritik olmayan, yüksek frekanslı sensör verileri, örneğin her 10 saniyede bir gönderilen ortam oda sıcaklığı okuması. Bir okumanın kaybolması sorun değildir.
- QoS 1 (En Az Bir Kez): Bu seviye, mesajın en az bir kez teslim edileceğini garanti eder. Gönderici, alıcıdan bir onay (PUBACK paketi) alana kadar mesajı saklar. Herhangi bir onay alınmazsa, mesaj yeniden gönderilir. Bu, onay kaybolursa bazen yinelenen mesajlara neden olabilir. Kullanım Senaryosu: Bir akıllı ışığı açma komutu. Komutun alındığından emin olmanız gerekir ve iki kez alınması zarar vermez.
- QoS 2 (Tam Olarak Bir Kez): En güvenilir ancak aynı zamanda en yavaş seviyedir. Mesajın yinelenenler olmadan tam olarak bir kez teslim edilmesini sağlamak için dört bölümlü bir el sıkışma kullanır. Kullanım Senaryosu: Yinelenenlerin felaketle sonuçlanabileceği kritik işlemler, örneğin bir finansal işlem, belirli miktarda ilaç dağıtma komutu veya bir fabrikada robot kolunu kontrol etme.
Python MQTT Ortamınızı Kurma
Şimdi pratik olalım. Python ile MQTT uygulamaları oluşturmaya başlamak için iki şeye ihtiyacınız var: MQTT istemcisi için bir Python kütüphanesi ve iletişim kuracak bir MQTT brokerı.
Bir Python MQTT Kütüphanesi Seçimi: Paho-MQTT
Python için en yaygın kullanılan ve en olgun MQTT kütüphanesi, Eclipse Foundation'dan Paho-MQTT'dir. Broker'a bağlanmak ve konuları yayınlamak veya abone olmak için bir istemci sınıfı sağlayan sağlam, zengin özellikli bir kütüphanedir. Kurulumu, Python'un paket yöneticisi pip kullanılarak basittir.
Terminalinizi veya komut istemcinizi açın ve şunu çalıştırın:
pip install paho-mqtt
Bu tek komut, Python'da MQTT istemcileri yazmaya başlamak için ihtiyacınız olan her şeyi yükler.
Bir MQTT Brokerı Kurma
Broker için, yerel makinenizde bir tane çalıştırmaktan üretim için güçlü bir bulut hizmeti kullanmaya kadar çeşitli seçenekleriniz vardır.
- Yerel Broker (geliştirme ve öğrenme için): Yerel bir broker için en popüler seçenek, başka bir Eclipse projesi olan Mosquitto'dur. Hafif, açık kaynaklıdır ve kurulumu kolaydır.
- Debian tabanlı Linux'ta (Ubuntu, Raspberry Pi OS gibi):
sudo apt-get update && sudo apt-get install mosquitto mosquitto-clients - macOS'ta (Homebrew kullanarak):
brew install mosquitto - Windows'ta: Mosquitto web sitesinden yerel yükleyiciyi indirin.
127.0.0.1veyalocalhost) yönlendirerek kullanabilirsiniz. - Debian tabanlı Linux'ta (Ubuntu, Raspberry Pi OS gibi):
- Genel/Bulut Brokerı (hızlı testler için): Hiçbir şey yüklemeden ilk denemeler için ücretsiz, genel bir broker kullanabilirsiniz. Popüler olanlardan ikisi
test.mosquitto.orgvebroker.hivemq.com'dur. Önemli: Bunlar genel ve şifresizdir. Onlara herhangi bir hassas veya özel veri göndermeyin. Yalnızca öğrenme ve test amaçlıdırlar.
Pratik Uygulama: Python ile Yayınlama ve Abone Olma
İlk Python MQTT uygulamamızı yazalım. Mesaj gönderen bir yayıncı ve bunları alan bir abone oluşturan iki ayrı betik oluşturacağız. Bu örnek için yerel bir Mosquitto brokerı çalıştırdığınızı varsayacağız.
Basit Bir MQTT Yayıncısı Oluşturma (publisher.py)
Bu betik, brokera bağlanacak ve her iki saniyede bir `python/mqtt/test` konusuna "Merhaba, MQTT!" mesajını yayınlayacaktır.
`publisher.py` adında bir dosya oluşturun ve aşağıdaki kodu ekleyin:
import paho.mqtt.client as mqtt
import time
# --- Yapılandırma ---
BROKER_ADDRESS = "localhost" # Genel bir broker için 'test.mosquitto.org' kullanın
PORT = 1883
TOPIC = "python/mqtt/test"
# --- Bağlantı için geri çağrılacak fonksiyon ---
def on_connect(client, userdata, flags, rc):
if rc == 0:
print("MQTT Broker'a Bağlanıldı!")
else:
print(f"Bağlantı başarısız oldu, dönüş kodu {rc}")
# --- Ana betik ---
# 1. Bir istemci örneği oluştur
client = mqtt.Client("PublisherClient")
# 2. on_connect geri çağrısını ata
client.on_connect = on_connect
# 3. Broker'a bağlan
client.connect(BROKER_ADDRESS, PORT, 60)
# 4. Ağ döngüsü için arka plan iş parçacığı başlat
client.loop_start()
try:
count = 0
while True:
count += 1
message = f"Merhaba, MQTT! Mesaj #{count}"
# 5. Bir mesaj yayınla
result = client.publish(TOPIC, message)
# Yayınlamanın başarılı olup olmadığını kontrol et
status = result[0]
if status == 0:
print(f"`{message}` mesajı `{TOPIC}` konusuna gönderildi")
else:
print(f"Mesaj `{TOPIC}` konusuna gönderilemedi")
time.sleep(2)
except KeyboardInterrupt:
print("Yayın durduruldu.")
finally:
# 6. Ağ döngüsünü durdur ve bağlantıyı kes
client.loop_stop()
client.disconnect()
print("Broker'dan bağlantı kesildi.")
Basit Bir MQTT Abonesi Oluşturma (subscriber.py)
Bu betik, aynı brokera bağlanacak, `python/mqtt/test` konusuna abone olacak ve aldığı tüm mesajları yazdıracaktır.
Ayrıca `subscriber.py` adında başka bir dosya oluşturun:
import paho.mqtt.client as mqtt
# --- Yapılandırma ---
BROKER_ADDRESS = "localhost"
PORT = 1883
TOPIC = "python/mqtt/test"
# --- Geri çağrılacak fonksiyonlar ---
def on_connect(client, userdata, flags, rc):
if rc == 0:
print("MQTT Broker'a Bağlanıldı!")
# Başarılı bağlantı üzerine konuya abone ol
client.subscribe(TOPIC)
else:
print(f"Bağlantı başarısız oldu, dönüş kodu {rc}")
def on_message(client, userdata, msg):
# Mesaj yükünü baytlardan dizeye çöz
payload = msg.payload.decode()
print(f"Alınan mesaj: `{payload}` konu `{msg.topic}` üzerinde")
# --- Ana betik ---
# 1. Bir istemci örneği oluştur
client = mqtt.Client("SubscriberClient")
# 2. Geri çağrıları ata
client.on_connect = on_connect
client.on_message = on_message
# 3. Broker'a bağlan
client.connect(BROKER_ADDRESS, PORT, 60)
# 4. Ağ döngüsünü başlat (engelleme çağrısı)
# Bu fonksiyon otomatik olarak yeniden bağlanmayı ve mesajları işlemeyi yönetir.
print("Abone dinliyor...")
client.loop_forever()
Örneği Çalıştırma
- İki ayrı terminal penceresi açın.
- İlk terminalde, abone betiğini çalıştırın:
python subscriber.py - "Abone dinliyor..." mesajını görmelisiniz. Şu anda mesaj bekliyor.
- İkinci terminalde, yayıncı betiğini çalıştırın:
python publisher.py - Her iki saniyede bir mesaj gönderen yayıncıyı göreceksiniz. Aynı zamanda bu mesajlar abonenin terminal penceresinde görünecektir.
Tebrikler! Python kullanarak eksiksiz, çalışan bir MQTT iletişim sistemi oluşturdunuz.
Temellerin Ötesi: Gelişmiş Paho-MQTT Özellikleri
Gerçek dünya IoT sistemleri basit örneğimizden daha fazla sağlamlık gerektirir. Üretim düzeyinde uygulamalar oluşturmak için gerekli olan bazı gelişmiş MQTT özelliklerini inceleyelim.
Son İstek ve Vasiyet (LWT)
Güvenlik kamerası veya kalp monitörü gibi kritik bir cihaz, güç kesintisi veya ağ kaybı nedeniyle beklenmedik bir şekilde bağlantısı kesilirse ne olur? LWT özelliği MQTT'nin çözümüdür. Bir istemci bağlandığında, broker ile bir "son vasiyet" mesajı kaydedebilir. İstemci, bir DISCONNECT paketi göndermeden (kayıtsız bir şekilde) bağlantısı kesilirse, broker bu son vasiyet mesajını onun adına belirli bir konuya otomatik olarak yayınlayacaktır.
Bu, cihaz durumu izleme için paha biçilmezdir. Cihaz bağlandığında `devices/device-123/status` konusuna "online" yüküyle bir mesaj yayınlayabilir ve aynı konu üzerinde "offline" yüküyle bir LWT mesajı kaydedebilir. Bu konuya abone olan herhangi bir izleme hizmeti, cihazın durumunu anında bilecektir.
Paho-MQTT'de LWT uygulamak için, bağlanmadan önce ayarlarsınız:
client.will_set('devices/device-123/status', payload='offline', qos=1, retain=True)
client.connect(BROKER_ADDRESS, PORT, 60)
Saklanan Mesajlar (Retained Messages)
Normalde, bir abone bir konuya bağlandığında, yalnızca abone olduktan sonra yayınlanan mesajları alacaktır. Ancak en son değeri hemen bilmeniz gerekirse ne olur? Saklanan mesajlar bunun içindir. Bir mesaj `retain` bayrağı `True` olarak ayarlanarak yayınlandığında, broker bu mesajı o belirli konu için saklar. Yeni bir istemci o konuya her abone olduğunda, hemen son saklanan mesajı alacaktır.
Bu, durum bilgisi için mükemmeldir. Bir cihaz durumunu (örn. `{"state": "ON"}`) `retain=True` ile yayınlayabilir. Başlayan ve abone olan herhangi bir uygulama, bir sonraki güncellemeyi beklemeden cihazın mevcut durumunu hemen bilecektir.
Paho-MQTT'de, `retain` bayrağını yayın çağrınıza eklemeniz yeterlidir:
client.publish(TOPIC, payload, qos=1, retain=True)
Kalıcı Oturumlar ve Temiz Oturumlar (Persistent Sessions & Clean Sessions)
İstemcinin bağlantı isteğindeki `clean_session` bayrağı, brokerın istemcinin oturumunu nasıl ele aldığını kontrol eder.
- Temiz Oturum (
clean_session=True, varsayılan): İstemci bağlantısı kesildiğinde, broker ondan hakkındaki tüm bilgileri, abonelikleri ve kuyruğa alınmış QoS 1 veya 2 mesajlarını atar. Yeniden bağlandığında, yepyeni bir istemci gibidir. - Kalıcı Oturum (
clean_session=False): Benzersiz bir İstemci Kimliği ile bir istemci bu şekilde bağlandığında, broker bağlantısı kesildikten sonra oturumunu sürdürür. Aboneliklerini ve çevrimdışıyken yayınlanan tüm QoS 1 veya 2 mesajlarını içerir. İstemci yeniden bağlandığında, broker kaçırılan tüm mesajları gönderir. Bu, kritik komutları kaybetmeyi göze alamayan güvenilmez ağlardaki cihazlar için çok önemlidir.
Kalıcı bir oturum oluşturmak için sabit, benzersiz bir İstemci Kimliği sağlamalı ve istemci örneğini oluştururken `clean_session=False` olarak ayarlamalısınız:
client = mqtt.Client(client_id="my-persistent-device-001", clean_session=False)
Güvenlik Bir Seçenek Değil: MQTT'yi Python ile Güvenli Hale Getirme
Herhangi bir gerçek dünya uygulamasında güvenlik çok önemlidir. Güvenli olmayan bir MQTT brokerı, kötü niyetli aktörlerin verilerinizi dinlemesi, cihazlarınıza yanlış komutlar göndermesi veya hizmet reddi saldırıları başlatması için açık bir davettir. MQTT'yi güvenli hale getirmek üç temel direği içerir: Kimlik Doğrulama, Şifreleme ve Yetkilendirme.
Kimlik Doğrulama: Sen Kimsin?
Kimlik doğrulama, brokera bağlanan istemcinin kimliğini doğrular. En basit yöntem kullanıcı adı ve şifre kullanmaktır. Mosquitto brokerınızı kimlik bilgileri gerektirecek şekilde yapılandırabilir ve ardından bunları Python istemcinizde sağlayabilirsiniz.
Python istemcinizde `username_pw_set()` yöntemini kullanın:
client.username_pw_set(username="myuser", password="mypassword")
client.connect(BROKER_ADDRESS, PORT, 60)
Şifreleme: Aktarım Sırasındaki Verileri TLS/SSL ile Koruma
Kullanıcı adı ve şifre, ağ üzerinden düz metin olarak gönderilirlerse çok az işe yarar. Şifreleme, istemci ve broker arasındaki tüm iletişimin karıştırılmasını ve ağda dinleyen herkes tarafından okunaksız olmasını sağlar. Bu, web sitelerini (HTTPS) güvence altına alan aynı teknoloji olan Aktarım Katmanı Güvenliği (TLS) kullanılarak elde edilir.
MQTT (genellikle MQTTS olarak adlandırılır) ile TLS kullanmak için brokerınızı bunu destekleyecek şekilde yapılandırmanız (genellikle 8883 portunda) ve istemcinize gerekli sertifikaları sağlamanız gerekir. Bu genellikle brokerın kimliğini doğrulamak için bir Sertifika Yetkilisi (CA) sertifikası gerektirir.
Paho-MQTT'de `tls_set()` yöntemini kullanırsınız:
client.tls_set(ca_certs="path/to/ca.crt")
client.connect(BROKER_ADDRESS, 8883, 60)
Yetkilendirme: Ne Yapmana İzin Veriliyor?
Bir istemci kimliği doğrulandıktan sonra, yetkilendirme ne yapmaya izin verildiğini belirler. Örneğin, bir sıcaklık sensörünün yalnızca kendi konusuna (örn. `sensors/temp-A/data`) yayın yapmasına, ancak bir fabrikanın makinelerini kontrol etmek için kullanılan bir konuya (örn. `factory/floor-1/robot-arm/command`) yayın yapmasına izin verilmemelidir. Bu, genellikle broker üzerinde Erişim Kontrol Listeleri (ACL'ler) kullanılarak halledilir. Brokerı, hangi kullanıcıların belirli konu kalıplarına `okuma` (abone olma) veya `yazma` (yayınlama) yapabileceğini tanımlayan kurallarla yapılandırırsınız.
Hep Birlikte: Basit Bir Akıllı Ortam Monitörü Projesi
Bu kavramları pekiştirmek için biraz daha gerçekçi bir proje oluşturalım. Bir JSON nesnesi olarak çevresel verileri yayınlayan bir sensör cihazı ve bu veriye abone olan ve onu görüntüleyen bir izleme uygulaması simüle edeceğiz.
Proje Genel Bakışı
- Sensör (Yayıncı): Sıcaklık ve nem sensör okumalarını simüle eden bir Python betiği. Bu verileri her 5 saniyede bir
smart_env/device01/telemetrykonusuna bir JSON yükü olarak paketleyip yayınlayacaktır. - Monitör (Abone): `smart_env/device01/telemetry` konusuna abone olan, JSON verilerini alan, ayrıştıran ve kullanıcı dostu bir durum güncellemesi yazdıran bir Python betiği.
Sensör Kodu (sensor_publisher.py)
import paho.mqtt.client as mqtt
import time
import json
import random
BROKER_ADDRESS = "localhost"
PORT = 1883
TOPIC = "smart_env/device01/telemetry"
client = mqtt.Client("SensorDevice01")
client.connect(BROKER_ADDRESS, PORT, 60)
client.loop_start()
print("Sensör yayıncısı başladı...")
try:
while True:
# Sensör okumalarını simüle et
temperature = round(random.uniform(20.0, 30.0), 2)
humidity = round(random.uniform(40.0, 60.0), 2)
# Bir JSON yükü oluştur
payload = {
"timestamp": time.time(),
"temperature": temperature,
"humidity": humidity
}
payload_str = json.dumps(payload)
# QoS 1 ile mesajı yayınla
result = client.publish(TOPIC, payload_str, qos=1)
result.wait_for_publish() # Yayın onaylanana kadar engelle
print(f"Yayınlanan: {payload_str}")
time.sleep(5)
except KeyboardInterrupt:
print("Sensör yayıncısını durduruluyor...")
finally:
client.loop_stop()
client.disconnect()
İzleme Paneli Kodu (monitor_subscriber.py)
import paho.mqtt.client as mqtt
import json
import datetime
BROKER_ADDRESS = "localhost"
PORT = 1883
TOPIC = "smart_env/device01/telemetry"
def on_connect(client, userdata, flags, rc):
print(f"Sonuç kodu {rc} ile bağlandı")
client.subscribe(TOPIC)
def on_message(client, userdata, msg):
print("--- Yeni Mesaj Alındı ---")
try:
# Yük dizesini çöz ve JSON olarak ayrıştır
payload = json.loads(msg.payload.decode())
timestamp = datetime.datetime.fromtimestamp(payload.get('timestamp'))
temperature = payload.get('temperature')
humidity = payload.get('humidity')
print(f"Cihaz: {msg.topic}")
print(f"Zaman: {timestamp.strftime('%Y-%m-%d %H:%M:%S')}")
print(f"Sıcaklık: {temperature}°C")
print(f"Nem: {humidity}%")
except json.JSONDecodeError:
print("JSON yükünü çözme hatası.")
except Exception as e:
print(f"Bir hata oluştu: {e}")
client = mqtt.Client("MonitoringDashboard")
client.on_connect = on_connect
client.on_message = on_message
client.connect(BROKER_ADDRESS, PORT, 60)
print("İzleme paneli çalışıyor...")
client.loop_forever()
Prototipten Üretime: MQTT En İyi Uygulamaları
Projenizi basit bir betikten sağlam, ölçeklenebilir bir üretim sistemine taşımak dikkatli planlama gerektirir. İşte bazı temel en iyi uygulamalar:
- Net Bir Konu Hiyerarşisi Tasarlayın: Konu yapınızı en başından dikkatlice planlayın. İyi bir hiyerarşi açıklayıcı, ölçeklenebilir ve joker karakterler kullanarak esnek aboneliklere olanak tanır. Yaygın bir desen
<site>/<alan>/<cihaz_tipi>/<cihaz_kimliği>/<ölçüm>'dir. - Ağ Kesintilerini Zarifçe Ele Alın: Ağlar güvenilmezdir. İstemci kodunuz sağlam yeniden bağlantı mantığı uygulamalıdır. Paho-MQTT'deki `on_disconnect` geri çağrısı, yeniden bağlanma denemeleriyle ağı boğmaktan kaçınmak için üssel geri çekilme (exponential backoff) gibi bir strateji uygulayarak başlamak için mükemmel bir yerdir.
- Yapılandırılmış Veri Yükleri Kullanın: Mesaj yükleriniz için her zaman JSON veya Protocol Buffers gibi yapılandırılmış bir veri formatı kullanın. Bu, verilerinizi kendi kendini açıklayan, sürümlendirilebilir ve farklı uygulamalar (herhangi bir dilde yazılmış) tarafından kolayca ayrıştırılabilir hale getirir.
- Varsayılan Olarak Her Şeyi Güvenli Hale Getirin: Bir IoT sistemini güvenlik olmadan dağıtmayın. En azından kullanıcı adı/şifre kimlik doğrulaması ve TLS şifrelemesi kullanın. Daha yüksek güvenlik ihtiyaçları için, istemci sertifikası tabanlı kimlik doğrulamayı araştırın.
- Brokerınızı İzleyin: Üretim ortamında, MQTT brokerınız kritik bir altyapı parçasıdır. Sağlığını izlemek için izleme araçları kullanın; CPU/bellek kullanımı, bağlı istemci sayısı, mesaj hızları ve düşen mesajlar dahil. Birçok broker, bu durum bilgilerini sağlayan özel bir `$SYS` konu hiyerarşisi sunar.
Sonuç: Python ve MQTT ile Yolculuğunuz
Temel MQTT "neden"inden, Python ile uygulamanın pratik "nasıl"ına kadar seyahat ettik. Yayınla/abone ol modelinin gücünü, QoS'nin önemini ve güvenliğin kritik rolünü öğrendiniz. Paho-MQTT kütüphanesinin, sensör verilerini yayınlayabilen ve komutlara abone olabilen karmaşık istemciler oluşturmayı nasıl şaşırtıcı derecede basit hale getirdiğini gördünüz.
MQTT sadece bir protokol değil; Nesnelerin İnterneti için temel bir teknolojidir. Hafif yapısı ve sağlam özellikleri, onu dünya çapında milyonlarca cihaz için tercih edilen seçenek haline getirmiştir; akıllı şehirlerden bağlantılı tarıma ve endüstriyel otomasyona kadar.
Yolculuk burada bitmiyor. Bir sonraki adım, bu kavramları gerçek donanıma uygulamaktır. Bir Raspberry Pi, bir ESP32 veya diğer mikrodenetleyicilerle deney yapın. Fiziksel sensörleri bağlayın, bulut IoT platformlarıyla entegre olun ve fiziksel dünya ile etkileşim kuran uygulamalar oluşturun. Python ve MQTT ile, yeni nesil bağlantılı çözümleri oluşturmak için güçlü bir araç setine sahipsiniz.