Herkese merhaba! Bu yazımda sizlerle birlikte Raspberry PI 5 kartına MQTT Broker sunucusu nasıl kurulur bunu göreceğiz.

MQTT Nedir?

MQTT (Message Queuing Telemetry Transport) düşük bandwith ile publisher subscriber mantığını kullanan mesajlaşma protokolüdür denilebilir.

ESP32 IoT projelerinde sıklıkla kullanılır. Kolay ve sade kullanımı sayesinde hayat kurtarıcı bir sistemdir.

MQTT 3 Temel Yapısı:

  1. Publisher: Mesaj gönderen
  2. Subscriber: Mesajı alan
  3. Broker: mesajların gönderilip alınmasını sağlayan sistem

mqtt

QoS (Quality of Service)

MQTT mesajının ne kadar güvenilir şekilde iletileceğini belirleyen sistemdir.

  1. QoS 0: En fazla bir kere. En hızlı budur, çok güvenilir değildir. Tek yönlüdür. Kaybı önemsiz olan veriler için kullanılabilir.

  2. QoS 1: En az bir kere. Hızı ortadır, broker onayı vardır, alıcı onayı vardır. Mesaj tekrarı olabilir. Önemli verilerde kullanılabilir

  3. QoS 2: Tam bir kere. En yavaş budur, 4 adımda handshake vardır. hem kayıp hem de tekrarı önler. En güvenilir budur. Kritik veriler için kullanılabilir.

mqtt

LWT (Last Will and Testament)

Vasiyet gibi düşünülebilir. Bir cihaz eğer beklenmedik bir şekilde ortadan kaybolursa çevrimdışı mesajını son vasiyeti olarak yayınlar.

Eğer normak bir şekilde iletişim kesilirse bu vasiyet (LWT) hiçbir şekilde yayınlanmaz.

mqtt

MQTT Broker Kullanım Senaryoları

Raspberry PI5 kartınız varsa, mosquitto mqtt service kurup yerel ağınızdaki ESP32 kartlar ile akıllı ev projeleri gerçekleştirebilirsiniz.

Ekstra olarak Raspberry PI5 kartınızda public access ile uzaktan broker servisini kullanabilirsiniz (biz buna bakacağız.)

mqtt

ESP32 ile sensör verisini okuyup yerel sunucuda bunu mqtt broker’a gönderip, daha sonra uzaktan bu mqtt broker’a subscriber olan bir mobil uygulama ile sensör verilerini log olarak veya canlı olarak okuabilirsiniz.

mqtt

Biz de bugün evimdeki Raspberry PI5 kartıma MQTT Broker servisi kuracağız.

MQTT Broker Service Kurulumu

İlk olarak Raspberry PI5 Kartımda docker projeleri için kullandığım dizine mqtt için klasör açıyorum.

Docker-Projects/mqtt/config/

config/mosquitto.conf içerisine şu config ayarlarını yazıyoruz.

# kalıcılık etkin hale getirilir.
persistence true
# kalıcı verilerin saklanacağı klasör
#   tüm mesaj veritabanları, abonelik bilgileri bu dizine kaydedilir.
persistence_location /mosquitto/data/
# log çıktısı terminal ekranında görülür
log_dest stdout

# Standart MQTT (Yerel Ağ için)
listener 1883
protocol mqtt

# WebSocket MQTT (Cloudflare için)
listener 9001
protocol websockets

# anonim bağlantılara izin ver (test için)
allow_anonymous true

Daha sonra mqtt/docker-compose.yml içerisine gerekli talimatları yazalım.

services:
  mosquitto:
    image: eclipse-mosquitto
    container_name: mqtt-broker
    restart: unless-stopped
    volumes:
    # volume mapping ile container veriilerini yerel dosyalama ile eşitliyoruz
      - ./config:/mosquitto/config
      - ./data:/mosquitto/data
    ports:
      # yerel port
      - "1883:1883"
      # websocket portu
      - "9001:9001"

En son olarak CloudFlare ayarlarını değiştirmemiz gerekli.

1) CloudFlare MQTT DNS Ayarı

Cloudflare DNS kısmınıa girelim ve oradan records kısmında var olan domainimizin edit kısmına gelelim.

