MQTT Temelleri

MQTT Retained Mesajlar: Nasıl Çalışır ve Ne Zaman Kullanılır?

Retain bayrağı, bir MQTT broker'ın her yeni subscriber'a bir topic'teki bilinen son değeri anında vermesini sağlar. Nasıl çalıştığını, nerede parladığını ve nerede eskimiş veri hatalarına yol açtığını öğrenin.

Yeni subscriber'lar için MQTT retained mesajları anlatmak üzere her topic'in son değerini saklayan broker çizimi
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

MQTT retained mesajlar basit ama can sıkıcı bir sorunu çözer: Bir topic'e subscribe olan istemci, herhangi bir şey öğrenebilmek için bir sonraki publish'i beklemek zorundadır. Retain bayrağıyla broker o topic'teki son mesajı tutar ve her yeni subscriber'a hemen iletir. Bu rehberde retained mesajların tam olarak nasıl davrandığını görecek, onları herkese açık bir broker'da deneyecek ve ne zaman kullanıp ne zaman kaçınmanız gerektiğini öğreneceksiniz.

MQTT Retained Mesajlar Nedir?

Her MQTT PUBLISH paketi bir bitlik bir retain bayrağı taşır. Bir istemci retain değeri true olarak publish ettiğinde broker iki şey yapar: Mesajı her zamanki gibi mevcut subscriber'lara iletir ve bir kopyasını tam o topic için retained mesaj olarak saklar. Her topic en fazla bir retained mesaj tutar; dolayısıyla yeni bir retained publish eskisinin yerini alır.

Bir istemci daha sonra bu topic'le eşleşen bir filtreye subscribe olduğunda broker, saklanan mesajı SUBACK'ten hemen sonra gönderir. Subscriber bu teslimatta retain bayrağını ayarlanmış olarak görür; bu da ona "bu yeni bir olay değil, bilinen son değer" der. Wildcard subscription'lar da çalışır: factory/+/status filtresine subscribe olmak, eşleşen her topic'in retained mesajını bir kerede döndürür.

Gözden kaçması kolay birkaç kural:

  • Saklama istemci bazında değil, topic bazındadır. Herhangi bir istemci retained değerin üzerine yazabilir.
  • Retain ile boş (sıfır baytlık) bir payload publish etmek retained mesajı siler.
  • MQTT 3.1.1'de zaten bağlı olan subscriber'lara iletilen mesajlar normalde retain bayrağı temizlenmiş olarak gelir. MQTT 5, bayrağı korumak için "retain as published" subscription seçeneğini ekler.
  • Retained teslimatın QoS'u, saklanan mesajın QoS'u ile subscription QoS'unun düşük olanıdır.

Bir broker'ın mesajları genel olarak nasıl yönlendirdiğini hatırlamanız gerekiyorsa önce bir MQTT broker'ın ne yaptığını okuyun.

Retain Bayrağı Teslimatı Nasıl Değiştirir?

Farkı anlamanın en kolay yolu, aynı publish'i retain ile ve retain olmadan karşılaştırmaktır.

Senaryo Retain false Retain true
Subscriber publish anında çevrimiçi Mesajı alır Mesajı alır
Subscriber 5 dakika sonra bağlanır Bir sonraki publish'e kadar hiçbir şey almaz Son değeri hemen alır
Aynı topic'te ikinci publish İletilir, hiçbir şey saklanmaz İletilir, saklanan değerin yerini alır
Boş payload publish etmek Boş bir mesaj iletir Saklanan değeri siler
Wildcard subscription Yalnızca gelecekteki mesajlar Eşleşen her topic'in son değeri

Retained mesajların sık sık "bilinen son geçerli değer" olarak tanımlanmasının nedeni budur. Bir olay akışını, subscribe olarak sorgulayabileceğiniz bir şeye dönüştürürler.

Retained Mesajları Herkese Açık Bir Broker'da Deneyin

