MQTT-Grundlagen

MQTT Topic Alias: Bandbreite sparen bei langen Topic-Namen

Topic Aliases in MQTT 5 ersetzen lange Topic-Namen nach dem ersten Publish durch eine Zwei-Byte-Zahl. Erfahren Sie, wie die Aushandlung funktioniert, wie viele Bytes Sie tatsächlich sparen und wie Sie Aliases in MQTT.js sicher einsetzen.

Diagramm, in dem ein langer Topic-Name durch eine kurze Zahl ersetzt wird, um die Funktion MQTT Topic Alias zu veranschaulichen
Probieren Sie es auf Ihrem eigenen MQTT-Broker ausHolen Sie sich im Free-Tarif einen privaten, verwalteten MQTT-Broker und starten Sie mit fertigen Codebeispielen.
Kostenlos testen Codebeispiele Keine Kreditkarte erforderlich

Mit einem MQTT Topic Alias sendet ein Client einen langen Topic-Namen einmal und verweist für den Rest der Verbindung mit einer Zwei-Byte-Ganzzahl darauf. Auf schmalbandigen Verbindungen wie Mobilfunk, LoRa-Backhaul oder Satellit lässt sich die Größe kleiner Telemetriepakete damit um mehr als die Hälfte reduzieren. Dieser Leitfaden erklärt, wie das Topic Alias Maximum ausgehandelt wird, wie Sie Ihre Ersparnis berechnen und wie Sie Aliases im Code korrekt verwenden.

Was ein MQTT Topic Alias ist

Topic Aliases gehören zu den Funktionen von MQTT 5, die auf Effizienz abzielen. In MQTT 3.1.1 trägt jedes PUBLISH-Paket den vollständigen Topic-Namen als UTF-8-String mit einem zwei Byte langen Längenpräfix. Gut strukturierte Topic-Bäume, etwa Pfade im ISA-95-Stil, sind aussagekräftig, aber lang. Ein Pfad wie connectmq/factory1/production/line1/cnc1/telemetry hat 50 Zeichen, und wenn Ihr Payload eine 20-Byte-Zahl mit Zeitstempel ist, ist das Topic mehr als doppelt so groß wie die Daten.

Genau solche Pfade entstehen in einem Unified Namespace (UNS): Die ISA-95-Ausrüstungshierarchie (Enterprise → Site → Area → Line → Cell) wird dort zur Topic-Struktur auf dem MQTT-Broker, etwa acme/werk-stuttgart/montage/linie-1/zelle-3/temperatur. Jede Ebene macht den Namespace für MES, SCADA und Analytics lesbar, verlängert aber auch jedes Topic. Wie ein UNS aufgebaut ist, erklärt der Leitfaden zu Sparkplug B und Unified Namespace; Topic Aliases sorgen dafür, dass diese Lesbarkeit auf schmalen Verbindungen nicht zu viel Bandbreite kostet.

In MQTT 5 kann der Sender einem PUBLISH die Property Topic Alias (Kennung 0x23, eine Zwei-Byte-Ganzzahl) hinzufügen. Beim ersten Mal enthält das Paket sowohl den vollständigen Topic-Namen als auch den Alias, und der Empfänger speichert die Zuordnung. Nachfolgende PUBLISH-Pakete können einen Topic-Namen der Länge null plus den Alias enthalten, und der Empfänger setzt das gespeicherte Topic ein.

Drei Regeln definieren die Funktion:

  1. Aliases gelten pro Verbindung und pro Richtung. Die Zuordnung vom Client zum Broker und die vom Broker zum Client sind unabhängig. Aliases sind nicht Teil des Session-Zustands und gehen beim Trennen verloren, auch wenn die Session bestehen bleibt.
  2. Jede Seite legt eine Obergrenze fest. Der Empfänger teilt mit der Property Topic Alias Maximum (0x22) mit, wie viele Aliases er akzeptiert. Der Wert 0 oder eine fehlende Property bedeutet, dass in dieser Richtung keine Aliases akzeptiert werden.
  3. Zuordnungen lassen sich ersetzen. Ein PUBLISH mit einer bereits vergebenen Alias-Nummer und einem nicht leeren Topic-Namen bindet diesen Alias an das neue Topic.

