MQTT Temelleri

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.

mqtt mesaj boyutu sınırını göstermek için broker kapısında engellenen aşırı büyük payload
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

Spesifikasyondaki MQTT mesaj boyutu sınırı paket başına yaklaşık 256 MB'tır; ancak asıl önemli olan sınır broker'ınızın, istemci kütüphanenizin ve cihazınızın belleğinin belirlediği sınırdır ve bu genellikle çok daha düşüktür. Bu rehber, bu sınırların her birini, bir mesaj çok büyük olduğunda ne olduğunu ve görüntü, log veya firmware gibi büyük payload'ları MQTT bağlantılarınızı bozmadan taşımak için üç stratejiyi açıklıyor.

Protokol Tavanı: 256 MB

MQTT, her paketin değişken başlığının ve payload'ının uzunluğunu, her biri yedi kullanılabilir bite sahip en fazla dört baytlık bir "remaining length" alanında kodlar. Bu alana sığabilecek en büyük değer 268.435.455 bayttır, yani kabaca 256 MB. Topic adını ve başlıkları çıkardığınızda teorik maksimum payload'a ulaşırsınız. Bu kodlama, MQTT paket yapısı rehberinde bayt bayt açıklanıyor.

Hiç kimse üretim sistemlerini bu tavana yakın çalıştırmaz. Herhangi bir istemciden 256 MB'lık mesajları kabul eden bir broker kolayca tüketilebilir: paketi tamponlaması, çevrimdışı oturumlar için veya retained değer olarak saklaması ve her subscriber'a kopyalaması gerekir. MQTT çok sayıda küçük mesaj için tasarlanmıştır ve gerçek bir kurulumun her katmanı bunu yansıtır.

Gerçek Sınırlar Nerede?

Katman Tipik sınır Belirleyen
MQTT spesifikasyonu Paket başına 268.435.455 bayt Remaining length kodlaması
Broker Yapılandırılmış maksimum mesaj veya paket boyutu Broker yapılandırması veya plan
MQTT 5 müzakeresi Maximum Packet Size özelliği İstemci ve broker kabul ettikleri boyutu ayrı ayrı bildirir
İstemci kütüphanesi Dahili tampon boyutu Kütüphane varsayılanları, ör. Arduino PubSubClient'ta 256 bayt
Cihaz Boş RAM Bir mikrodenetleyicide yalnızca onlarca KB kullanılabilir olabilir
Ağ Aktarım hızı ve kararlılık Büyük mesajlar zayıf bağlantılarda daha uzun sürer ve daha sık başarısız olur

Zincirdeki en küçük sınır geçerlidir. Bir ESP8266 subscriber'ı yalnızca birkaç kilobaytı tamponlayabiliyorsa, broker'ın 1 MB kabul etmesinin bir önemi yoktur. Arduino sınıfı donanımla çalışıyorsanız PubSubClient tampon boyutu rehberi bu özel tuzağı ele alıyor.

ConnectMQ'da MQTT Mesaj Boyutu Sınırları

Broker türüne göre güncel sınırlar şunlardır:

Broker Maksimum mesaj boyutu
Herkese açık test broker'ı (broker.connectmq.com) 64 KB
Serverless (Free) planı 256 KB
Serverless (Paid) planı 1 MB
Dedicated, BYOC ve Self Managed Enterprise Kuruluma bağlıdır

Çoğu telemetri, alarm ve komut için 64 KB bile fazlasıyla yeterlidir: bir JSON sensör ölçümü genellikle 1 KB'ın çok altındadır. Bu sınırlara düzenli olarak yaklaşıyorsanız bu, genellikle payload'ın aşağıda açıklandığı gibi başka bir yere ait olduğunun işaretidir.

MQTT 5 Maximum Packet Size

MQTT 5, Maximum Packet Size özelliğiyle (0x27) boyut sınırlarını açık hale getirdi:

  • CONNECT içinde istemci, almaya hazır olduğu en büyük paketi broker'a bildirir. Broker bundan büyük bir şey göndermemelidir; bunun yerine bu tür mesajları o istemci için atar.
  • CONNACK içinde broker, kabul ettiği en büyük paketi istemciye bildirir. Daha büyüğünü gönderen bir istemci protokolü ihlal eder.

Bunun yalnızca payload'ın değil, sabit başlık, topic ve özellikler dahil tüm paketin boyutu olduğunu unutmayın. Biraz pay bırakın.

MQTT.js'te broker'ın sınırını okumak:

const mqtt = require("mqtt");

