Raspberry Pi

Raspberry Pi'ye Güvenli Yerel MQTT Broker Olarak Mosquitto Kurulumu

Mosquitto'yu bir Raspberry Pi'ye kurun, parolalar ve mantıklı bir listener yapılandırmasıyla güvenli hale getirin, mosquitto_pub ve mosquitto_sub ile test edin ve yerel bir broker'ın ne zaman bir bulut broker'a köprülenmesi gerektiğini öğrenin.

Raspberry Pi Mosquitto kurulum adımlarından sonra yerel bir Mosquitto broker çalıştıran ve bir bulut MQTT broker'a köprülenmiş Raspberry Pi
Bunu kendi MQTT broker’ınızda çalıştırınFree planla özel, yönetilen bir MQTT broker alın ve hazır kod örnekleriyle başlayın.
Ücretsiz deneyin Kod örnekleri Kart gerekmez

Mosquitto'yu bir Raspberry Pi'ye kurduğunuzda, internet çalışmasa bile yerel ağınızda çalışmaya devam eden hızlı ve hafif bir MQTT broker elde edersiniz. Bu eğitimde Raspberry Pi için Mosquitto paketlerini işletim sistemi deposundan kuracak, parola doğrulamalı bir listener yapılandıracak, komut satırından test edecek ve yerel bir broker'ın ne zaman yeterli olduğuna, ne zaman bir bulut broker'a köprülenmesi gerektiğine karar vereceksiniz. Tüm yapılandırma dosyaları eksiksiz ve kopyalamaya hazırdır.

Yerel Bir Mosquitto Broker Ne Zaman Mantıklıdır?

Pi üzerindeki bir broker bazı işler için iyi, bazıları için kötü bir seçimdir. Zaman yatırmadan önce hangisine sahip olduğunuz konusunda dürüst olun.

Durum Pi üzerinde yerel Mosquitto Bulut broker
Tüm cihazlar tek bir LAN'da, uzaktan hiçbir şeye gerek yok Uygun İsteğe bağlı
İnternet kesintilerinde çalışmaya devam etmeli Uygun Yerel bir broker ile birleştirin
Birden fazla binadaki veya mobil ağlardaki cihazlar Uygun değil, port yönlendirme gerekir Uygun
Her yerden telefon uygulamaları ve panolar Uygun değil, VPN veya açık portlar gerekir Uygun
TLS, kimlik doğrulama ve güncellemelerle başkasının ilgilenmesini istiyorsunuz Uygun değil Uygun
Yerel cihazlar arasında çok düşük gecikme Uygun İnternet üzerinden bir gidiş-dönüş ekler

İkisini birleştiren model pratikte yaygındır: cihazlar Pi üzerindeki yerel Mosquitto ile konuşur ve Mosquitto seçilen topic'leri bir bulut broker'a köprüler (bridge). Yerel otomasyonlar çevrimdışıyken çalışmaya devam eder, bulut tarafı ise panolar ve uzaktan erişim için veriyi alır. Bu eğitim de tam olarak burada sona eriyor. Önce broker'ın rolünü hatırlamak isterseniz bir MQTT broker'ın ne yaptığı yazısına bakın.

Adım 1: Mosquitto'yu Raspberry Pi OS'a Kurun

Raspberry Pi OS Bookworm, deposunda çoğu kullanım için yeterince güncel olan Mosquitto 2.0'ı sunar:

sudo apt update
sudo apt install -y mosquitto mosquitto-clients
sudo systemctl enable --now mosquitto
mosquitto -h | head -n 1
systemctl status mosquitto --no-pager

mosquitto-clients paketi, test için kullanacağınız mosquitto_pub ve mosquitto_sub araçlarını ekler.

Kurulumdan hemen sonra Mosquitto 2.0 bilerek kilitlidir: yapılandırılmış bir listener yokken yalnızca Pi'nin kendisinden (localhost) gelen bağlantıları kabul eder ve anonim uzak istemcileri reddeder. Bu, broker'ın 1883 portunda herkesi kabul ettiği eski rehberleri izleyenleri şaşırtır. Doğru varsayılan budur ve bir sonraki adım onu güvenli şekilde açar.