Wie die Aushandlung des Topic Alias Maximum funktioniert

Die Aushandlung erfolgt in den Paketen CONNECT und CONNACK:

Paket Property Bedeutung
CONNECT (Client zum Broker) Topic Alias Maximum Höchster Alias, den der Broker beim Senden von PUBLISH an diesen Client verwenden darf
CONNACK (Broker zum Client) Topic Alias Maximum Höchster Alias, den der Client beim Senden von PUBLISH an den Broker verwenden darf
PUBLISH (beide Richtungen) Topic Alias Die Alias-Nummer, von 1 bis zum Maximum des Empfängers

Steht im CONNACK des Brokers also 10, darf Ihr Client bei ausgehenden Publishes die Aliases 1 bis 10 verwenden. Steht in Ihrem CONNECT 0 oder fehlt die Property, sendet der Broker Ihnen immer vollständige Topic-Namen. Alias 0 ist nie gültig.

Verletzt ein Sender diese Grenzen, etwa durch Alias 11 bei einem Maximum von 10 oder durch einen leeren Topic-Namen mit einem nie definierten Alias, schließt der Empfänger die Verbindung mit Reason Code 0x94 Topic Alias invalid. Die Referenz der MQTT Reason Codes listet diesen Code zusammen mit den anderen, denen Sie beim Debugging wahrscheinlich begegnen.

Die Bandbreitenersparnis berechnen

Für eine Abschätzung der Ersparnis brauchen Sie kein Labor; der Paketaufbau ist fest vorgegeben. Nehmen Sie ein QoS-0-Publish in MQTT 5 mit dem obigen Topic aus 50 Zeichen und einem Payload von 20 Byte:

Feld Vollständiges Topic Erstes Publish mit Alias Spätere Publishes mit Alias
Fixed Header (Typ + Remaining Length) 2 2 2
Topic-Name (2-Byte-Länge + String) 52 52 2
Properties-Länge 1 1 1
Property Topic Alias (ID + Wert) 0 3 3
Payload 20 20 20
MQTT-Bytes gesamt 75 78 28

Nach der ersten Nachricht ist jedes Publish 47 Byte kleiner, eine Reduktion um etwa 63 Prozent auf MQTT-Ebene. Das erste Publish kostet 3 zusätzliche Bytes, die sich bereits mit der zweiten Nachricht amortisieren.

Behalten Sie das Gesamtbild im Blick. TCP- und IP-Header fügen pro Segment rund 40 Byte hinzu, TLS kommt mit Record-Overhead obendrauf. Auf einer Verbindung, über die Sie eine Nachricht pro Minute senden, dominieren diese Transportkosten und der Keep-Alive-Verkehr, und Topic Aliases verändern die Rechnung kaum. Auf einer Verbindung mit vielen kleinen Nachrichten pro Sekunde oder mit mehreren Nachrichten pro TCP-Segment macht der Topic-Name dagegen einen großen Teil jedes Bytes aus, und Aliases zahlen sich aus. Der Leitfaden zur MQTT-Bandbreitennutzung führt die vollständige Berechnung pro Nachricht einschließlich TLS vor.

Mit Wireshark können Sie die Zahlen überprüfen: Zeichnen Sie auf Port 1883 auf, wenden Sie den Anzeigefilter mqtt an und vergleichen Sie die Felder Topic Length und Msg Len des ersten und zweiten PUBLISH Ihres Clients.

Topic Aliases mit MQTT.js verwenden

MQTT.js unterstützt Aliases sowohl manuell als auch automatisch. Hier der manuelle Ansatz gegen den öffentlichen MQTT-Broker, der die Mechanik sichtbar macht:

const mqtt = require("mqtt");

const TOPIC = "connectmq/demo/9c1e/factory1/production/line1/cnc1/telemetry";

