Ana içeriğe geç

EMQX MQTT Broker Konfigürasyonu

EMQX 5.8.3, Zeus 2.0'ın MQTT broker'ıdır.

Portlar

PortProtokolErişim
1883MQTT TCP (plaintext)localhost only
8883MQTT TLS0.0.0.0 (ESP32 cihazlar)
18083Dashboard HTTPlocalhost only

Authentication

Bootstrap dosyası ile kullanıcı tanımları:

KullanıcıRolAçıklama
backendServiceBackend API MQTT client
gatewayDeviceESP32 gateway cihazlar
adminSuperuserTam erişim (debug/monitoring)
zigbee_rpi_gateway_001DeviceZigbee2MQTT bridge

ACL Kuralları

Gateway İzinleri

Publish: Bootstrap topic'leri, telemetri verileri, reported status/config/alarms, OTA progress, ownership ACK

Subscribe: Bootstrap server yanıtları, desired config/templates/devices, komutlar, OTA command/rollback, firmware announcements, ownership commands

Backend İzinleri

Publish: Bootstrap yanıtları, desired config/templates/devices, komutlar, OTA, ownership commands, firmware announcements

Subscribe: Bootstrap hello/claim_ready, tüm telemetri verileri, reported status/config, eventler, OTA progress/status, ownership ACK

Varsayılan Kural

{deny, all}  # Tanımlanmamış tüm erişimler reddedilir

TLS Yapılandırması

TLS versiyonları: TLSv1.2, TLSv1.3
Sertifika: /opt/emqx/etc/certs/cert.pem
Anahtar: /opt/emqx/etc/certs/key.pem
CA: /opt/emqx/etc/certs/ca.pem

Production: Let's Encrypt sertifikaları (scripts/setup-ssl.sh) Development: Self-signed sertifikalar (scripts/generate-emqx-certs.sh)


QoS Politikası

Farklı veri tipleri için kullanılan QoS seviyeleri ve gerekçeleri:

Veri TipiQoSGerekçe
Gerçek zamanlı ölçümler (realtime)0Sık gönderim (5s aralık), tek bir veri kaybı tolere edilir
Enerji sayaçları (energy_kwh)1Faturalama verisi, kayıp kabul edilemez
Konfigürasyon komutları (desired/*)1Cihaz kurulumu, güvenilir iletim gerekli
Bootstrap mesajları0İlk handshake, başarısız olursa tekrar denenebilir
OTA komutları1Firmware güncelleme komutu, kritik iletim
Durum raporları (reported/*)0Düzenli aralıkla tekrar gönderilir, kayıp tolere edilir

Not: QoS 2 (exactly once) kullanılmaz. ESP32 cihazların sınırlı kaynakları ve ağ koşulları nedeniyle QoS 2'nin ek yükü kabul edilemez. QoS 1 ile idempotent mesaj tasarımı tercih edilir.


Session Yönetimi

Clean Session

  • ESP32 gateway'ler clean session = true kullanır
  • Her bağlantıda subscription'lar yeniden kurulur
  • Broker tarafında offline mesaj birikimi oluşmaz (kaynak tasarrufu)

Keep-Alive

ParametreDeğerAçıklama
Keep-alive interval60 saniyeClient'ın PINGREQ gönderme aralığı
Keep-alive multiplier1.5x (EMQX default)90 saniye içinde sinyal gelmezse bağlantı kopmuş sayılır

Session Expiry

ParametreDeğerAçıklama
Session expiry interval300 saniyeClean session=false durumunda oturum saklama süresi
Maksimum inflight32 mesajAynı anda onay bekleyen QoS 1 mesaj sayısı
Mesaj kuyruğu limiti1000 mesajOffline client için saklanacak maksimum mesaj

Bağlantı Kopma Tespiti

EMQX, gateway bağlantı durumunu webhook ile backend'e bildirir:

POST /api/internal/gateway/connected      → Gateway bağlandı
POST /api/internal/gateway/disconnected → Gateway koptu

Backend bu bilgiyi kullanarak cihaz çevrimiçi/çevrimdışı durumunu günceller ve gerektiğinde alarm tetikler.


Retained Message Politikası

Topic KategorisiRetainAçıklama
zeus/{tenant}/gw/{gw_id}/desired/*trueCihaz reconnect olduğunda son konfigürasyonu alır
zeus/{tenant}/gw/{gw_id}/reported/*falseDüzenli aralıkla güncellenir, geçmiş değer gereksiz
zeus/{tenant}/gw/{gw_id}/telemetry/*falseSürekli akan veri, retain gereksiz yük oluşturur
zeus/{tenant}/gw/{gw_id}/ota/*falseTek seferlik komutlar, retain riskli (tekrar tetikleme)
zeus/firmware/announcementstrueYeni bağlanan gateway'ler güncel firmware bilgisini alsın

Neden Sadece desired/* ve announcements Retain?

  • desired/* topic'leri cihaz konfigürasyonunu taşır. Gateway yeniden başladığında (OTA, güç kesintisi) son geçerli konfigürasyonu hemen alması gerekir
  • firmware/announcements topic'i mevcut firmware sürümünü duyurur. Yeni bağlanan gateway güncel sürümü bilmeli
  • Telemetri ve reported verileri sürekli yenilendiği için retain gereksiz disk ve bellek yükü oluşturur
  • OTA komutlarında retain tehlikelidir: gateway yeniden bağlandığında eski bir OTA komutu tekrar tetiklenebilir