const client = mqtt.connect("mqtts://broker.connectmq.com:8883", {
  clientId: "size-check-8b4d",
  protocolVersion: 5,
  properties: { maximumPacketSize: 64 * 1024 }, // bu istemcinin kabul ettiği boyut
});

client.on("connect", (connack) => {
  const max = connack.properties?.maximumPacketSize;
  console.log("Broker maximum packet size:", max ?? "not announced");
  client.end();
});

Özellik yoksa broker CONNACK'te bir sınır bildirmemiştir, ancak yine de bir sınır uyguluyor olabilir. Broker'ınızın belgelenmiş sınırını her zaman bilin.

Bir Mesaj Çok Büyük Olduğunda Ne Olur?

Davranış, protokol sürümüne ve yöne bağlıdır:

  1. İstemciden broker'a, MQTT 5. Broker genellikle istemcinin bağlantısını 0x95 Packet too large reason code'u ile keser.
  2. İstemciden broker'a, MQTT 3.1.1. Reason code yoktur; broker bağlantıyı kapatır. İstemci genel bir bağlantı kaybı görür.
  3. Broker'dan istemciye. Bir subscriber daha küçük bir Maximum Packet Size bildirdiyse broker mesajı o subscriber için atar. 3.1.1'de subscriber'ın kütüphanesi mesajı ayrıştıramayabilir veya bağlantıyı kesebilir.
  4. İstemcinin içinde. Bazı kütüphaneler göndermeyi reddeder ve hata döndürür; Arduino PubSubClient ise publish() çağrısından yalnızca false döndürür.

Tehlikeli senaryo, aşırı büyük mesajı kuyruğa alan, yeniden bağlanan ve hemen tekrar deneyen bir istemcidir. Sonuç bir bağlantı kopma döngüsüdür; bu, MQTT istemcisinin sürekli bağlantısının kopmasının klasik nedenlerinden biridir. Publish etmeden önce boyutu doğrulayın ve çok büyük mesajları atın veya başka bir yola yönlendirin.

Büyük Payload'lar için Stratejiler

1. Payload'ı Küçültün

Herhangi bir şeyi bölmeden önce küçültün. JSON'daki alan adları her mesajda tekrarlanır; kısa anahtarlar, CBOR veya Protobuf gibi ikili kodlamalar ve gzip sıkıştırması payload'ları çoğu zaman ciddi ölçüde küçültür. Tüm durum yerine yalnızca değişen değerleri göndermek de yardımcı olur. MQTT payload formatı rehberi bu seçenekleri karşılaştırıyor.

2. Mesajı Parçalara Bölün

Bir payload orta büyüklükteyse, örneğin birkaç yüz kilobaytlık log verisiyse, onu numaralandırılmış parçalara bölüp alıcı tarafta yeniden birleştirebilirsiniz. Bu Python publisher'ı bir dosyayı, her parça için küçük bir JSON başlığıyla 32 KB'lık parçalara böler:

import base64, hashlib, json, math, time, uuid
import paho.mqtt.client as mqtt

CHUNK = 32 * 1024
TOPIC = "connectmq/demo/8b4d/files"

def send_file(client, path):
    data = open(path, "rb").read()
    transfer_id = uuid.uuid4().hex[:8]
    total = math.ceil(len(data) / CHUNK)
    sha = hashlib.sha256(data).hexdigest()
    for i in range(total):
        part = data[i * CHUNK:(i + 1) * CHUNK]
        msg = {"id": transfer_id, "seq": i, "total": total, "sha256": sha,
               "data": base64.b64encode(part).decode()}
        client.publish(f"{TOPIC}/{transfer_id}", json.dumps(msg), qos=1).wait_for_publish()
        time.sleep(0.15)  # istemci başına hız sınırlarına uyun

client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id="chunker-8b4d")
client.connect("broker.connectmq.com", 1883, keepalive=60)
client.loop_start()
send_file(client, "report.csv")
client.loop_stop()
client.disconnect()

Base64 boyutu yaklaşık üçte bir oranında artırır; bu nedenle 32 KB'lık ikili veri ağ üzerinde kabaca 43 KB olur ve herkese açık broker'ın 64 KB sınırının rahatça altında kalır. Subscriber parçaları id değerine göre toplar, seq değerine göre sıralar ve total sayısındaki tüm parçalar geldiğinde SHA-256 değerini doğrular. Parçaların sessizce kaybolmaması için QoS 1 kullanın ve tekrarlanan veya eksik parçalar için bir zaman aşımıyla tasarım yapın. Herkese açık broker'da saniyede 10 mesaj sınırını aklınızda tutun; koddaki sleep bunu sağlar.