Bunu, broker.connectmq.com adresindeki herkese açık MQTT test broker'ına karşı Mosquitto komut satırı araçlarıyla bir dakikadan kısa sürede test edebilirsiniz. Broker, boş olmayan herhangi bir client ID ile anonim bağlantıları kabul eder. Herkese açık alandaki her şey herkes tarafından okunabildiği için benzersiz bir topic öneki kullanın.

Önce retained bir değer publish edin, ardından bağlantıyı kesin:

mosquitto_pub -h broker.connectmq.com -p 1883 -i demo-pub-r7k2 \
  -t connectmq/demo/r7k2/thermostat/setpoint \
  -m '{"setpoint":21.5,"unit":"C"}' -q 1 -r

Şimdi başka bir terminalden subscribe olun. Kimse publish etmiyor olsa bile değer anında gelir. -v bayrağı topic'i yazdırır, -F ise retain bayrağını açıkça göstermemizi sağlar:

mosquitto_sub -h broker.connectmq.com -p 1883 -i demo-sub-r7k2 \
  -t 'connectmq/demo/r7k2/#' -F 'retained=%r %t %p'

retained=1 ve ardından topic ile payload'ı görmelisiniz. Subscriber açıkken -r olmadan yeniden publish ederseniz yeni satır retained=0 gösterir, çünkü bu saklanan değil canlı bir mesajdır.

Retained değeri silmek için boş bir retained mesaj publish edin. -n bayrağı null bir payload gönderir:

mosquitto_pub -h broker.connectmq.com -p 1883 -i demo-pub-r7k2 \
  -t connectmq/demo/r7k2/thermostat/setpoint -r -n

Yeniden subscribe olun; hiçbir şey dönmez. Wildcard ile temizlik betikleri de dahil olmak üzere temizliği retained bir mesaj nasıl silinir yazısında daha ayrıntılı ele alıyoruz.

Python'dan Retained Mesaj Publish Etmek

Uygulama kodunda retain bayrağı yalnızca bir parametredir. İşte retained bir cihaz durumu publish eden ve ardından yeni bir istemciyle onu geri okuyan eksiksiz bir paho-mqtt 2.x örneği:

import json
import time
import uuid
import paho.mqtt.client as mqtt

BROKER = "broker.connectmq.com"
PREFIX = f"connectmq/demo/{uuid.uuid4().hex[:6]}"
TOPIC = f"{PREFIX}/pump-07/state"

# 1. Retained bir durum publish et ve bağlantıyı kes
pub = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id=f"pub-{uuid.uuid4().hex[:8]}")
pub.connect(BROKER, 1883, keepalive=30)
pub.loop_start()
info = pub.publish(TOPIC, json.dumps({"running": True, "rpm": 1480}), qos=1, retain=True)
info.wait_for_publish()
pub.loop_stop()
pub.disconnect()

# 2. Yeni bir subscriber saklanan değeri hemen alır
def on_connect(client, userdata, flags, reason_code, properties):
    client.subscribe(TOPIC, qos=1)

def on_message(client, userdata, msg):
    print(f"{msg.topic} retain={msg.retain} payload={msg.payload.decode()}")

sub = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id=f"sub-{uuid.uuid4().hex[:8]}")
sub.on_connect = on_connect
sub.on_message = on_message
sub.connect(BROKER, 1883, keepalive=30)
sub.loop_start()
time.sleep(3)
sub.loop_stop()
sub.disconnect()

Subscriber, publisher ayrıldıktan sonra bağlanmış olsa bile retain=True yazdırır. Bir dashboard'da veya dijital ikizde bu, arayüzün açılışta boş alanlar göstermek yerine güncel durumu çizebileceği anlamına gelir.

MQTT Retained Mesajlar Ne Zaman Kullanılmalı?