target (Required) kısmında bulunan uzun keyi kopyalayalım ve daha sonra yeni bir record açalım.

  • type: CNAME
  • name: mqtt.domain_ismi.com
  • target: Az önce kopyaladığımız key buraya yapıştırılır.

Şimdi subdomainimiz sisteme kayıt edildi. Gerekli config ayarlarını yapmaya geçebiliriz.

2) CloudFlare Config Dosyası Düzenleme

/etc/cloudflared/config.yml yolunda bulunan config dosyasına aşağıda bulunan kodu yazalım. Bu config dosyası servisleri ayarlayan dosyadır. Eğer kullanıcı (home) dizininde bulunan config dosyasını değiştirirseniz sisteminiz çalışmaz. Çünkü o config dosyası kişisel projeler, development ortamı için kullanılıyor.

ingress:
    # Web sitesi için kural (nginx)
    - hostname: hostname.xyz
      service: http://localhost:80

    # MQTT için kural (mosquitto web socket)
    - hostname: mqtt.hostname.xyz
      service: http://localhost:9001

    # handle edilmezse en son buraya gelir
    - service: http_status:404

Değişikliklerin sistemde hayata geçirilebilmesi için tüneli tekrardan başlatalım:

sudo systemctl restart cloudflared

Tamamdır, şimdi artık servisi docker üzerinden başlatıp deneme yapabiliriz.

cd ~/docker-projects/mqtt
docker compose up -d

Docker Compose kullanılan yaygın komutları da buraya bırakayım:


# Konteyneri başlat
docker compose up -d

# Durumunu kontrol et
docker compose ps

# Logları görüntüle
docker compose logs -f

# Konteyneri durdur
docker compose down

# Konteyneri durdurup volume'leri de sil
docker compose down -v

TEST EDELİM

Evet MQTT servisini başlattık ama çalışıyor mu bilmiyoruz. Bunu denemek için mqtt explorer ile python kodu kullanacağım.

MQTT Explorer

MQTT Explorer ile MQTT sunucunuzu gözlemleyebilir veya broker üzerinde bir topic’e mesaj publish edebilirsiniz.

mqtt

Evet, bağlantıyı yukardaki gibi yaparsanız, mqtt servisine bağlandığınızı göreceksiniz.

Artık python ile mqtt’ye bağlanıp mesajımız geliyor mu diye kontrol edebiliriz.

Python ile MQTT Broker Bağlanma

    import paho.mqtt.client as mqtt

    # WebSocket MQTT client oluştur
    client = mqtt.Client(
        client_id="pi5-mqtt",
        transport="websockets",  # WebSocket kullan
        protocol=mqtt.MQTTv311   # MQTT v3.1.1
    )


    # WebSocket ayarları
    client.ws_set_options(
        path="/",  # WebSocket path
        headers={
            "Host": "mqtt.domain_ismi.xyz",
            "Origin": "http://mqtt.domain_ismi.xyz",
            "User-Agent": "PythonMQTTClient"
        }
    )

    # SSL/TLS ayarları (Cloudflare HTTPS kullanıyor)
    import ssl
    client.tls_set(cert_reqs=ssl.CERT_NONE)  # Self-signed cert için
    client.tls_insecure_set(True)  # Cert doğrulamasını bypass et

    client.connect("mqtt.domain_ismi.xyz",443,60)

    client.loop_start()

    message = "Merhaba Ben Python MQTT mesajı"

    client.publish("furkan/deneme",message)

    print("mesaj gönderildi")

Evet bu kod ile mqtt sunucumuz bağlanıp Merhaba Ben Python MQTT mesajı mesajını gönderebiliyoruz.

Çalıştırıp MQTT Explorer üzerinden kontrol edelim.

mqtt

Evet! Görüldüğü gibi MQTT Broker sunucum sorunsuz bir şekilde çalışıyor.

SONUÇ

Bu yazımda size basit bir şekilde Cloudflare tunnel ile MQTT Broker sunucu nasıl açılır ve nasıl bağlanılır onu gösterdim.

Bu yazımın ikinci partında ESP32 ile MQTT Broker sunucuya bağlanmayı göstereceğim.

Sonraki yazılarda görüşene dek sağlıcakla kalın !


Yayınlanma:
Raspberry PI MQTT Evde Server Mosquitto CloudFlare