const client = mqtt.connect("mqtts://broker.connectmq.com:8883", {
  clientId: "alias-demo-9c1e",
  protocolVersion: 5,
  properties: {
    topicAliasMaximum: 10, // wir akzeptieren bis zu 10 Aliases vom Broker
  },
});

client.on("connect", (connack) => {
  const brokerMax = connack.properties?.topicAliasMaximum ?? 0;
  console.log("Broker accepts topic aliases up to:", brokerMax);

  if (brokerMax < 1) {
    console.log("Aliases not available, publishing with full topic names");
  }

  let count = 0;
  const timer = setInterval(() => {
    const payload = JSON.stringify({ t: Date.now(), rpm: 1200 + count });

    if (brokerMax < 1) {
      client.publish(TOPIC, payload);
    } else if (count === 0) {
      // Erstes Publish: vollständiger Topic-Name + Alias legt die Zuordnung fest
      client.publish(TOPIC, payload, { properties: { topicAlias: 1 } });
    } else {
      // Spätere Publishes: leerer Topic-Name, nur Alias
      client.publish("", payload, { properties: { topicAlias: 1 } });
    }

    if (++count === 5) {
      clearInterval(timer);
      client.end();
    }
  }, 1000);
});

client.on("error", (err) => console.error("MQTT error:", err.message));

Abonnieren Sie in einem anderen Terminal, um zu bestätigen, dass der Broker den Alias aufgelöst hat und Subscribern das vollständige Topic zustellt:

mosquitto_sub -h broker.connectmq.com -p 1883 -i alias-watch-9c1e \
  -t "connectmq/demo/9c1e/#" -v -V mqttv5

Automatische Alias-Vergabe

Für echte Anwendungen überlassen Sie die Zuordnung der Bibliothek:

const client = mqtt.connect("mqtts://broker.connectmq.com:8883", {
  clientId: "alias-auto-9c1e",
  protocolVersion: 5,
  autoAssignTopicAlias: true, // neuen Topics automatisch Aliases zuweisen
  autoUseTopicAlias: true,    // vorhandenen Alias wiederverwenden, wenn sich das Topic wiederholt
});

Mit diesen Optionen verfolgt MQTT.js, welche Topics bereits Aliases haben, hält sich an das vom Broker angekündigte Maximum und fällt auf vollständige Topic-Namen zurück, wenn keine Aliases mehr frei sind. In Ihrem Code veröffentlichen Sie weiterhin mit normalen Topic-Strings.

Fallstricke und Best Practices

Topic Aliases sind einfach, doch einige Fehler verursachen den Großteil der Probleme:

  • Aliases nach einem Reconnect wiederverwenden. Zuordnungen verschwinden, wenn die TCP-Verbindung geschlossen wird. Code, der sich über Reconnects hinweg merkt „Alias 1 ist mein Telemetrie-Topic“, sendet einen undefinierten Alias und wird mit 0x94 getrennt. Senden Sie bei jeder neuen Verbindung zuerst wieder das vollständige Topic.
  • Den CONNACK-Wert ignorieren. Codieren Sie nie ein Maximum fest. Lesen Sie es jedes Mal aus dem CONNACK, da es sich zwischen Brokern, Plänen und Versionen unterscheiden kann.
  • Selten genutzte Topics mit Alias versehen. Aliases helfen bei Topics, auf die Sie häufig veröffentlichen. Einen Alias-Platz für ein Topic zu verbrauchen, das Sie einmal am Tag nutzen, bringt nichts.
  • Zwischenstationen, die Pakete umschreiben. Ein leerer Topic-Name ergibt nur zusammen mit seiner Alias-Property Sinn. Gateways oder Protokollübersetzer, die MQTT-5-Properties verwerfen, können das zerstören. Testen Sie daher den gesamten Netzwerkpfad.
  • Ersparnis bei QoS-lastigen Datenflüssen erwarten. QoS 1 und 2 fügen Bestätigungspakete hinzu, die Aliases nicht verkleinern.