Retained mesajlar, bir olaydan çok güncel bir durumu tanımlayan veriler için en iyi sonucu verir:

  1. Cihaz durumu. Çevrimiçi/çevrimdışı bayrakları, firmware sürümü, çalışma modu. Last Will ile birleştiğinde güvenilir varlık bilgisi sağlar; bkz. MQTT cihaz çevrimiçi durumu.
  2. Yapılandırma ve ayar noktaları. Yeniden başlayan bir cihaz config topic'ine subscribe olur ve ayrı bir API çağrısına gerek kalmadan ayarlarını alır.
  3. Yavaş değişen ölçümler. 10 dakikada bir güncellenen bir tank seviyesi, son değer retained değilse yeni açılmış bir dashboard için işe yaramaz.
  4. Keşif metadata'sı. Birçok ev ve endüstriyel araç, yeni tüketicilerin cihazları bulabilmesi için retained tanımlayıcılar publish eder.
  5. Dijital ikizin başlangıç durumu. Bir ikizin açılışta eksiksiz bir resme ihtiyacı vardır ve retained topic'ler bunu tek bir wildcard subscribe ile sağlar.

Retained Mesajlar Ne Zaman Kullanılmamalı?

Retain bayrağı bir veritabanı da değildir, bir kuyruk da. Şunlar için kaçının:

  • Olaylar ve komutlar. Retained bir "vanayı aç" komutu, yeniden başlatmadan sonra dahil olmak üzere daha sonra subscribe olan her cihaza tekrar oynatılır. Bu klasik ve tehlikeli bir hatadır. Komutlar retained olmamalı, ideal olarak bir süre dolumuna sahip olmalıdır; bkz. MQTT message expiry interval.
  • Yüksek frekanslı telemetri geçmişi. Yalnızca son mesaj tutulur. Geçmişe ihtiyacınız varsa bir zaman serisi veritabanına yazan bir subscriber çalıştırın.
  • Onaylanması gereken alarmlar. Retained bir alarm, bir şey açıkça üzerine yazmadıkça temizlendikten sonra da görünür kalır.

Tuzaklar ve Sorun Giderme

Hizmetten çıkarılan bir cihazdan sonra kalan eski değerler. Retained mesajlar biri silene kadar yaşar. Hizmetten çıkarma prosedürünüze temizliği ekleyin ve cihazın sahip olduğu her topic için boş bir retained payload publish edin.

Test çalıştırmalarından kalan hayalet veriler. Geliştirme sırasında topic'lerde retained çöp bırakmak kolaydır. Proje başına benzersiz bir önek, bir wildcard subscriber ile temizliği çok daha kolay hale getirir.

Yeniden subscribe olurken beklenmedik tekrarlar. Her SUBSCRIBE retained teslimatı yeniden tetikler; bu da yeniden bağlanmada tekrar subscribe olan kodu şaşırtabilir. MQTT 5, retain handling subscription seçeneğini sunar: 0 her subscribe'da retained mesajları gönderir, 1 yalnızca subscription yeniyse gönderir, 2 hiç göndermez. İstemci kütüphanenizin bunu sunup sunmadığını kontrol edin.

Canlı mesajlarda retain bayrağı false görünüyor. MQTT 3.1.1'de bu beklenen bir durumdur. Mantığınız bir mesajın başlangıçta retained olup olmadığını bilmeye dayanıyorsa MQTT 5'i retain as published ile kullanın.

Broker yeniden başladıktan sonra retained değerler. Retained mesajların bir broker yeniden başlatmasından sağ çıkıp çıkmadığı broker'ın kalıcılık yapılandırmasına bağlıdır. Retained deposunun kalıcı olduğunu varsaymak yerine, cihazları durumlarını periyodik olarak veya yeniden bağlandıklarında tekrar publish edecek şekilde tasarlayın; böylece yeni başlayan bir broker hızla yeniden dolar.

