MQTT Temelleri

MQTT 5'te Session Expiry Interval ve Clean Start Açıklandı

MQTT 5, eski clean session bayrağını Clean Start ve Session Expiry Interval olarak ikiye ayırdı. İkisinin nasıl birleştiğini, hangi değerlerin seçileceğini ve bunların canlı bir broker'da nasıl doğrulanacağını anlatıyoruz.

Bir IoT istemcisinin bağlantısı kesildikten sonra broker oturumunda geri sayım zamanlayıcısı bulunan MQTT session expiry interval ç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 session expiry interval, broker'a bir istemcinin oturumunu bağlantısı kesildikten sonra ne kadar süre saklayacağını söyler ve Clean Start bayrağıyla birlikte MQTT 3.1.1'deki ya hep ya hiç mantığıyla çalışan clean session bayrağının yerini alır. Bu yazıda iki ayarın nasıl birleştiğini, sürenin bağlantı kesilirken nasıl değiştirilebileceğini ve sensörler, gateway'ler ve backend servisleri için makul değerlerin nasıl seçileceğini öğreneceksiniz.

MQTT 5 Clean Session Bayrağının Yerine Neden Başka Bir Şey Getirdi?

MQTT 3.1.1'de cleanSession tek bir bitle iki iş görüyordu. Bu değeri false yapmak "eski oturumumu sürdür ve bu oturumu sonsuza kadar sakla" anlamına geliyordu. "Oturumumu sürdür ama bir saatten uzun süre yoksam onu unut" demenin bir yolu yoktu. Broker'lar bu durumu sunucu tarafı sona erme ayarlarıyla aşmaya çalıştı; bu da davranışın broker'dan broker'a farklılık göstermesine ve terk edilmiş oturumların birikmesine yol açtı.

MQTT 5 bu iki konuyu birbirinden ayırır:

  • Clean Start (bir CONNECT bayrağı) şu soruyu yanıtlar: broker mevcut bir oturumu şu anda atmalı mı?
  • Session Expiry Interval (saniye cinsinden bir CONNECT özelliği) şu soruyu yanıtlar: ağ bağlantısı kapandıktan sonra oturum ne kadar süre yaşamalı?

Bu tasarım OASIS MQTT 5.0 spesifikasyonunda açıklanır ve MQTT 5 özellikleri genel bakışımızda ele aldığımız en pratik iyileştirmelerden biridir.

Clean Start ve Session Expiry Nasıl Birleşir?

Clean Start Session Expiry Interval Davranış 3.1.1 karşılığı
true 0 (veya yok) Yeni oturum, bağlantı kesildiğinde silinir cleanSession = true
false 0 (veya yok) Varsa mevcut oturumu sürdürür, bağlantı kesildiğinde silinir Doğrudan karşılığı yok
true > 0 Eski oturumu atar, bağlantı kesildikten sonra N saniye yaşayan yeni bir oturum başlatır Doğrudan karşılığı yok
false > 0 Varsa sürdürür, bağlantı kesildikten sonra N saniye yaşar cleanSession = false (zaman aşımıyla)
false 0xFFFFFFFF Varsa sürdürür, hiçbir zaman sona ermez cleanSession = false

Pratikte birkaç ayrıntı önemlidir:

  • Zamanlayıcı, istemcinin son publish yaptığı anda değil, ağ bağlantısı kapandığında başlar.
  • İstemci zamanlayıcı dolmadan yeniden bağlanırsa oturum sürdürülür ve zamanlayıcı iptal edilir.
  • Süre dolduğunda broker abonelikleri ve kuyruktaki tüm mesajları siler.
  • Oturumun süresi dolarsa, will gecikme süresi daha uzun olsa bile will mesajı en geç o anda gönderilir.

Süreyi Bağlantı Kesilirken Değiştirmek

MQTT 5, bir istemcinin DISCONNECT paketinde sona erme süresini güncellemesine izin verir. Planlı bakıma giren bir cihaz, normalde daha kısa bir değerle çalışırken ayrılırken "oturumumu bir gün sakla" diyebilir. Tek bir kısıtlama vardır: istemci 0 süresiyle bağlandıysa bağlantıyı keserken sıfır olmayan bir değer ayarlayamaz; broker bunu protokol hatası olarak değerlendirir.

Broker Talebinizi Geçersiz Kılabilir

Bir broker, oturumları istediğiniz kadar uzun süre saklamayı reddedebilir. Bu durumda CONNACK içinde bir Session Expiry Interval özelliği döndürür ve geçerli olan değer budur. Gerçek sayıyı bilmek için geliştirme sırasında CONNACK özelliklerini her zaman loglayın. broker.connectmq.com adresindeki ücretsiz test broker'ında session expiry 30 dakikayla sınırlıdır.