Adım 2: Kullanıcıları ve Bir Parola Dosyasını Oluşturun

Her cihaz veya servis için bir kullanıcı içeren bir parola dosyası oluşturun. -c bayrağı dosyayı oluşturur, bu yüzden onu yalnızca ilk kullanıcı için kullanın:

sudo mosquitto_passwd -c /etc/mosquitto/passwd sensors
sudo mosquitto_passwd /etc/mosquitto/passwd nodered
sudo mosquitto_passwd /etc/mosquitto/passwd dashboard

Her komut bir parola ister ve düz metin yerine tuzlanmış bir hash saklar. Dosyayı yalnızca root ve broker okuyabilecek şekilde kısıtlayın:

sudo chown root:mosquitto /etc/mosquitto/passwd
sudo chmod 0640 /etc/mosquitto/passwd

Güncel Mosquitto sürümleri, parola dosyası herkes tarafından okunabilir olduğunda günlükte uyarı verir ve gelecekteki sürümler onu reddedebilir; bu yüzden izinleri şimdi ayarlayın.

Adım 3: Listener'ı Yapılandırın

Ana /etc/mosquitto/mosquitto.conf dosyasını olduğu gibi bırakın; bu dosya /etc/mosquitto/conf.d/ içindeki tüm dosyaları dahil eder. Kendi yapılandırmanızı oraya ekleyin:

sudo nano /etc/mosquitto/conf.d/local.conf
# Kimlik doğrulamalı yerel ağ listener'ı
per_listener_settings true

listener 1883 0.0.0.0
allow_anonymous false
password_file /etc/mosquitto/passwd

# Küçük bir Pi'yi koruyan sınırlar
max_connections 200
max_inflight_messages 20
max_queued_messages 1000
message_size_limit 262144

# SD kartı koruyun: kalıcılık ana dosyada varsayılan olarak açıktır,
# sürekli değil, 5 dakikada bir diske kaydedin
autosave_interval 300

Bu ayarlarla ilgili birkaç not. per_listener_settings true, her listener'ın kendi kimlik doğrulamasına sahip olmasını sağlar; daha sonra farklı kurallara sahip bir WebSocket listener'ı eklerseniz buna ihtiyacınız olacak. message_size_limit, hatalı davranan bir istemcinin sınırlı RAM'e sahip bir Pi'ye devasa payload'lar göndermesini engeller. autosave_interval, bellekteki kalıcılık veritabanının ne sıklıkla yazılacağını kontrol eder; bu da SD kart aşınması açısından önemlidir.

Yeniden başlatın ve günlüğü kontrol edin:

sudo systemctl restart mosquitto
sudo journalctl -u mosquitto -n 30 --no-pager

Günlükte Opening ipv4 listen socket on port 1883 görünmelidir. Servis başarısız olursa, hatanın hemen üstündeki günlük satırı hatalı seçeneği belirtir.

Adım 4: Yerel Broker'ı Test Edin

Pi üzerindeki bir terminalde dashboard kullanıcısıyla abone olun:

mosquitto_sub -h localhost -p 1883 -u dashboard -P 'dashboard-password' \
  -i test-sub -t 'home/#' -v

Başka bir terminalde ya da aynı ağdaki bir dizüstü bilgisayardan Pi'nin IP adresini kullanarak sensors olarak yayınlayın:

mosquitto_pub -h 192.168.1.50 -p 1883 -u sensors -P 'sensors-password' \
  -i test-pub -t home/kitchen/temperature -m 21.6

Abone home/kitchen/temperature 21.6 çıktısını verir. Şimdi anonim erişimin reddedildiğini doğrulamak için kimlik bilgisi olmadan deneyin:

mosquitto_pub -h 192.168.1.50 -p 1883 -i anon-test -t home/x -m test
# Connection error: Connection Refused: not authorised.

Daha fazla komut satırı kalıbı için mosquitto_pub ve mosquitto_sub örneklerine bakın.