Normatif ifadenin tam halini görmek isterseniz bu davranış OASIS MQTT 5.0 spesifikasyonunda tanımlanmıştır.

Yönetilen Bir Broker'da Retained Mesajlar

Tamamen yönetilen bir MQTT servisinde retained depolamayı kendiniz yapılandırmazsınız, ancak topic tasarımı hâlâ sizin sorumluluğunuzdadır. ConnectMQ, MQTT 3.1.1 ve 5.0'da retained mesajları destekler ve portalında canlı bir topic gezgini ile tarayıcı içi bir MQTT istemcisi bulunur; böylece önekinize subscribe olup bağlandığınız anda retained değerlerin gelişini izleyebilirsiniz. Bu da eskimiş test verilerini veya arkasını hiç temizlemeyen bir cihazı fark etmeyi kolaylaştırır.

Production'a geçmeden önce pratik bir kontrol listesi:

  1. Her topic için karar verin: durum (retain) mi, olay (retain yok) mu?
  2. Komutları asla retain etmeyin.
  3. Durumu yalnızca değiştiğinde değil, her yeniden bağlanmada tekrar publish edin.
  4. Cihazlar emekliye ayrıldığında retained topic'leri temizleyin.
  5. Retained payload'ları küçük tutun; her yeni subscriber hepsini bir kerede alır.

Protokolün bütünü hakkında daha fazlası için MQTT eğitimi publish, subscribe, QoS ve oturumları baştan sona anlatıyor; bulut MQTT broker rehberi ise barındırılan broker'ların gerçek bir kuruluma nasıl oturduğunu açıklıyor.

ConnectMQ ile Başlayın

app.connectmq.com adresinde kredi kartı gerekmeden Serverless planda ücretsiz bir broker oluşturun. Dakikalar içinde bir kullanıcı adı, parola ve client ID alırsınız ve ilk cihazınız publish eder etmez retained topic'lerinizin ConnectMQ topic gezgininde belirdiğini görebilirsiniz.

Sık Sorulan Sorular

Bir topic'in kaç retained mesajı olabilir?

Tam olarak bir. Aynı topic'te yeni bir retained publish öncekinin yerini alır ve boş bir retained payload onu kaldırır.

Retained mesajların süresi dolar mı?

MQTT 3.1.1'de varsayılan olarak hayır. MQTT 5'te retained bir publish üzerinde bir message expiry interval ayarlayabilirsiniz; bu süreden sonra broker onu yeni subscriber'lara iletmeyi bırakır.

QoS retained mesajları etkiler mi?

Retained mesaj publish edildiği QoS'u korur ve yeni bir subscriber onu bu QoS ile kendi subscription QoS'unun düşük olanıyla alır.

Hangi topic'lerde retained mesaj olduğunu görebilir miyim?

your/prefix/# gibi geniş bir wildcard'a subscribe olun; altındaki her retained mesaj hemen iletilir. ConnectMQ'da aynısını portaldaki tarayıcı içi istemciden de yapabilirsiniz.

İlgili yazılar

MQTT'yi Kim İcat Etti? Petrol Boru Hatlarından IoT'ye Uzanan Tarih

MQTT, 1999'da IBM'den Andy Stanford-Clark ve Arcom'dan Arlen Nipper tarafından petrol boru hatlarını uydu üzerinden izlemek için icat edildi. Açık kaynağa, OASIS'e, ISO'ya ve bugünün yönetilen bulut broker'larına uzanan yolculuğunu izleyin.

7 dk okuma

MQTT Maksimum Mesaj Boyutu: Sınırlar ve Büyük Payload Stratejileri

MQTT teknik olarak 256 MB'lık bir paket taşıyabilir, ancak broker'lar, istemci kütüphaneleri ve cihazlar çok daha düşük sınırlar uygular. Gerçek sınırların nerede olduğunu, aşıldıklarında ne olduğunu ve büyük payload'ların nasıl gönderileceğini öğrenin.

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.