MQTT(Message Queuing Telemetry Transport) protokolü, internette yaygın olarak kullanılan makinalar arası (M2M) mesaj tabanlı bir protokoldür. Lightweight oluşu ve düşük kaynak tüketmesiyle Internet of Things(IoT) ekosisteminde benimsenmiştir. Hemen hemen tüm IoT bulut platformları akıllı nesnelerden veri gönderip almak için MQTT protokolünü desteklemektedir.

Bu protokol, istek(request)-yanıt(response) yapısına dayalı HTTP’ye karşıt olarak yayın(publish)-abone(subscriber) yapısında TCP/IP bağlantısı kurulur. TCP/IP protokolünün yazılabildiği Linux, Windows, Android, iOS, MacOS işletim sistemlerinde çalışır.

MQTT Mesaj Yapısı

MQTT protokolü yayıncı-abone yapısında bir mesaj yayınlayan bir client (yayıncı) mesajı alan diğer clientlara ayıracaktır (aboneler). Ayrıca, MQTT asenkron protokoldür, bu da mesajı beklerken clientı engellemediği anlamına gelir. HTTP protokolünün aksine, esas olarak eşzamanlı bir protokoldür. MQTT protokolünün bir başka özelliği, istemcinin (abone) ve yayıncının aynı anda bağlı olmasını gerektirmemesidir.

MQTT Mimarisi

MQTT, PUSH / SUBSCRIBE topolojisi kullanılarak TCP / IP’nin üstünde çalışır. MQTT mimarisinde iki tür sistem vardır: istemciler(client) ve sunucular. Sunucu, istemcilerin birbirleri arasında veri alma veya gönderme taleplerini karşılamaktan sorumlu olan taraftır.

MQTT sunucusuna “Broker” adı verilir ve istemciler Broker’a bağlı aygıtlardır.

  • Bir aygıt (istemci) Broker’a veri göndermek istediğinde, bu işleme “publish” diyoruz.
  • Bir aygıt (istemci) Broker’dan veri almak istediğinde, bu işleme “subscribe” diyoruz.

İstemciler doğrudan birbirleriyle iletişim kurmazlar, bunun yerine Broker’a bağlanırlar. Her istemci bir Publisher(yayıncı), Subscriber(abone) veya her ikisi de olabilir. Publisherlar verileri belli bir “Topic” adıyla yayınlar ve Subscriberlar bu Topic adı aracılığıyla Broker’a abone olarak verileri alır.

MQTT olay güdümlü bir protokoldür. Periyodik veya devam eden bir veri iletimi yoktur. Bu durum veri trafiğini minimumda tutar. İstemci yalnızca gönderilecek bilgi olduğunda yayınlar ve Broker yalnızca yeni veriler geldiğinde abonelere gönderir.

MQTT Nedir?

Elimizde bir sıcaklık sensörü olsun. Sensör, okuduğu verileri Broker’a göndermek istemektedir. Diğer taraftan, bir telefon veya masaüstü uygulaması bu sıcaklık değerini almak istemektedir.

Sensör, yayınlamak için Topic tanımlar, örneğin: “temp” olsun. Ardından “sıcaklık değeri” mesajını yayınlar.

Telefon / masaüstü uygulaması “temp” adlı Topic’e abone olur ve sensörün yayınladığı mesajı, yani sıcaklık değerini alır.

Burada Broker’ın rolü “sıcaklık değeri” mesajını almak ve telefon / masaüstü uygulamasına teslim etmektir.

MQTT Nedir?

MQTT’ nin veri trafiğini en aza indirmesinin bir başka sebebi de küçük mesaj yapısıdır. Her mesajın yalnızca 2 baytlık sabit bir başlığı vardır. Mesaj içeriği maksimum 256 MB’ a çıkabilir. Ağ tasarımcılarının veri trafiğini en aza indirmek ya da güvenilirliği en üst düzeye çıkarmak arasında seçim yapmalarını sağlayan üç farklı Hizmet Kalitesi (Quality of Service – QoS) seviyesi bulunmaktadır.

QoS 0 – Minimum veri aktarımı sağlanır. Bu seviyede her mesaj bir Subscriber’a iletilir ve mesajın ulaştığına dair onay alınmaz.  Subscriber’ların mesajı alıp almadıklarını bilmenin bir yolu yoktur. Bu yönteme “fire and forget” veya “at most once delivery” (en fazla bir kez teslim) denir. Broker mesajı gönderdiğinde teslimatın tamamlandığını varsaydığı için mesajı saklamaz. Bu sebeple, Broker mesajı gönderdiği sırada çevrimdışı olan Subscriber olursa tekrar bağlandığında o mesajı kaçırmış olur.