MQTT Session Expiry Interval Değerini Seçmek

İki soruyu düşünün: bu istemci gerçekçi olarak ne kadar süre çevrimdışı kalabilir ve kuyruktaki bir mesaj işe yaramaz hale gelmeden ne kadar eskiyebilir?

İstemci türü Önerilen süre Gerekçe
Canlı dashboard, tarayıcı sekmesi 0 Yalnızca güncel veri önemlidir; retained mesajlar bağlantıda ekranı doldurur
Yalnızca publish eden şebeke beslemeli sensör 0 ila 300 sn Oturum durumu azdır; kısa süre hızlıca temizlik yapar
Komut alan cihaz 1 ila 24 saat Komutlar Wi-Fi kopmalarından ve kısa kesintilerden sağ çıkmalıdır
Saatte bir uyanan uykucu pilli cihaz Uyanma aralığından biraz uzun Oturum uyku süresinden daha uzun yaşamalıdır
Alarm işleyen backend worker'ı Kurtarma sürenize göre saatler Kaçırılan alarmlar yeniden dağıtımlardan sonra işlenmelidir
Hizmetten çıkarılmış veya test istemcisi 0 Geride sahipsiz oturum bırakmaktan kaçının

Uzun sona erme sürelerini, zamana duyarlı yayınlarda MQTT 5 Message Expiry Interval özelliğiyle eşleştirin. Altı saat boyunca kuyrukta bekleyen bir "pompayı çalıştır" komutu, hiç teslim edilmeyen bir komuttan daha tehlikeli olabilir.

Uygulamalı Bir Örnek: Komut Alan Uykucu Sensör

Her 15 dakikada bir uyanan, bir ölçüm publish eden, yapılandırma komutlarını kontrol eden ve yeniden uykuya geçen pilli bir sensör düşünün. Session expiry 0 olsaydı, uyurken gönderilen her komut düşerdi; çünkü onu kuyruğa alacak bir oturum olmazdı. Süre sonsuz olsaydı, sahada ölen bir sensör kimsenin okumayacağı komutları toplamaya devam eden bir oturum bırakırdı. Yaklaşık 20 ila 30 dakikalık bir değer, kaçırılmış bir uyanmayı ve biraz ağ dalgalanmasını karşılar; cihaz gerçekten devre dışı kaldığında da oturum kendiliğinden ortadan kalkar. Komutları QoS 1 ve birkaç saatlik bir message expiry ile gönderin; cihaz bir sonraki bağlantısında hâlâ geçerli olan her şeyi alır.

Session Expiry'yi Kodda Ayarlamak

Tüm örnekler ücretsiz herkese açık MQTT broker üzerinde benzersiz bir demo öneki kullanır. s4e8 değerini kendi rastgele dizenizle değiştirin; herkese açık alan herkes tarafından görülebilir.

mosquitto_sub

# Bağlantı kesildikten sonra 10 dakika yaşayan bir oturumu sürdür (veya oluştur)
mosquitto_sub -h broker.connectmq.com -p 1883 -V mqttv5 \
  -i expiry-demo-s4e8 -c -x 600 -q 1 -v -d \
  -t 'connectmq/demo/s4e8/commands/#'

-c, Clean Start'ı false yapar; -x 600 ise Session Expiry Interval değerini ayarlar. -d bayrağı CONNACK'i yazdırır; böylece broker'ın değeri kabul edip etmediğini görebilirsiniz.

Python (paho-mqtt 2.x)

import paho.mqtt.client as mqtt
from paho.mqtt.properties import Properties
from paho.mqtt.packettypes import PacketTypes

def on_connect(client, userdata, flags, reason_code, properties):
    granted = getattr(properties, "SessionExpiryInterval", None)
    print("Connected:", reason_code,
          "| session present:", flags.session_present,
          "| broker override:", granted)
    if not flags.session_present:
        client.subscribe("connectmq/demo/s4e8/commands/#", qos=1)

def on_message(client, userdata, msg):
    print("Command:", msg.topic, msg.payload.decode())

client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2,
                     client_id="expiry-py-s4e8",
                     protocol=mqtt.MQTTv5)
client.on_connect = on_connect
client.on_message = on_message

connect_props = Properties(PacketTypes.CONNECT)
connect_props.SessionExpiryInterval = 600

client.connect("broker.connectmq.com", 1883, keepalive=60,
               clean_start=False, properties=connect_props)
client.loop_start()

try:
    input("Press Enter to disconnect with a 30 minute expiry...\n")
finally:
    bye = Properties(PacketTypes.DISCONNECT)
    bye.SessionExpiryInterval = 1800
    client.disconnect(properties=bye)
    client.loop_stop()

