Der ADFC-Stormarn e.V. verwendet Klebeetiketten zur Codierung von Fahrrädern.
Auf diesen Etiketten ist ein EIN-Code (Eigentümer-Identifizierungs-Nummer) aufgedruckt, die es der Polizei, den Fundbüros und dem ADFC erlauben, den Eigentümer eines Fahrrads zu ermitteln. Eine über aufgeklebte Etikett angebrachte Plombierfolie schützt dieses vor dem Ablösen.
Dieses Verfahren eignet sich auch für andere Gegenstände, wie Kameras, Fahrrad-Akkus, Kinderwagen, Pferdesättel, etc.
Die Codier-Aktionen finden häufig j.w.d. statt und nicht immer gibt es dort einen verlässlichen Zugang zum Internet. Die Daten zur Generierung der EIN-Codes werden deshalb in einer lokal zur Verfügung stehenden SQLite-Datenbank abgelegt.
Diese Seite beschreibt wie das Drucken von Klebeetiketten mit einem per Bluetooth gekoppelten Drucker implementiert ist.
Inhaltsverzeichnis
Mit einem Smartphone können mehrere Drucker gekoppelt sein. In diesem Fall muss der Anwender entscheiden, welcher dieser Drucker benutzt werden soll. Eine Automatik, die prüft, ob ein Drucker per BT erreichbar ist, ist leider nicht möglich, da die letztendlich verwendete der BluetoothClient-Komponente des App Inventors eine solche Funktion nicht unterstützt.
Die Funktionalitäten zum Drucken werden von der Extension UrsPte560 bereit gestellt. Dies ist ein Wrapper um die BluetoothClient-Komponente mit erweiterten und angepassten Funktionen. U.a. wird auch ein ausgewählter Drucker in dieser Komponente statisch abgelegt, d.h. ein einmal ausgewählter Drucker ist auf allen anderen Screens (Activity) verfügbar, die diese Extension benutzen.
Die Zahl der täglich erstellten Etiketten wird in einer TinyDB-Komponente unter dem aktuellen Tagesdatum abgelegt.
Zur Erleichterung der Identifizierung der Drucker, sind diese mit einem Aufkleber mit dem Bluetooth-Namen des Druckers versehen:
Zur Auswahl eines Druckers und zur Anzeige des ausgewählten Druckers wird eine ListPicker-Komponente (pickPrinter) verwendet. Bei der Initialisierung einer Screen-Komponente, wird überprüft, ob schon ein Drucker ausgewählt wurde. Dies wird dem Anwender in der ListPicker-Schaltfläche angezeigt (Eigenschaft Text).
Die Überprüfung erfolgt beim Ereignis Screen.Initialize einer Screen-Komponente und beim Ereignis Screen.OtherScreenClosed.
Der zu benutzende Drucker kann jederzeit erneut festgelegt werden. Dazu muss der Anwender die Schaltfläche der ListPicker-Komponente antippen. Daraufhin wird die Liste der Namen der gekoppelten Drucker in die ListPicker-Komponente übertragen und angezeigt:
Nach der Auswahl wird der Name verteilt:
Ist zum Zeitpunkt des Druckens eines Etiketts noch kein Drucker ausgewählt, wird ebenfalls die ListPicker-Komponente zur Druckerauswahl aufgerufen.
Das Drucken wird über die Schaltfläche cmdPrint ausgelöst. Das eigentliche Drucken kann nicht direkt ausgelöst, da der Aufruf von UrsPte560.Print die Anwendung blockiert. Die Anpassung der anderen Elemente erfolgt über die MessageQueue. Die ist aber während des Druckens blockiert. Deshalb erfolgt der eigentliche Druck um 100 ms verzögert. Dies reich, um die anderen Komponenten zu aktualisieren. Der Aufruf von UrsAI2Utils.FireDelayedEvent löst das Ereignis UrsAI2Utils.DelayedEvent nach der angegebenen Zeit aus.
Der Start des Drucks erfolgt um 100 ms verzögert. Im Fehlerfall, müssen die benutzten Komponenten wieder zurück gesetzt werden.
Falls der Druck erfolgreich war, wird der Etikettenzähler erhöht (s.u.). Auf jeden Fall werden die benutzten Komponenten wieder zurück gesetzt. UrsPte560.AfterDataPrinted wird etwa zwei Sekunden (Einstellung über UrsPte560.AfterDataPrintedDelay) nach dem Start des Drucks ausgelöst. Dies reicht i.d.R. für die Übertragung der Daten an den Drucker. Danach kann die Verbindung zum Drucker für andere Clients frei gegeben werden.
Die Zahl der täglich erstellten Etiketten wird in einer TinyDB-Komponente unter dem aktuellen Tagesdatum abgelegt. Beim Initialisieren einer Screen-Komponente wird der DB-Schlüssel xxx ermittelt und die Datenbank abgerufen:
Nach jedem erfolgreichen Druck wird der Zähler erhöht:
Bei der Initialisierung von Screen1 wird die Datenbank für den Etikettenzähler aufgeräumt. Der aktuelle Zähler wird ausgelesen, die Datenbank gelöscht und anschließend neu beschrieben.
Wenn ein anderer Screen geschlossen wird, muss die evtl. neue Etikettenanzahl angezeigt werden: