Ana içeriğe atla

MQTT Topic Kısıtlama ve Retained Mesaj




Daha önce mqtt protokolünü kullanan ücretsiz mosquitto broker kurulumunu ve kullanıcı tanımlamayı yapmıştık. Ancak tanımladığımız kullanıcılar broker da publish yaparken ya da subscribe yaparken her konuya erişebiliyordu.


Bu yazıda her kullanıcı için erişimi topic bazında kısıtlayacağız. Ek olarak da retained message özelliğine değineceğim.

Konulara(topic) Göre Kısıtlama


Her kullanıcının erişim yetkisi olduğu topicleri bir liste olarak dosyaya yazacağız. Format aşağıdaki gibi.
Dosyamızı Oluşturuyoruz
sudo nano /etc/mosquitto/topicliste.txt


topic topicA –> topicA için readwrite yetkisi user1 ‘e verildi. user1 topicA ve bu topic in altında bulunacak subtopic ler için her türlü yayın ve takip yetkisine sahip. Yani user1 topicA/priz2 topic için de tüm yetkilere sahip.

topic read topicD –> topicD nin sadece okuma yetkisi user1 e verildi. yani user1 bu topiğe yayın yapamaz.

topicB için user1’in yetkisi olmadığı için herhangi bir işlem yapamaz.

Daha sonra mosquitto config dosyasında topic kısıtlama dosyasının konumunu bildireceğiz. Config dosyasının alt satırına acl_file dosyakonumu şeklinde ekliyoruz.

mosquitto config
sudo nano /etc/mosquitto/mosquitto.conf

Daha önce kullanıcı kısıtlaması için iki satır kod eklemiştik. Biri broker a kullanıcı adı olmadan giriş yapılamaması için, diğeri de kullanıcı adı ve şifre dosyasının yerine göstermek için idi. En alta topic kısıtlama dosyasını tanımlamış olduk
Mosquitto yenile
sudo service mosquitto restart


Mosquitto servisini yenilediğimizde artık hiçbir kullanıcı belirtilen yetkiler dışına çıkamayacak. Sunucumuzu çok kişili kullanıma uygun hale getirdik ve topicleri birbirinden soyutladık ki birbirlerine müdahale edemesinler.


Hemen deneme yapalım…
Mosquitto yayın ve takip komutları
mosquitto_pub -h localhost -u ‘admin’ -P ‘admin’ -t ‘topicA’ -m ‘yayın1’ -r
mosquitto_sub -v -h localhost -u ‘user1’ -P ‘passwd1 -t ‘topicA’
admin kullanıcısı için tüm topicler için yetkiye sahip olarak ayarlamıştık. Yayını onla yapıyoruz ve user1 ile topicA ‘ yı takip ediyoruz ve değeri okuyabiliyoruz.


user1 ile topicB yi takip etmeye kalktığımızda ise hiçbir değer okuyamıyoruz çünkü topicB için yetki vermedik.


Son olarak user1 ile yine topicB ye yayın yapmaya çalıştığımızda, user2 ile topicB de okuduğumuz değer bir önceki yayın oluyor retained message dan dolayı. Yani yine user1 in topicB için yaptığı yayın kabul edilmiyor.




RETAiNED MESSAGES


Diyelim ki bir takipçi ev/sensör topiğini takip ediyor. Takip etmeye başladığı andan itibaren eğer topicte bir değişim olursa yani topiğe bir değer yayın yapılırsa bu değişimi takipçimiz görebiliyor. Ancak takipçimiz takibe başladığı andan sonra herhangi bir yayın yapılmazsa takipçi herhangi bir değer okuyamıyor. Bunun için retained message özelliği mevcut. Yayın yapılırken retained message özelliği ile gönderirsek değeri, bu değer daha sonra bir yayın yapılana kadar o topicte tutuluyor. Yani takipçimiz takibe başladığında son yapılan yayının değerini hemen görebilir.

mosquitto_pub uygulamasıyla yayın yaparken -r komut seçeneğini eklersek yaptığımız yayın-gönderdiğimiz değer bir sonraki yayına kadar o topicte saklanacak.

Eğer retained message ları silmek istersek şu komutu gönderiyoruz
Retained message silmek için
mosquitto_pub -t “topicA” -r -n
Tabi sadece yetkiniz olanlara müdahale edebilirsiniz. Eğer brokerdaki tüm retained message ları silmek istiyorsanız:
Retained message Hepsini Sil
mosquitto_sub -t “#” -v | while read line _; do mosquitto_pub -t “$line” -r -n; done

Bu blogdaki popüler yayınlar

MQTT Broker Kurulumu – Mosquitto ve deneme

MQTT (Message Queuing Telemetry Transport), nesnelerin interneti alanında önemli haberleşme protokollerinden biridir. Kısaca bir sunucu üzerinden (broker) bir cihazın yayın yapması (publish) ve başka bir cihazın da bu yayını takip etmesi (subscribe) ‘ne dayalı bir yapıdır. Yayın ve takip işlemleri broker üzerinde açılan topicler üzerinden olur. Örneğin; Publisher1 isimli yayıncımız brokerda /ev/priz1 isimli topic (konu) içine ‘aç’ diye yayın yapar. Prize bağlı röle içeren Subscriber1 isimli takipçimiz de brokerdaki /ev/priz1 isimli topic değerini takip eder. ‘aç’ yayınını gören Subscriber1 röleyi sürüp prizi aktifleştirebilir. Aynı topic için birden fazla yayıncı olabilir. (aile üyelerinin telefonlarından aynı prizi kontrol edebilmesi) Bir yayıncı birden fazla topic için yayın yapabilir. Örneğin nem ve sıcaklık sensörü olan cihaz bu değerleri /sensor/nem ve /sensor/sicaklik gibi iki ayrı topic için yayın yapabilir. Yine bir topic’i birden fazla subscriber takip edebilir.(

Spinoza' nın Tanrısı

Einstein' ın ABD üniversitelerinde konferans verdiğinde öğrencilerin ona sık sık sordukları soru: - Tanrı' ya inanmıyor musun? Einstein hep şu cevabı verirdi: Spinoza' nın tanrısına inanıyorum. Spinoza' yı okumayan kişi aynı yerde kalır. Umarım bu özet, benim kadar size de hizmet eder... "Baruch de Spinoza", 17. yüzyıl felsefesinin üç büyük rasyonalistinden biri olarak kabul edilir, Fransız "Descartes" ile birlikte... ....................................................... Spinoza' nın Tanrısı, ya da Doğası... Tanrı şöyle derdi: Dua etmeyi bırak ve göğsüne yumruk atmaktan da vazgeç. Yapmanı istediğim şey, dünyaya çıkıp hayatının tadını çıkarman. Eğlenmeni, şarkı söylemeni ve senin için yaptığım her şeyin tadını çıkarmanı istiyorum. Kendi inşa ettiğin o soğuk ve karanlık tapınaklara gitmeyi bırak. Oraların benim evim olduğunu söylüyorsun. Benim evim dağlarda, ormanlarda, nehirlerde, göllerde, plajlarda. Yaşadığım her yerde sana olan aş

Raspberry Pi 7″ Dokunmatik Ekranı ve Parlaklık Ayarı

Raspberry pi için üretilmiş 7″ 800×480 60fps 10 nokta dokunmatik desteğine sahip ekran DSI bağlantısı ile Rasberry pi kartınıza takılıyor. Güç kaynağı için gpio 5volt pinini kullanabilirsiniz. Ekranın diğer bir özelliği arka tarafında Rpi kartınızı takabileceğiniz vida delikleri bulunması. Raspbian işletim sistemiyle sorunsuz ve kurulum gerektirmeden çalışıyor. Raspberry pi tek kart bilgisayar için bir ekran tercihi projenize göre farklı alternatifler içeriyor. Gpio pinlerine oturan ekranlar, hdmi ekranlar , analog video ekranlar( pek tercih edilmiyor), son olarak mini bilgisayarımız üzerindeki display portuna (DSI) bağlanan ekranlar. Kullanıma amacı tercihi belirleyecektir ancak sorunsuz bir kullanım için benim önerim hmdi ve DSI portuna takılan orjinal rpi ekranı. Ekranı kullanırken bazı kontroller için aşağıdaki komutları kullanıyoruz: Ekranı arka ışığını kapatmak için echo 1 > /sys/class/backlight/rpi_backlight/bl_power Ekranı arka ışığını açmak için e