Parçalama karmaşıklık ekler; bu yüzden onu tek bir mesaja sığmayacak kadar büyük, ancak MQTT'nin hâlâ doğru taşıma yöntemi olacağı kadar küçük payload'lar için saklayın.

3. Dosyayı Bant Dışında Gönderin

Görüntüler, video, firmware imajları ve büyük dışa aktarımlar için en sağlam yöntem, baytları MQTT'nin tamamen dışında tutmaktır. Dosyayı HTTPS üzerinden nesne depolamaya veya bir web sunucusuna yükleyin, ardından ona işaret eden küçük bir MQTT mesajı publish edin:

{
  "type": "firmware",
  "version": "2.4.1",
  "url": "https://files.example.com/fw/sensor-2.4.1.bin",
  "sha256": "9f2c...e81a",
  "size": 1048576
}

Cihazlar dosyayı HTTP range istekleri ve kaldığı yerden devam desteğiyle indirir, hash'i doğrular ve ilerlemeyi MQTT üzerinden geri bildirir. Böylece MQTT'nin güçlü yanlarını, yani anlık bildirimi ve çok sayıda cihaza dağıtımı korurken toplu aktarımı HTTP ve depolama servisleri üstlenir.

Boyut Kararı Kontrol Listesi

  1. 10 KB altı: tek mesaj olarak gönderin, özel bir işlem gerekmez.
  2. 10 KB ile broker'ınızın sınırı arası: sıkıştırın veya kompakt bir kodlama kullanın ve her subscriber'ın bunu tamponlayabildiğini doğrulayın.
  3. Sınırın üzerinde ama yalnızca ara sıra: sıra numaraları ve sağlama toplamlarıyla parçalara bölün.
  4. Büyük ikili dosyalar veya düzenli toplu aktarımlar: bant dışında yükleyin ve bir referans publish edin.
  5. Her durumda: publish çağırmadan önce boyutu kodda kontrol edin.

ConnectMQ ile Mesaj Gönderin

ConnectMQ, ücretsiz Serverless planında 256 KB'lık mesajlardan ücretli Serverless planında 1 MB'a kadar açık, plana dayalı sınırlar sunar; daha büyük kurulumlar için Dedicated, BYOC ve Self Managed Enterprise seçenekleri de mevcuttur. Önce ücretsiz herkese açık MQTT broker üzerinde deneme yapın, ardından özel kimlik bilgilerine ve daha yüksek sınırlara ihtiyaç duyduğunuzda tamamen yönetilen bir MQTT servisine geçin. Yeni başlıyorsanız MQTT eğitimi temelleri ele alıyor.

ConnectMQ ile Başlayın

app.connectmq.com adresinde kredi kartı gerektirmeden ücretsiz bir Serverless broker oluşturun ve dakikalar içinde kullanıcı adı, parola ve client ID edinin. Barındırma seçeneklerini karşılaştırmak için bulut MQTT broker seçme rehberimizi okuyun.

Sık Sorulan Sorular

Maksimum MQTT mesaj boyutu nedir?

Protokol 268.435.455 bayta, yani yaklaşık 256 MB'a kadar paketlere izin verir. Pratikte broker'lar çok daha düşük sınırlar belirler; ConnectMQ'da bu sınır herkese açık broker'da 64 KB, ücretsiz planda 256 KB ve ücretli Serverless planında 1 MB'tır.

Çok büyük bir mesaj publish edersem ne olur?

Broker mesajı reddeder ve genellikle bağlantıyı kapatır. MQTT 5 istemcileri 0x95 Packet too large reason code'unu alırken MQTT 3.1.1 istemcileri yalnızca bağlantının koptuğunu görür.

MQTT üzerinden dosya göndermeli miyim?

Küçük dosyalar doğrudan veya parçalar halinde gönderilebilir. Büyük dosyaları HTTPS üzerinden depolamaya yükleyin ve URL ile sağlama toplamını içeren küçük bir MQTT mesajı publish edin.

Boyut sınırına topic adı dahil midir?

Broker sınırları genellikle mesaj başına veya paket başına ifade edilir ve MQTT 5 Maximum Packet Size, topic ve özellikler dahil tüm paketi sayar. Payload boyutunuzun üzerinde pay bırakın.

İ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 vs CoAP: TCP Üzerinde Pub/Sub ve UDP Üzerinde İstek/Yanıt

MQTT ve CoAP'nin ikisi de kısıtlı IoT cihazlarını hedefler ama zıt yaklaşımlar benimser: TCP üzerinde broker tabanlı pub/sub ve UDP üzerinde RESTful istek/yanıt. İşte nasıl karşılaştırıldıkları ve hangisinin ne zaman kullanılacağı.

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