Eine kurze Checkliste, bevor Sie Aliases für eine Flotte aktivieren:

  1. Prüfen Sie, ob die Client-Bibliothek MQTT 5 und Topic Aliases unterstützt.
  2. Protokollieren Sie beim Verbindungsaufbau das Topic Alias Maximum des Brokers.
  3. Setzen Sie die Alias-Tabellen in Ihrem Reconnect-Handler zurück.
  4. Zeichnen Sie einige Pakete auf, um die erwartete Byte-Ersparnis zu verifizieren.
  5. Achten Sie nach dem Rollout in den Logs auf Trennungen mit 0x94.

Topic Aliases bei ConnectMQ

ConnectMQ unterstützt MQTT 5.0 auf jedem Endpunkt, einschließlich Topic Aliases, zusammen mit Session Expiry, Message Expiry und Shared Subscriptions. So können Sie aussagekräftige Topic-Namen im ISA-95-Stil, wie sie ein UNS vorgibt, zugunsten der Lesbarkeit beibehalten und dennoch kompakte Pakete von ressourcenarmen Geräten senden. Das MQTT-Tutorial ist ein guter Ausgangspunkt, wenn Sie Ihre Topic-Struktur noch entwerfen, und der Leitfaden zu Topic-Namenskonventionen hilft, diese Namen konsistent zu halten.

Topic Aliases bei ConnectMQ ausprobieren

Experimentieren Sie zuerst auf dem kostenlosen öffentlichen MQTT-Broker, der für Tests und nicht für Produktionsdaten gedacht ist, und wechseln Sie dann zu einem privaten verwalteten MQTT-Broker mit TLS und eigenen Zugangsdaten, sobald Sie für echte Geräte bereit sind. Registrieren Sie sich unter app.connectmq.com, um ohne Kreditkarte einen kostenlosen Serverless-Broker zu erstellen, oder lesen Sie zuerst den Leitfaden zur Wahl eines Cloud-MQTT-Brokers.

Häufig gestellte Fragen

Gibt es den MQTT Topic Alias in MQTT 3.1.1?

Nein. Topic Aliases wurden mit MQTT 5.0 eingeführt und werden als PUBLISH-Property übertragen, die es in 3.1.1 nicht gibt. Sowohl Client als auch Broker müssen MQTT 5 verwenden.

Überstehen Topic Aliases einen Reconnect?

Nein. Aliases gehören zur Netzwerkverbindung, nicht zur Session. Nach jedem Reconnect muss der Sender zuerst wieder den vollständigen Topic-Namen veröffentlichen, bevor er den Alias verwendet.

Was bedeutet Reason Code 0x94?

Er bedeutet Topic Alias invalid: Der Sender hat Alias 0 verwendet, einen Alias oberhalb des Topic Alias Maximum des Empfängers oder einen leeren Topic-Namen, bevor die Zuordnung definiert war. Korrigieren Sie die Alias-Verarbeitung und verbinden Sie sich neu.

Sehen Subscriber den Alias oder das vollständige Topic?

Subscriber sehen das vollständige Topic. Der Broker löst den Alias auf der eingehenden Seite auf, und ein Alias auf der ausgehenden Seite wird mit jedem Subscriber separat ausgehandelt.

Verwandte Artikel

Wer hat MQTT erfunden? Die Geschichte von Ölpipelines bis zum IoT

MQTT wurde 1999 von Andy Stanford-Clark (IBM) und Arlen Nipper (Arcom) erfunden, um Ölpipelines per Satellit zu überwachen. Verfolgen Sie den Weg zu Open Source, OASIS, ISO und den heutigen verwalteten MQTT-Brokern in der Cloud.

8 Min. Lesezeit

Alle Artikel →

Ihr privater MQTT-Broker ist nur wenige Klicks entfernt

Konto anlegen, Broker-Zugangsdaten erhalten und das erste Gerät verbinden — ohne Server, die installiert, gepatcht oder skaliert werden müssen.