Adım 5: Yerel Panolar İçin İsteğe Bağlı WebSocket Listener'ı

LAN'ınızdaki bir tarayıcı panosunun Pi broker'ıyla konuşması gerekiyorsa aynı dosyaya bir WebSocket listener'ı ekleyin:

listener 9001 0.0.0.0
protocol websockets
allow_anonymous false
password_file /etc/mosquitto/passwd

per_listener_settings açık olduğu için bu listener'ın kendi allow_anonymous ve password_file satırlarına ihtiyacı vardır. Düz ws:// güvenilir bir LAN'da kabul edilebilir, ancak internet üzerinden değil.

Raspberry Pi'ye Mosquitto Kurduktan Sonra Sıkılaştırma Kontrol Listesi

  1. Pi'nin varsayılan kullanıcı parolasını değiştirin ve işletim sistemini sudo apt full-upgrade ile güncel tutun.
  2. Router'ınızda 1883 portunu yönlendirmeyin. Şifrelenmemiş bir broker'ı internete açmak parola tahmini ve trafik dinleme saldırılarını davet eder.
  3. Her cihaz veya servis için ayrı bir MQTT kullanıcısı kullanın; böylece birini diğerlerine dokunmadan iptal edebilirsiniz.
  4. Broker'a yalnızca LAN'ınızın erişmesi için bir güvenlik duvarı kuralı ekleyin: sudo ufw allow from 192.168.1.0/24 to any port 1883.
  5. Pi yıllarca bir SD karttan çalışacaksa kalıcılığı bir SSD'ye taşıyın veya yazma işlemlerini azaltın.
  6. Pi'nin kendisini izleyin; Raspberry Pi sistem istatistikleri yayıncısı disk ve sıcaklık bilgilerini raporlar.

Broker'a dışarıdan erişim için port açma isteğine direnin. Bu, bir bulut broker'ın daha iyi yaptığı bir iştir.

Yerel Mosquitto Broker'ı ConnectMQ'ya Köprülemek

Yerel broker ile bulut broker burada buluşur. Mosquitto'nun yerleşik bir köprüsü vardır: uzak bir broker'a sıradan bir MQTT istemcisi olarak dışarıya doğru bağlanır ve seçtiğiniz topic'leri iletir. ConnectMQ bir bulut MQTT broker olduğundan, onun bakış açısından Pi'niz portalda oluşturulan kullanıcı adı, parola ve client ID ile oturum açan sıradan bir istemcidir. Bulut tarafında özel bir köprü özelliğine gerek yoktur ve ağınızda gelen bağlantılara açık bir port açılmaz.

Minimal bir köprü dosyası, /etc/mosquitto/conf.d/bridge-connectmq.conf, şöyle görünür:

connection connectmq
address broker.connectmq.com:8883
bridge_capath /etc/ssl/certs
remote_clientid YOUR_CLIENT_ID
remote_username YOUR_USERNAME
remote_password YOUR_PASSWORD
bridge_protocol_version mqttv311
try_private false
cleansession false
notifications false
start_type automatic

# Yerel home/... topic'i bulutta site1/home/... olarak görünür
topic home/# out 1 "" site1/
# Buluttan gelen komutlar yerel cihazlara ulaşır
topic home/+/set in 1 "" site1/

Mosquitto'yu yeniden başlatın; günlükte Connecting bridge connectmq görünür. Yerelde home/kitchen/temperature üzerine yayınlanan mesajlar artık ConnectMQ'da site1/home/kitchen/temperature üzerinde de görünür; portalın canlı topic gezgini ve panosu bunları gösterebilir. İnternet kesilirse yerel cihazlar Pi ile konuşmaya devam eder ve cleansession false ile QoS 1 sayesinde giden mesajlar, köprü yeniden bağlanana kadar max_queued_messages sınırına kadar yerelde kuyrukta bekler.

