Nachrichtenaufbau
Jede Nachricht ist eine einzelne Textzeile. Sie beginnt mit einem zweistelligen Kommandocode, dahinter folgen zuerst die Felder mit fester Länge – in genau der Reihenfolge, in der das Kommando sie vorschreibt – und danach die Felder mit variabler Länge, jedes mit vorangestellter zweistelliger Feldkennung. Die Zeile endet mit einem Wagenrücklauf.
17 20260728 143012 AOBVS| AB1140360000123| XKBAR| AY3 AZF37B <CR>
│ │ │ │ │
│ │ │ │ └─ Prüfsumme
│ │ │ └───── Sequenznummer
│ │ └─────────────────────────────────── variable Felder
│ └────────────────────────────────────────────────────── feste Felder
└───────────────────────────────────────────────────────── Kommandocode
Die Leerzeichen im Schaubild dienen nur der Lesbarkeit – in der Nachricht steht alles ohne Zwischenraum hintereinander.
Verbindung#
Die Verbindung ist eine gewöhnliche TCP-Verbindung. Das Gerät baut sie auf, das Bibliothekssystem nimmt sie an; beide halten sie über die gesamte Betriebsdauer offen. Ein fester Port ist nicht vorgeschrieben und muss in beiden Systemen eingestellt werden.
Mehrere Geräte dürfen gleichzeitig angeschlossen sein, jedes mit eigener Verbindung. Alles, was eine Sitzung ausmacht – Sequenznummer, vereinbarter Zeichensatz, die für eine Wiederholung vorgehaltene letzte Nachricht – gilt je Verbindung. Ein Gerät bemerkt also nicht, was am Nachbargerät geschieht.
Bricht die Verbindung ab, baut das Gerät sie neu auf und beginnt von vorn: Alles Vereinbarte ist damit verfallen.
Verschlüsselung#
Die Verbindung kann über TLS laufen. Am Protokoll ändert das nichts: Nachrichten, Felder, Sequenznummer und Prüfsumme bleiben, wie sie sind – TLS liegt darunter, wie bei einer Webseite.
Verschlüsselt wird über einen eigenen Port. Das Bibliothekssystem kann beide Ports gleichzeitig bedienen, während eine Bücherei ihre Geräte nach und nach umstellt; ist sie fertig, schaltet sie den Klartext-Port ab.
Ausgehandelt wird nichts: Beide Seiten tragen fest ein, dass sie verschlüsselt sprechen.
Wie sich die Seiten erkennen#
Das Bibliothekssystem hält einen Schlüssel und ein zugehöriges Zertifikat. Das Zertifikat ist der öffentliche Teil; es wird einmal von Hand zum Gerät kopiert – über einen Weg, dem die Bücherei traut: USB-Stick, Netzlaufwerk, bei der Einrichtung vor Ort.
Beim Verbindungsaufbau prüft das Gerät, ob die Gegenstelle genau dieses Zertifikat vorzeigt. Nicht geprüft werden Rechnername, Ablaufdatum oder Ausstellerkette: Die Vertrauensfrage ist beim Kopieren bereits beantwortet, und jede weitere Prüfung wäre nur eine zusätzliche Stelle, an der der Betrieb eines Tages stehen bleibt.
Daraus folgen zwei Regeln:
- Der private Schlüssel verlässt das Bibliothekssystem nie. Kopiert wird ausschließlich das Zertifikat.
- Ein Gerät, das verschlüsselt sprechen soll, tut es oder gar nicht. Passt das Zertifikat nicht oder fehlt die Verschlüsselung, bricht es ab und meldet das im Klartext – ein stiller Rückfall auf eine offene Verbindung ist unzulässig.
Zeigt die Gegenstelle ein anderes Zertifikat als das kopierte, ist das kein Grund für eine Ausnahme: Entweder wurde das Bibliothekssystem neu aufgesetzt – dann gehört das Zertifikat erneut kopiert – oder es antwortet dort jemand anderes.
Zeichensatz#
Für den Textinhalt der Felder gilt Windows-1252 (siehe Anhang). Damit stehen alle Zeichen zur Verfügung, die im deutschen Bibliotheksalltag vorkommen.
Beide Seiten dürfen sich stattdessen auf UTF-8 verständigen; wie das abläuft, steht beim Systemstatus. Ohne ausdrückliche Verständigung gilt immer Windows-1252 – ein Gerät und ein Bibliothekssystem, die beide nichts von dieser Möglichkeit wissen, verstehen sich also unverändert.
Zwei Dinge ändern sich durch UTF-8 ausdrücklich nicht:
- Feste Felder bleiben ASCII. Datumsangaben,
Y/Nund Zählwerte enthalten keine Umlaute. Nur so bleiben die Feldgrenzen dort zählbar, wo sie allein über die Position gefunden werden. - Die Prüfsumme wird über Bytes gebildet, nicht über Buchstaben (siehe unten). Bei Windows-1252 ist beides dasselbe, bei UTF-8 zählt ein Umlaut als zwei Bytes.
Zwei Zeichen dürfen deshalb in keinem Feldinhalt auftreten, weil sie den Nachrichtenaufbau selbst tragen:
| Zeichen | Code | Bedeutung |
|---|---|---|
\| |
7C | trennt variable Felder |
<CR> |
0D | beendet die Nachricht |
Das Nullbyte (00) darf ebenfalls nicht vorkommen. Enthält ein Titel oder ein Meldungstext eines dieser Zeichen, ersetzt der Absender es durch ein Leerzeichen.
Feste Felder#
Feste Felder tragen keine Kennung. Sie stehen unmittelbar hinter dem Kommandocode, in fester Reihenfolge und fester Länge, und dürfen nicht weggelassen werden. Ist ein Wert kürzer als das Feld, wird er rechts mit Leerzeichen aufgefüllt.
Drei Formate kommen immer wieder vor:
Zeitstempel – 18 Zeichen, JJJJMMTTZZZZHHMMSS. Die vier Stellen ZZZZ
nehmen die Zeitzone auf; für Ortszeit bleiben sie leer. Ortszeit ist der
Regelfall.
20260728 143012 28. Juli 2026, 14:30:12 Ortszeit
Kennzeichen – 1 Zeichen, Y für ja, N für nein. Wo ein System die Frage
nicht beantworten kann, steht U für unbekannt, sofern das Kommando das zulässt.
Erfolgskennzeichen – 1 Zeichen, 1 wenn der Vorgang ausgeführt wurde, 0
wenn nicht.
Variable Felder#
Ein variables Feld besteht aus zwei Zeichen Feldkennung, dem Inhalt und dem
Trennzeichen |:
AB1140360000123|
││└─ Inhalt └─ Trennzeichen
└┴─ Feldkennung
Dafür gelten vier Regeln:
- Die Reihenfolge ist frei. Ein Empfänger darf sich nicht darauf verlassen, dass Felder in der Reihenfolge dieser Spezifikation eintreffen.
- Felder, die der Absender nicht belegen kann, lässt er ganz weg. Ein Feld mit
leerem Inhalt (
AB|) ist erlaubt, sagt aber etwas anderes aus: Der Absender kennt das Feld und hat nichts einzutragen. - Unbekannte Feldkennungen werden überlesen, nicht als Fehler behandelt. Nur so lässt sich die Schnittstelle erweitern, ohne alle Geräte zugleich zu tauschen.
- Manche Felder dürfen mehrfach vorkommen – etwa
AUfür jedes entliehene Medium. Beim jeweiligen Kommando ist vermerkt, wo das gilt.
Der Inhalt ist höchstens 255 Bytes lang – bei UTF-8 also unter Umständen weniger als 255 Buchstaben.
Sequenznummer und Prüfsumme#
Beide Angaben stehen am Ende jeder Nachricht, immer in dieser Reihenfolge, und sind die einzigen Felder ohne abschließendes Trennzeichen.
Sequenznummer AY – eine Ziffer von 0 bis 9. Das Gerät zählt sie mit jeder
neuen Anfrage um eins weiter und beginnt nach 9 wieder bei 0. Das
Bibliothekssystem übernimmt die Ziffer unverändert in seine Antwort. So erkennt
das Gerät, ob eine Antwort zur zuletzt gestellten Frage gehört oder ob es sich um
eine verspätete Antwort auf eine ältere Anfrage handelt; letztere verwirft es.
Prüfsumme AZ – vier Hexadezimalziffern. Sie wird über alle Bytes der
Nachricht gebildet, vom ersten bis einschließlich der Kennung AZ: Man addiert
die Bytewerte, nimmt die unteren 16 Bit und bildet davon das Zweierkomplement.
Byte, nicht Buchstabe: Bei Windows-1252 fällt das zusammen, bei UTF-8 geht ein Umlaut mit seinen zwei Bytes einzeln in die Summe ein. Die Prüfsumme sichert die Übertragung – und übertragen werden Bytes.
Nachricht bis "AZ": 1720260728 143012AOBVS|AB1140360000123|XKBAR|AY3AZ
Summe der Bytes: 3205
Zweierkomplement: 65536 − 3205 = 62331 = F37B
Vollständig: 1720260728 143012AOBVS|AB1140360000123|XKBAR|AY3AZF37B<CR>
Zum Prüfen addiert der Empfänger alle Bytewerte einschließlich der vier Hexadezimalziffern; die unteren 16 Bit der Summe müssen null ergeben.
Wenn etwas schiefgeht#
Stimmt die Prüfsumme einer empfangenen Nachricht nicht, verlangt der Empfänger
eine Wiederholung: Das Gerät sendet dazu 97, das Bibliothekssystem 96. Der
jeweils andere schickt daraufhin seine letzte Nachricht unverändert noch einmal –
mit derselben Sequenznummer, sodass keine Buchung doppelt ausgeführt wird. Beide
Kommandos tragen selbst keine Sequenznummer.
Bleibt eine Antwort ganz aus, wiederholt das Gerät seine Anfrage, bis die im Systemstatus genannte Zahl der Versuche erschöpft ist. Danach gilt die Verbindung als gestört; das Gerät baut sie neu auf und meldet sich erneut an.
Ein Kommandocode, den das Bibliothekssystem nicht kennt, bleibt unbeantwortet.
Welche Kommandos es beherrscht, teilt es beim
Systemstatus
im Feld BX mit – ein Gerät sollte danach fragen, statt es auf einen Versuch
ankommen zu lassen.