Integration

MQTT-Etikettendruck: aus jeder Broker-Nachricht wird ein Etikett

In der Produktion hängt fast alles schon am MQTT-Broker: Waagen, Scanner, SPS, Sensoren. Wer daraus Etiketten machen will, baut normalerweise einen kleinen D…

In der Produktion hängt fast alles schon am MQTT-Broker: Waagen, Scanner, SPS, Sensoren. Wer daraus Etiketten machen will, baut normalerweise einen kleinen Dienst, der mitliest, ein Layout füllt und ZPL an den Drucker schickt. Genau diesen Dienst kannst du dir sparen: zplCloud abonniert das Topic selbst und druckt.

Was du brauchst

ZutatBeispiel
BrokerMosquitto, HiveMQ, EMQX, AWS IoT Core, Azure IoT Hub
Topic-Filterwerk/linie1/labels oder mit Platzhaltern werk/+/labels
ZugangBenutzer und Passwort, üblicher Port 8883 mit TLS
Zielein verbundener Zebra-Drucker oder ein virtueller Testdrucker

Abo anlegen

Unter Streaming → Abos → Neues Abo wählst du den Typ MQTT. Der Connection-String ist eine einfache Liste aus Schlüssel und Wert:

Server=broker.example.com;Port=8883;Tls=true;Username=werk1;Password=…;Qos=1

Ins Topic-Feld kommt der Topic-Filter. MQTT-Platzhalter sind erlaubt: + steht für genau eine Ebene, # für alle darunter. Ein Abo auf werk/+/labels fängt also werk/linie1/labels und werk/linie2/labels gleichzeitig ein.

Zwei Wege zum Etikett

Erstens: Daten rein, Design füllt sich. Wenn du im Abo ein Label-Design auswählst, wird jede JSON-Nachricht zu einem Datensatz. Die Schlüssel der Nachricht füllen die gebundenen Felder des Designs:

{ "sku": "88-12345", "charge": "LOT-42", "menge": 120, "mhd": "2027-03-01" }

Ein Feld im Design, das an sku gebunden ist, zeigt dann 88-12345. Nicht-JSON landet als message in einem einzigen Feld.

Zweitens: fertiges ZPL. Wenn die Nachricht selbst schon ZPL trägt, lässt du das Design im Abo leer und schickst einen Envelope:

{
  "schemaVersion": 1,
  "printer": "*",
  "zpl": "^XA^FO50,50^A0N,40,40^FDHello^FS^XZ"
}

printer nennt die Seriennummer, rp:{id} für einen Remote-Drucker oder "*" für alle Drucker des Kontos. Ist das ZPL groß, verweist du statt dessen darauf: "zplRef": { "storage": "archiv", "key": "auftraege/4711.zpl" } holt die Datei beim Druck aus S3 oder Azure Blob.

Warum nichts verloren geht

MQTT quittiert normalerweise sofort beim Empfang. zplCloud macht das anders: quittiert wird erst, wenn das ZPL am Drucker angekommen ist. Schlägt der Druck fehl, bleibt die Nachricht unquittiert, und der Broker stellt sie bei QoS 1 oder 2 erneut zu.

Deshalb lohnt sich Qos=1 im Connection-String. Mit QoS 0 gibt es vom Protokoll her keine Wiederholung: was beim Druckfehler weg ist, ist weg.

Erst testen, dann Papier

Bevor Etiketten laufen, lege dir unter Drucker → Sandbox-Drucker einen virtuellen Testdrucker an und wähle ihn im Abo aus. Er nimmt ZPL an wie ein echtes Gerät, rendert das Etikett und legt es in einen Verlauf - ohne Hardware und ohne Render-Verbrauch. So siehst du, wie deine Nachrichten wirklich aussehen, bevor die erste Rolle bedruckt wird.

Ein Abo lässt sich außerdem jederzeit über Test einmal von Hand auslösen, ganz ohne Broker-Nachricht.

Häufige Stolpersteine

  • Nichts kommt an. Prüfe den Topic-Filter. werk/linie1 fängt keine Nachrichten auf werk/linie1/labels; dafür braucht es werk/linie1/#.
  • TLS-Fehler. Port 8883 setzt Tls=true voraus; auf 1883 läuft es unverschlüsselt.
  • Doppelte Etiketten nach einem Neustart. Setze CleanSession=false und einen festen ClientId, damit der Broker die Sitzung wiedererkennt.
  • Feld bleibt leer. Die Schlüssel der Nachricht müssen zu den Bindings des Designs passen. Der Abschnitt „Protokoll" am Abo zeigt jede Nachricht im Original.