Bulut broker bir Let's Encrypt sertifikası kullanır; bu yüzden gereken tek TLS ayarı bridge_capath /etc/ssl/certs satırıdır. try_private false önemlidir: Mosquitto'nun diğer broker'ların beklemediği, Mosquitto'ya özgü bir protokol bayrağını kullanmasını engeller. Döngü önleme ve test dahil, seçenek seçenek eksiksiz anlatım Mosquitto köprü yapılandırma rehberinde yer alıyor.

Sonunda Pi broker'ı yalnızca buluta ulaşmak için tuttuğunuzu fark ederseniz, onu tamamen kaldırıp cihazları doğrudan buluta yönlendirmeyi düşünün. Mosquitto'yu bulut broker'a taşıma rehberi bu yolu ele alıyor.

Sorun Giderme

Hata veya belirti Neden Çözüm
Diğer makinelerden Connection refused 0.0.0.0 üzerinde listener yok listener 1883 0.0.0.0 ekleyin
not authorised Yanlış kullanıcı veya parola ya da dosya broker tarafından okunamıyor mosquitto_passwd komutunu yeniden çalıştırın, chown root:mosquitto ayarını kontrol edin
Yapılandırmayı düzenledikten sonra servis başarısız oluyor Yinelenen listener veya yazım hatası journalctl -u mosquitto çıktısını okuyun
İstemciler sürekli bağlantıyı kesiyor İki istemci aynı ID'yi paylaşıyor Benzersiz client ID'ler kullanın
Köprü bağlanıyor, sonra kopuyor Client ID veya kimlik bilgisi uyuşmazlığı Üçünü de portaldan birebir kopyalayın

ConnectMQ ile Başlayın

Hızlı yerel trafik için Mosquitto'yu tutun, internetten geçen her şeyi ise yönetilen bir broker'a bırakın. Kredi kartı gerektirmeden app.connectmq.com adresinde ücretsiz bir Serverless broker oluşturun, oluşturulan kimlik bilgilerini köprü dosyanıza kopyalayın ve yerel topic'lerinizin portalda belirdiğini izleyin. Daha fazla Pi projesi Raspberry Pi MQTT eğitiminde toplanmıştır.

Sık Sorulan Sorular

Mosquitto kurulumdan sonra neden diğer cihazlardan gelen bağlantıları reddediyor?

Mosquitto 2.0, siz bir listener yapılandırmadıkça yalnızca localhost'u dinler ve anonim istemcileri reddeder. allow_anonymous false ve bir parola dosyasıyla birlikte listener 1883 0.0.0.0 ekleyin.

Raspberry Pi Mosquitto broker'ımı internete açmalı mıyım?

Önerilmez. Bunun yerine dışarıya doğru bir bulut broker'a köprüleyin; böylece uzaktan erişim TLS ile güvenli bir hizmet üzerinden gerçekleşir ve router'ınız tüm gelen portları kapalı tutar.

Raspberry Pi üzerindeki Mosquitto çok sayıda cihazı kaldırabilir mi?

Bir ev veya küçük bir saha için Pi, tipik sensör trafiğini kolayca kaldırır. İlk karşılaşacağınız sınırlar genellikle ham verim değil, SD kart aşınması ve bakım eforudur.

Köprü için ConnectMQ'da özel bir hesap gerekir mi?

Hayır. Köprü sıradan bir MQTT istemcisidir; dolayısıyla portalın herhangi bir cihaz için oluşturduğu aynı kullanıcı adı, parola ve client ID'yi kullanır.

İlgili yazılar

RC522 Okuyucu ile Raspberry Pi RFID MQTT Erişim Kaydı

Bir RC522 RFID okuyucuyu Raspberry Pi'ye bağlayın, etiketleri Python ile okuyun, yerel bir izin listesiyle karşılaştırın ve her erişim denemesini kayıt araçlarının, panellerin ve uyarı araçlarının tüketebileceği bir MQTT olayı olarak yayınlayın.

6 dk okuma

Tüm yazılar →

Özel MQTT broker’ınız birkaç tık uzağınızda

Hesabınızı oluşturun, broker kimlik bilgilerinizi alın ve ilk cihazınızı bağlayın — kurulacak, yamalanacak ya da ölçeklendirilecek sunucu yok.