MQTT Nedir?

MQTT (Message Queuing Telemetry Transport), Internet of Things (IoT) cihazlarının ve uygulamalarının birbirleriyle veri paylaşımı yapmasını sağlayan bir mesajlaşma protokolüdür. MQTT, hafif ve verimli olmasıyla bilinir ve düşük bant genişliği ve düşük güç tüketimi gerektiren IoT cihazlarıyla iletişim için idealdir.

MQTT, bir istemci/sunucu modeline dayanır. İstemci olarak adlandırılan IoT cihazları, MQTT sunucusuna (broker) bağlanır ve mesajlaşma için abonelikler yapabilir veya yayınlar yapabilirler. Bu sayede cihazlar, belirli bir konu (topic) altında veri yayınlayabilir veya o konuyu dinleyen diğer cihazlardan veri alabilir.

MQTT’nin temel kavramları şunlardır:

  1. Sunucu (Broker): Sunucu veya broker, MQTT istemcileri arasında iletişimi sağlayan merkezi bir sunucudur. İstemciler sunucuya bağlanır ve sunucu üzerinden mesajlaşma işlemlerini gerçekleştirir. Sunucu, gelen mesajları konulara (topic) göre yönlendirir ve ilgili istemcilere iletebilir. MQTT sunucusu, istemciler arasında yayın ve abonelik işlemlerini yönetir ve güvenli iletişim sağlamak için yetkilendirme ve şifreleme mekanizmalarını kullanabilir.
  2. Konu (Topic): Konu, mesajların paylaşıldığı adlandırılmış kanallardır. Konular, birer dize (string) şeklinde ifade edilir. Örneğin, “ev/salon/sıcaklık” veya “sensör1/veri” gibi konular oluşturulabilir. İstemciler, belirli bir konuyu dinleyebilir veya o konuya mesaj yayınlayabilir. Konu tabanlı mesajlaşma, esnek ve ölçeklenebilir bir iletişim yöntemidir. İstemciler, ilgili konulara abone olabilir ve bu konularda yayınlanan mesajları alabilir.
  3. Yayıncı (Publisher): Yayıncı, bir istemci tarafından belirli bir konuya mesaj gönderen taraftır. Yayıncı, bir konu belirler ve o konuya mesaj yayınlar. Örneğin, bir sıcaklık sensörü, “ev/salon/sıcaklık” konusuna anlık sıcaklık değerlerini yayınlayabilir. Yayıncılar, veri üreten veya gönderen istemcilerdir ve diğer istemcilerin bu verilere erişmesini sağlar.
  4. Abone (Subscriber): Abone, bir istemcinin belirli bir konuyu dinleyen taraftır. Aboneler, ilgilendikleri konulara abone olurlar ve bu konularda yayınlanan mesajları alırlar. Örneğin, bir akıllı ev uygulaması, “ev/salon/sıcaklık” konusuna abone olarak salonun sıcaklık verilerini alabilir. Aboneler, belirli bir konuda yayınlanan mesajları alarak işleme veya görselleştirmeye tabi tutabilir.

MQTT’nin avantajları şunlardır:

  • Hafif ve verimli: Düşük bant genişliği ve güç tüketimi gerektiren IoT cihazlarıyla uyumludur.
  • Esneklik: Farklı platformlarda ve cihazlarda kullanılabilir.
  • Güvenli: Şifreleme ve yetkilendirme mekanizmalarıyla güvenli iletişim sağlar.
  • Dayanıklılık: Bağlantı kopması durumunda mesajlar saklanabilir ve iletim sağlandığında teslim edilebilir.

MQTT, endüstriyel otomasyon, ev otomasyonu, sensör ağları ve telemetri gibi birçok alanda yaygın olarak kullanılan bir protokoldür.

Örnek Python Kodu:

#publihser.py
import paho.mqtt.client as mqtt

# Broker'a bağlanmak için gerekli işlev
def on_connect(client, userdata, flags, rc):
    print("Bağlantı başarılı! Bağlantı kodu: " + str(rc))