Node.js (MQTT.js v5)

const mqtt = require("mqtt");

const client = mqtt.connect("mqtts://broker.connectmq.com:8883", {
  clientId: "expiry-node-s4e8",
  protocolVersion: 5,
  clean: false, // Clean Start = false
  properties: { sessionExpiryInterval: 600 },
});

client.on("connect", (connack) => {
  console.log("session present:", connack.sessionPresent,
              "props:", connack.properties);
  if (!connack.sessionPresent) {
    client.subscribe("connectmq/demo/s4e8/commands/#", { qos: 1 });
  }
});

client.on("message", (topic, payload) => {
  console.log(topic, payload.toString());
});

Yaygın Hatalar ve Nasıl Fark Edilecekleri

  1. Clean Start false, süre 0. Geliştiriciler 3.1.1 kodunu taşır, clean: false ayarlar ve süre özelliğini unutur. MQTT 5'te bu oturum bağlantı koptuğu anda silinir; dolayısıyla hiçbir şey kuyruğa alınmaz. Kuyruktaki mesajlar hiç görünmüyorsa önce bunu kontrol edin.
  2. Test istemcilerinde sonsuz süre. Benzersiz bir kimlik ve 0xFFFFFFFF kullanan her tek kullanımlık betik geride bir oturum bırakır. Oturumları test etmiyorsanız deneylerde 0 kullanın.
  3. Session Present'ı görmezden gelmek. Broker yeniden başladıysa veya oturumun süresi dolduysa Session Present 0'dır ve abonelikleriniz gitmiştir. Bu durumda her zaman yeniden abone olun.
  4. Broker yeniden başlatmalarında kalıcılık varsaymak. Session expiry, bir oturumun ne kadar süre yaşayabileceğini ifade eder; bir depolama garantisi değildir. ConnectMQ oturum durumunu bellekte tutar: istemci bağlantı kesilmelerinden tanınan süre boyunca sağ çıkar, ancak broker'ın kendisi yeniden başlarsa temizlenir.
  5. Client ID'leri değiştirmek. Süre client ID'ye bağlıdır. Yeni bir kimlik yeni bir oturumdur; bkz. MQTT client ID en iyi uygulamaları.

Büyük Resimdeki Yeri

Session expiry, kalıcı oturumları güvenle çalıştırmanın MQTT 5 yoludur: ihtiyaç duyduğunuz yerde çevrimdışı kuyruklama, ihtiyaç duymadığınız yerde otomatik temizlik elde edersiniz. Protokolün hareketli parçalarını hâlâ öğreniyorsanız kapsamlı MQTT eğitimi iyi bir tamamlayıcı okumadır.

ConnectMQ'da MQTT 5 Oturumlarını Kullanın

ConnectMQ; session expiry, message expiry, topic alias'lar ve reason code'lar dahil tam MQTT 5.0 desteğine sahip yönetilen bir MQTT broker'dır. Clean Start ve süre kombinasyonlarını portalın tarayıcı içi MQTT istemcisiyle veya kendi kodunuzla test edebilir, ardından aynı ayarları üretime taşıyabilirsiniz. Kredi kartı gerektirmeden ücretsiz Serverless planıyla başlayın ve oluşturulan YOUR_USERNAME, YOUR_PASSWORD ve YOUR_CLIENT_ID bilgileriyle bağlanın.

Sık Sorulan Sorular

Varsayılan MQTT session expiry interval nedir?

Özellik yoksa session expiry interval 0'dır; bu da oturumun ağ bağlantısı kapandığında sona erdiği anlamına gelir. MQTT 5'te kalıcı bir oturum elde etmek için bu değeri açıkça ayarlamanız gerekir.

Clean Start ile clean session arasındaki fark nedir?

MQTT 3.1.1'deki clean session hem eski oturumun atılmasını hem de yeni oturumun saklanmasını kontrol ediyordu. MQTT 5'teki Clean Start yalnızca bağlantı anında atmayı kontrol ederken, Session Expiry Interval oturumun sonrasında ne kadar süre yaşayacağını kontrol eder.

Maksimum session expiry interval nedir?

Protokol maksimumu 4.294.967.295 saniyedir (0xFFFFFFFF) ve bu, oturumun hiçbir zaman sona ermediği anlamına gelir. Broker'lar daha düşük sınırlar uygulayabilir ve bunları CONNACK içinde bildirebilir; ConnectMQ herkese açık test broker'ı 30 dakikaya kadar izin verir.

Bağlantıyı keserken session expiry'yi değiştirebilir miyim?

Evet; başlangıçta 0 süresiyle bağlanmadıysanız DISCONNECT içinde bir Session Expiry Interval özelliği göndererek değiştirebilirsiniz.

İ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.