Veröffentlicht:
Viele günstige 4×6- und kleine Etikettendrucker sprechen TSPL und haben Bluetooth an Bord. Aus einer Web-App oder vom Smartphone darauf zu drucken funktioniert — Leute tun es aus Android-Chrome mit ein paar Dutzend Zeilen JavaScript —, aber nur, wenn Sie zuerst wissen, welches Bluetooth der Drucker spricht, und nur in Browsern, die Web Bluetooth implementieren.
Bluetooth-Low-Energy-Geräte (BLE) stellen Daten über GATT bereit: Services mit Characteristics, die man liest, schreibt oder abonniert. Ein BLE-Etikettendrucker hat typischerweise eine Characteristic, die die Druckdaten annimmt. Bluetooth-Classic-Drucker bieten meist ein Serial Port Profile (SPP): einen Bytestrom wie ein Kabel. Welches Sie haben, verraten Datenblatt oder Kopplungsverhalten; manche Drucker bieten beides.
Diese Unterscheidung entscheidet, was eine Webseite kann. Die Web Bluetooth API verbindet sich über GATT mit BLE-Geräten. Für Classic-Geräte verweist Chromes eigene Dokumentation auf die Web Serial API, die in Chrome 117 auf dem Desktop RFCOMM-Dienste wie SPP auf gekoppelten Geräten unterstützt.
Web Bluetooth ist als experimentell markiert und nicht Baseline. Es gibt
es in Chrome (Desktop und Android), Edge, Opera und Samsung Internet. Safari
unter macOS und iOS sowie Firefox unterstützen es nicht. Auf iPhone und iPad
gibt es in Safari keinen unterstützten Weg; Drittanbieter-Browser mit
eigener Bluetooth-Brücke existieren, und eine der Meldungen unten nutzte
einen, aber das ist nicht Teil von WebKit. Die API funktioniert nur über
HTTPS (sicherer Kontext), und requestDevice() muss aus einer
Nutzeraktion wie einem Tippen auf einen Button aufgerufen werden — Sie
brauchen also einen Button „Drucker verbinden".
1. Den Nutzer den Drucker wählen lassen und den verwendeten Service angeben. 2. Verbinden und eine Characteristic suchen, deren Eigenschaften Schreiben erlauben. 3. Den TSPL-Auftrag in kleinen Stücken senden.
// SERVICE_UUID: aus der Druckerdokumentation oder einer BLE-Scanner-App
const device = await navigator.bluetooth.requestDevice({
acceptAllDevices: true,
optionalServices: [SERVICE_UUID],
});
const server = await device.gatt.connect();
const service = await server.getPrimaryService(SERVICE_UUID);
const chars = await service.getCharacteristics();
const out = chars.find(
(c) => c.properties.writeWithoutResponse || c.properties.write);
const bytes = new TextEncoder().encode(tsplJob);
const CHUNK = 180;
for (let i = 0; i < bytes.length; i += CHUNK) {
const part = bytes.slice(i, i + CHUNK);
if (out.properties.writeWithoutResponse) {
await out.writeValueWithoutResponse(part);
} else {
await out.writeValueWithResponse(part);
}
}
Warum Stücke. Die Web-Bluetooth-Spezifikation weist jeden einzelnen
Schreibvorgang über 512 Byte ab, und die nutzbare Größe pro Schreibvorgang
bestimmt die ausgehandelte MTU der Verbindung — der Browser handelt sie aus,
die Seite sieht sie nicht. Ein Etikettauftrag, besonders mit
BITMAP, ist viel länger und geht deshalb in Stücken hinaus. Eine
Meldung zu einem 4×6-BLE-Drucker sendete 179-Byte-Stücke mit
writeValueWithoutResponse und 8 ms Pause verlustfrei; nehmen
Sie solche Zahlen als Startpunkt für Ihr Gerät, nicht als Konstante.
Die UUIDs gehören dem Drucker, nicht uns. Service- und
Characteristic-IDs unterscheiden sich zwischen Herstellern und sogar
Modellen — die Meldungen unten zeigen verschiedene Kurz-IDs auf
verschiedenen Druckern —, und wir listen sie hier nicht. Lesen Sie sie aus
der Herstellerdokumentation oder mit einer BLE-Scanner-App. Ein Melder
stellte fest, dass optionalServices nur mit der vollen
128-Bit-UUID funktionierte.
Ein 50 × 30 mm Etikett mit einer Textzeile und einem Code-128-Barcode für einen 203-dpi-Drucker (8 Punkte pro mm):
SIZE 50 mm, 30 mm
GAP 2 mm, 0 mm
CLS
TEXT 40,24,"3",0,1,1,"BOX 42"
BARCODE 40,80,"128",80,1,0,2,2,"12345678"
PRINT 1
SIZE und GAP beschreiben das Etikettenmaterial
in echten Einheiten, CLS leert den Bildpuffer,
TEXT und BARCODE setzen Inhalte in Punkten ab der
linken oberen Ecke, PRINT 1 druckt ein Exemplar. Dieser
Auftrag besteht den TSPL-Validator
ohne Befund und passt im TSPL-Viewer
aufs Etikett; fügen Sie Ihren eigenen Auftrag dort ein, bevor Sie ihn per
Funk senden — ein falsches SIZE oder eine Koordinate jenseits
des Rands zeigt sich am Bildschirm statt auf einem Streifen Etiketten.
Befehlsdetails stehen in der
TSPL-Befehlsreferenz, der
breitere Vorschau-Ablauf in
TSPL-Vorschau und
Fehlersuche.
Prüfen Sie, dass Sie auf die Characteristic schreiben, die Druckdaten
annimmt, nicht auf eine für Benachrichtigungen. Prüfen Sie, dass der
Auftrag mit PRINT endet. Reagieren Drucker einer Familie auch
auf eigene Taschendrucker-Befehle, gehen Sie nicht davon aus, dass TSPL
Standard ist: Eine Meldung fand, dass TSPL auf derselben Characteristic
sauber und kantenbündig druckte, während die Raster-Befehle des Herstellers
abgeschnitten herauskamen. Ein Logo, das als schwarzes Rechteck druckt, ist
ein Problem der TSPL-Bitpolarität — siehe
TSPL-BITMAP druckt einen
schwarzen Kasten. Für Zebra-Drucker und ZPL vom Smartphone sind die
Wege andere; siehe
ZPL von iPhone,
iPad oder Android drucken.
Ja, wenn der Drucker Bluetooth Low Energy nutzt und der Browser Web Bluetooth implementiert: Chrome auf Desktop und Android, Edge, Opera und Samsung Internet. Safari auf iPhone, iPad und macOS sowie Firefox unterstützen es nicht.
Nein. Web Bluetooth spricht über GATT mit BLE-Geräten. Für Classic-Drucker mit serieller Schnittstelle verweist Chrome auf die Web Serial API, die in Chrome 117 auf dem Desktop RFCOMM-Dienste wie SPP auf gekoppelten Geräten unterstützt.
Die Web-Bluetooth-Spezifikation weist einen einzelnen Schreibvorgang über 512 Byte ab, und die nutzbare Größe pro Schreibvorgang hängt von der MTU der Verbindung ab. Eine Meldung sendete 179-Byte-Stücke mit 8 ms Pause verlustfrei; passen Sie die Größe an Ihren Drucker an.
Ein USB-Etikettendrucker hat keinen Port 9100. Wie die Druckwarteschlange rohes ZPL transportiert und der Labelixa-Agent sie mit der Cloud-API verbindet.
Etikett nach einem CUPS-Update zu groß, abgeschnitten oder leerNach einem Linux-Update ist das Etikett vergrößert, abgeschnitten, leer oder der Barcode ein schwarzer Block. Ursache Treiber-Queue, Lösung Raw-Queue.
Warum wurde mein Etikett auf dem falschen Drucker gedruckt?Etiketten auf dem falschen Drucker sind kein Pech, sondern ein Identitätsproblem: Warteschlangennamen, DHCP-Leases, geteilte Treiber. Diagnose und Vorbeugung.
ZPL unter macOS und Linux über eine CUPS-Raw-Queue druckenRaw-Warteschlange in CUPS mit lpadmin einrichten, ZPL mit lp senden — und die Falle vermeiden, dass eine filternde Queue den ZPL-Code als Text druckt.