# Yayın yapıldığında çağrılan işlev
def on_publish(client, userdata, mid):
    print("Mesaj yayınlandı!")
    client.disconnect()  # Mesaj yayınlandıktan sonra bağlantıyı sonlandır

# MQTT istemci oluşturma ve bağlantı işlevlerini tanımlama
client = mqtt.Client()
client.on_connect = on_connect
client.on_publish = on_publish

# Broker adresi ve port
broker_address = "broker.hivemq.com"  # Broker adresini buraya yazın
port = 1883  # Broker portunu buraya yazın

# Broker'a bağlanma
client.connect(broker_address, port)

# Yayın gönderme işlemi
def publish_message():
    message = "Merhaba, MQTT!"
    topic = "ev/salon/sıcaklık"  # Yayınlanacak konuyu buraya yazın
    client.publish(topic, message)

# Yayın gönderme
publish_message()

# İstemciye bağlantıyı sağlama
client.loop_forever()

#subscriber.py
import paho.mqtt.client as mqtt

# Broker'a bağlanmak için gerekli işlev
def on_connect(client, userdata, flags, rc):
    print("Bağlantı başarılı! Bağlantı kodu: " + str(rc))
    # Abone olunan konulara yeniden bağlan
    client.subscribe("ev/salon/sıcaklık")  # Abone olunan konuyu buraya yazın

# Yeni mesaj geldiğinde çağrılan işlev
def on_message(client, userdata, msg):
    print("Yeni mesaj alındı!")
    print("Konu: " + msg.topic)
    print("Mesaj: " + str(msg.payload))
    client.disconnect()  # Mesaj alındıktan sonra bağlantıyı sonlandır

# MQTT istemci oluşturma ve bağlantı işlevlerini tanımlama
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message

# Broker adresi ve port
broker_address = "broker.hivemq.com"  # Broker adresini buraya yazın
port = 1883  # Broker portunu buraya yazın

# Broker'a bağlanma
client.connect(broker_address, port)

# Sürekli çalışacak bir döngü başlatma
client.loop_forever()

Konular Hakkında Daha Fazlası:

MQTT konuları, mesajların yayınlandığı veya abone olunduğu adlandırılmış kanallardır. Konular, yayıncılar (publishers) tarafından belirlenir ve aboneler (subscribers) tarafından dinlenir. Konular, ASCII karakter seti kullanılarak tanımlanır ve / işaretiyle hiyerarşik bir yapı oluşturulabilir.

