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ı:
- Publisher: Mesaj gönderen
- Subscriber: Mesajı alan
- Broker: mesajların gönderilip alınmasını sağlayan sistem
QoS (Quality of Service)
MQTT mesajının ne kadar güvenilir şekilde iletileceğini belirleyen sistemdir.
-
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.
-
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
-
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.
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 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.)
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.
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.
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.
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 !