QoS 1 – Broker mesajı iletmeyi dener ve ardından Subscriber’dan bir onay yanıtı bekler. Belirtilen bir zaman dilimi içinde onay alınmazsa, mesaj tekrar gönderilir. Subscriber, onay yanıtını belirtilen zamanda gönderemezse bu mesajı birden fazla kez alabilir. Bu yönteme “at least once delivery” (en az bir kez teslim) denir.

QoS 2 – Broker, Subscriber’ın mesajı aldığından ve yalnızca bir kez alındığından emin olmak için iki onay alır. Bu yönteme “tam olarak bir kez teslim” olarak adlandırılır.

İletişimin güvenilir ancak sınırlı olduğu durumlarda, QoS 0 en iyi seçenek olabilir. İletişim güvenilir olmadığı ancak kaynak olarak sınırın olmadığı durumlarda, QoS 2 en iyi seçenek olacaktır. QoS 1 ise en iyi çözümü sunar, ancak verileri alan uygulamanın kopyaların nasıl işleneceğini bilmesini gerektirir.

Hem QoS 1 hem de QoS 2 için, çevrimdışı olan ve kalıcı bir oturumu olan Subscriber’lar için mesajlar kaydedilir veya sıraya alınır. İstemci yeniden çevrimiçi olduğunda bu mesajlar QoS düzeyine göre yeniden gönderilir.

“Last Will and Testament”

İletişimin güvenilir olmadığı durumlarda, bir Publisher’ın uyarı yapmadan çevrimdışı olması mümkündür. Bir Publisher, beklenmedik bir şekilde bağlantısının kesilmesi durumunda Subscriber’lara gönderilecek bir mesaj kaydedebilir, bu “Last will and testament” (son vasiyet) olarak adlandırılır. Bu mesaj, Broker’da önbelleğe alınır ve Publisher’ın bağlantısının düzgün şekilde kesilmesi durumunda Subscriber’lara gönderilir. Tipik olarak, böyle bir mesaj, uygun eylemlerin yapılabilmesi için bağlantısı kesilmiş Publisher’ın belirlenmesine izin veren bilgiler içerir.

Güvenlik

MQTT protokolünün asıl amacı ucuz ve güvenilir olmayan iletişim hatlarında mümkün olan en küçük ve en verimli veri iletimini sağlamaktı. Bu nedenle, MQTT’nin tasarımı ve uygulanması sırasında güvenlik birincil bir endişe değildi. Bununla birlikte bazı güvenlik seçenekleri mevcuttur.

  • Ağ güvenliği – Ağın güvenliği sağlanabilirse, güvenli olmayan MQTT verileri sorun teşkil etmez. Bu durumda, güvenlik sorunlarının ağın içinden, belki de kötü bir aktör ya da başka bir ağ penetrasyonu yoluyla ortaya çıkması beklenir.
  • Kullanıcı adı ve şifre – MQTT, bir istemcinin Broker ile bağlantı kurması için kullanıcı adı ve parola kullanılmasına izin verir. Çoğunlukla kullanıcı adı ve parola, kötü niyetli aktörlere karşı koruma olarak değil, istem dışı bağlantılardan kaçınmanın bir yolu olarak kullanılır.
  • SSL / TLS –  İstemciler ve Broker arasındaki iletimlerin güvenliğini sağlamak için bariz bir çözüm olan TCP / IP üzerinde çalışan SSL / TLS uygulamasıdır. Maalesef bu hafif iletişimlere önemli ölçüde ek yük getirir.

Genel olarak MQTT ‘nin Özellikleri

  • Asenkron (eş-zamansız) çalışan bir protokoldür.
  • Güvenlik olarak SSL / TLS desteklemektedir.
  • Minimum kaynak kullanımında bulunmaktadır.
  • Broker üzerinden haberleşme temeline dayanmaktadır.
  • Bilgiler MQTT protokolü üzerinden çok hızlı bir şekilde iletilebilir. (ms düzeyinde bir haberleşme)
  • TCP/IP nin kullanıldığı Windows, Linux, MacOS, Android ve iOS işletim sistemlerinde çalışır.

MQTT Brokerları

https://mosquitto.org/

https://www.hivemq.com/public-mqtt-broker/

https://www.emqx.com/en/mqtt/public-mqtt5-broker