MQTT konularında kullanılan bazı özel karakterler ve kullanım şekilleri şunlardır:

  1. Slash (/): Slash (/) karakteri, konuları hiyerarşik bir şekilde gruplamak için kullanılır. Örneğin, “ev/salon/sıcaklık” konusu, “ev” ana konusunun altında “salon” alt konusunda bulunan “sıcaklık” alt konusunu temsil eder. Bu şekilde konuları alt kategorilere ayırarak daha düzenli bir yapı oluşturabilirsiniz.
  2. Artı (+) ve Yüzde (%) İşaretleri: Artı (+) işareti, tek bir seviyedeki herhangi bir alt konuyu temsil eder. Örneğin, “ev/+/sıcaklık” konusu, “ev” ana konusunun altında herhangi bir alt konuda yayınlanan “sıcaklık” mesajlarını dinler. Yüzde (%) işareti ise bir veya daha fazla seviyedeki herhangi bir alt konuyu temsil eder. Örneğin, “ev/+/+/sıcaklık” konusu, “ev” ana konusunun altında iki alt konuyla ilişkilendirilmiş “sıcaklık” mesajlarını dinler.
  3. Hashtag (#): Hashtag (#) karakteri, tüm alt kategorileri temsil eder. Örneğin, “ev/#” konusu, “ev” ana konusunun altında herhangi bir alt kategoride yayınlanan tüm mesajları dinler.
  4. Tek Sayı ve Çoklu Sayı: MQTT konularında sayılar genellikle birer dize (string) olarak kullanılır. Örneğin, “ev/oda1/sıcaklık” veya “ev/oda2/sıcaklık” gibi konular kullanılabilir. Ancak, MQTT’de özel olarak sayıları belirtecek bir sembol veya karakter yoktur. Bu nedenle, sayıları dize (string) olarak kullanmak en yaygın ve uygun yaklaşımdır.

Örneğin, aşağıdaki örnekleri ele alalım:

  • Konu: “ev/salon/sıcaklık” Bu, “ev” ana konusunun altında “salon” alt konusunda yayınlanan “sıcaklık” mesajlarını temsil eder.
  • Konu: “ev/+/sıcaklık” Bu, “ev” ana konusunun altında herhangi bir alt konuda yayınlanan “sıcaklık” mesajlarını dinler.
  • Konu: “ev/#” Bu, “ev” ana konusunun altında herhangi bir alt kategoride yayınlanan tüm mesajları dinler.

MQTT konularını tanımlarken, düzgün bir hiyerarşik yapı oluşturmak ve konuları anlamlı bir şekilde adlandırmak önemlidir. Konular, uygulama ve kullanım senaryosuna bağlı olarak özelleştirilebilir ve düzenli bir şekilde planlanmalıdır.

Daha Fazla Detay:

  1. QoS (Quality of Service – Hizmet Kalitesi): MQTT, farklı hizmet kalitesi seviyelerini destekler. Bu seviyeler, mesajların yayınlanma ve teslimat garantisi ile ilgilidir. MQTT’de üç QoS seviyesi vardır:
    • QoS 0: En az bir kez yayınlanır, herhangi bir onay veya tekrar deneme yapmaz.
    • QoS 1: En az bir kez yayınlanır ve en az bir kez teslim edilir (garantili teslimat).
    • QoS 2: Tam olarak bir kez yayınlanır ve tam olarak bir kez teslim edilir (çift onaylı teslimat).
  2. Temiz Oturum (Clean Session): İstemci, MQTT sunucusuna bağlandığında temiz oturum (clean session) seçeneğini belirtebilir. Temiz oturum seçeneği kullanıldığında, sunucu istemcinin önceki yayınlarını veya aboneliklerini hatırlamaz. Bu, istemci her bağlandığında yeni bir oturum başlatır ve geçmiş verileri görmezden gelir.
  3. İşaretlenmiş Mesajler (Retained Messages): MQTT, işaretlenmiş mesajları destekler. Bir mesaj “işaretlenmiş” olarak yayınlandığında, son değeri saklanır ve yeni bir abone, konuya abone olduğunda hemen bu son değeri alır. İşaretlenmiş mesajlar, örneğin cihazların başlangıç değerlerini alması gibi senaryolarda kullanılabilir.
  4. Son İstenen Durum (Last Will and Testament): MQTT istemcisi, sunucuya bağlandığında son istenen durumunu (last will) belirtebilir. İstemci bağlantısı beklenmedik bir şekilde koparsa, sunucu son istenen durumu diğer abonelere yayınlar. Örneğin, bir cihazın çevrimdışı olduğunda durumunu belirten bir mesaj göndermesi gibi senaryolarda kullanılabilir.
  5. Kimlik Doğrulama ve Yetkilendirme: MQTT, istemci ve sunucu arasında kimlik doğrulama ve yetkilendirme mekanizmalarını destekler. Kullanıcı adı ve parola ile kimlik doğrulama, dijital sertifikalarla TLS/SSL tabanlı kimlik doğrulama gibi yöntemler kullanılabilir. Bu sayede güvenli ve güvenilir bir iletişim sağlanır.
  6. Ölü Nokta Algılama (Keep-Alive): MQTT istemcileri, sunucu ile iletişimlerini sürdürmek için belirli aralıklarla “ölü nokta” algılama mesajları gönderir. Bu, istemcinin bağlantısının aktif kalmasını ve kopmamasını sağlar. İstemciler ve sunucular arasında belirli bir zaman aşımı (timeout) süresi tanımlanır ve eğer belirli bir süre boyunca mesaj alışverişi olmazsa bağlantıyı koparır.

Bu konular, MQTT protokolünün daha detaylı ve geniş bir yelpazesini temsil eder. MQTT’nin özellikleri ve ayarları, kullanım senaryolarına ve ihtiyaçlara bağlı olarak farklı şekillerde uygulanabilir.

Örnek Python Kodu:

#publisher.py
import paho.mqtt.client as mqtt
import ssl

# Parametreler
broker_address = "broker.example.com"  # MQTT broker adresi
broker_port = 8883  # MQTT broker portu
topic = "ev/salon/sıcaklık"  # Yayınlanacak konu
message = "Merhaba, MQTT!"  # Yayınlanacak mesaj
retain = True  # İşaretlenmiş mesaj (retain) ayarı
qos = 2  # QoS seviyesi

# TLS/SSL ayarları
ssl_certfile = "/path/to/client_certificate.pem"  # İstemci sertifikası
ssl_keyfile = "/path/to/client_private_key.pem"  # İstemci özel anahtarı
ssl_cafile = "/path/to/ca_certificate.pem"  # Kök CA sertifikası

# Broker'a bağlanmak için gerekli işlev
def on_connect(client, userdata, flags, rc):
    print("Bağlantı başarılı! Bağlantı kodu: " + str(rc))
    publish_message()

# Yayın yapıldığında çağrılan işlev
def on_publish(client, userdata, mid):
    print("Mesaj yayınlandı!")
    client.disconnect()  # Mesaj yayınlandıktan sonra bağlantıyı sonlandır

# MQTT istemci oluşturma ve bağlantı işlevlerini tanımlama
client = mqtt.Client()
client.on_connect = on_connect
client.on_publish = on_publish

# TLS/SSL ayarlarını yapma
client.tls_set(certfile=ssl_certfile, keyfile=ssl_keyfile, ca_certs=ssl_cafile, cert_reqs=ssl.CERT_REQUIRED, tls_version=ssl.PROTOCOL_TLS)

# Broker'a bağlanma
client.connect(broker_address, broker_port)

# Yayın gönderme işlemi
def publish_message():
    client.publish(topic, message, qos=qos, retain=retain)

# İstemciye bağlantıyı sağlama
client.loop_forever()

#subscriber.py
import paho.mqtt.client as mqtt
import ssl

# Parametreler
broker_address = "broker.example.com"  # MQTT broker adresi
broker_port = 8883  # MQTT broker portu
topic = "ev/salon/sıcaklık"  # Abone olunan konu

# TLS/SSL ayarları
ssl_certfile = "/path/to/client_certificate.pem"  # İstemci sertifikası
ssl_keyfile = "/path/to/client_private_key.pem"  # İstemci özel anahtarı
ssl_cafile = "/path/to/ca_certificate.pem"  # Kök CA sertifikası

# Broker'a bağlanmak için gerekli işlev
def on_connect(client, userdata, flags, rc):
    print("Bağlantı başarılı! Bağlantı kodu: " + str(rc))
    subscribe_topic()

# Yeni mesaj geldiğinde çağrılan işlev
def on_message(client, userdata, msg):
    print("Yeni mesaj alındı!")
    print("Konu: " + msg.topic)
    print("Mesaj: " + str(msg.payload))

# MQTT istemci oluşturma ve bağlantı işlevlerini tanımlama
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message

# TLS/SSL ayarlarını yapma
client.tls_set(certfile=ssl_certfile, keyfile=ssl_keyfile, ca_certs=ssl_cafile, cert_reqs=ssl.CERT_REQUIRED, tls_version=ssl.PROTOCOL_TLS)

# Broker'a bağlanma
client.connect(broker_address, broker_port)

# Abone olunan konuları dinleme işlemi
def subscribe_topic():
    client.subscribe(topic)

# İstemciye bağlantıyı sağlama
client.loop_forever()

Yorum bırakın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Scroll to Top