Jeden Tag sehen wir in Geschäften verschiedene Kassen - alle Arten von eingebetteten Lösungen mit mysteriösen Tasten. Hinter solchen Kassen stehen Kassierer, die "Galya, wir haben abgesagt" rufen. Dies ist sowohl für Kassierer als auch für Käufer unpraktisch.
Die Checkout-Oberfläche wird mit der Zeit benutzerfreundlicher, und Gali wird bereits weniger benötigt, aber das Auschecken ist immer noch ein umständliches und komplexes Artefakt.

Mein Name ist Vladimir Sarbeev, ich bin ein Android-Entwickler in MySklad. Und ich bin mir sicher, dass die Registrierkasse kompakt und bequem sein kann. Darüber hinaus können Sie Ihr Smartphone in eine Kasse verwandeln.
In MyStore haben wir die mobile Anwendung Kassa MyStore erstellt. Dies ist eine vollständige Abendkasse im Smartphone.
Das funktioniert so: Nach der Autorisierung kann der Kassierer Schichten öffnen und schließen, Waren direkt oder nach Voranmeldung verkaufen, Bargeld berücksichtigen. Sie können Geräte, die für die Arbeit erforderlich sind, an die Kasse anschließen. Sie sind auf dem Foto:

1 - Abendkasse Atol Sigma 10; 2 - Die Anwendung wird nicht unterstützt, Integration mit Mitarbeitern
3 - Fahrkartenschalter Atol 11F; 4 - Terminal Verifone VX820; 5 - Anschluss PAX S90
6 - Abendkasse Shtrikh-Nano-F; 7 - Fahrkartenschalter Atol 15F; 8 - Abendkasse Bar-ON-LINE
9 - Barcode-Scanner; 10 - PayMe-Terminal; 11 - Kasse MSPOS-K
Das Smartphone selbst kann keine Quittungen ausdrucken und Zahlungen mit Kreditkarte akzeptieren. Daher werden Kassen und Zahlungsterminals benötigt. Ein Hardware-Scanner ist erforderlich, wenn die Kamera des Smartphones nicht für einen vollständigen Austausch des Barcode-Scanners geeignet ist.
Allsehendes Auge
Noch vor der Veröffentlichung von Cash Desk MySklad haben wir entschieden, dass es sich bei der Kamera um eine Kamera handelt, der Benutzer verfügt jedoch möglicherweise über einen Hardware-Barcode-Scanner, den er verwenden möchte.
Wir können mit Scannern in Form eines gewöhnlichen HID (Human Interface Device) arbeiten. Nach dem Lesen des Barcodes erhalten wir eine Folge von Zeichen vom Scanner. Dies ist vielleicht die einfachste Integration. Das einfachste, wenn nicht zwei "Aber".
Erstens überträgt ein Scanner möglicherweise nicht das, was er sollte, wenn er „out of the box“ ist. Zweitens signalisieren uns nicht alle Scannermodelle, dass das Lesen des Barcodes abgeschlossen ist.
Das erste „aber“ wird einfach gelöst: Wenn der Scanner nicht überträgt, was er scannen soll, müssen Sie die Anweisungen für den Scanner finden und mithilfe der Service-Barcodes konfigurieren. In der Regel sind die Anweisungen auf Papier oder in elektronischer Form vom Hersteller vollständig. Nach der Beschreibung der verfügbaren Einstellungen enthält es Barcodes, die in der gewünschten Reihenfolge scannen. So können Sie den Scanner nach Bedarf konfigurieren.
Das zweite "aber" ist ein ernsthafteres Problem. Der Zoo der Scanner ist umfangreich und nicht alle Geräte zeigen das Ende einer Lesezeile an. Es gibt zwei Möglichkeiten, um dieses Problem zu lösen. Die erste besteht darin, dieselben Service-Barcodes zu verwenden, um eine Einstellung festzulegen, die das Zeilenumbruchzeichen nach dem Lesen überträgt. Wenn Sie mit dem Modell kein Glück haben und die erste Option nicht passt, können Sie das Scannersuffix festlegen. Fügen Sie mithilfe der Service-Barcodes am Ende der Lesesequenz ein Zeichen hinzu, mit dem Sie das Ende der Eingabe abfangen können.
Wir verbinden die Kasse
Die Anwendung ist also da, der Barcode-Scanner ist angeschlossen, aber wir können den Scheck immer noch nicht drucken. Dafür brauchen wir die Abendkasse selbst. In MySklad unterstützen wir KKT Atol und Shtrikh, auch MSPOS. Ich werde in einem anderen Artikel darüber berichten.
Bei der Integration mit der Kassiererin begann die Menge an Eisencode unaufhaltsam zu wachsen. Wir haben uns entschlossen, alle Arbeiten mit den angeschlossenen Geräten in einer separaten Bibliothek abzulegen. Die Registrierkassenanwendung selbst ist zu einem Kunden geworden, der eine Bibliothek durch gradle zieht.
Je nach Modell können Sie eine Verbindung über USB, Bluetooth oder Wi-Fi herstellen. Und auch nach dem UART-Protokoll, das in einem Fall eine starre Kopplung von Registrierkasse und Android-Gerät darstellt. Außerdem unterscheiden sich verschiedene Anbieter radikal in der Implementierung der Verbindung des Clients mit der Kasse. Java-Wrapper über native .so-Bibliotheken, ein Add-On über die Open-Source-jPOS-Bibliothek und sogar den steuerlichen Kern, auf den über einen Dienst mit einer AIDL-Schnittstelle (Android Interface Definition Language) zugegriffen wird.
Bei den ersten Versuchen, ein Gerät eines Herstellers zu integrieren, waren wir mit dem Interaktionsschema für KKM-Geräte zufrieden:

Angesichts der Anzahl der Treiberimplementierungen, der Verbindungsmethoden und der Einheitlichkeit der Funktionen haben wir uns entschlossen, die Arbeit mit Hardware zu überdenken. Infolgedessen kam das vorherige Schema zu folgender Form:

T ist ein spezifischer Treiber-Wrapper auf niedriger Ebene
Der Geräte-Manager verbirgt die Implementierung der Verbindung vor dem Client. Es reicht aus, einen Verbindungsassistenten zu erstellen, bei dem Sie den Hersteller des Kassierers und die Art der Verbindung konsistent auswählen und die Einstellungen vornehmen müssen. Bei einer erfolgreichen Verbindung wird ein Objekt an uns zurückgegeben, das die KKMDevice-Schnittstelle implementiert.
KKMDevice verbirgt die Details der Arbeit mit einem einzelnen Anbietertreiber. Wrapper jedes Herstellers enthalten einen Link zum T-Treiber und zu Delegaten, die bestimmte Funktionssätze implementieren. Zum Beispiel FiscalDelegate, NonFiscalDelegate, DeviceInfoDelegate.
Ich werde einige allgemeine Integrationspunkte erwähnen:
- Achten Sie darauf, dass Sie auf Treiberaktualisierungen achten. Neben Fehlerkorrekturen und höherer Geschwindigkeit treten häufig Qualitätssprünge auf. Glauben Sie mir, der Übergang von einfachen HEX-Befehlen zu einer Java-ähnlichen Oberfläche und von diesen zu JSON-Aufgaben erleichtert die Arbeit erheblich und macht den Code verständlicher.
- Blockieren Sie für die Dauer der Vorgänge die Benutzeroberfläche mit einem Fortschrittsbalken. Auf dem Schild steht, dass die mehrmals hintereinander mit einer verbundenen KPCh gedrückte Schaltfläche „Bezahlen“ ein Vorbote der Kritik im Task-Tracker ist.
- Stellen Sie sicher, dass alle Operationen mit CCP streng nacheinander ausgeführt werden. Ein „erfolgreiches“ Flow-Rennen kann den KKT aufhängen, während der sich gleichzeitig drehende Fortschrittsbalken ebenfalls eine Anwendung ist.
- Wenn Sie die Datenübertragung zum Steuerdatenoperator konfigurieren müssen, empfehlen wir Ihnen, die maximale Anzahl von Parametern aus einer vordefinierten Liste auszuwählen. Weil die manuelle Eingabe von Daten mit einem militärischen Steuerantrieb eine großartige Möglichkeit ist, sich in den Fuß zu schießen, aber auf der Benutzerseite, wenn Sie die Anwendung verwenden.
Ein Fiscal Drive ist ein Gerät, das Informationen über Handelsvorgänge sammelt und verarbeitet. Es kann mehr kosten als die Abendkasse selbst. Wenn das Laufwerk nicht richtig konfiguriert ist, ist möglicherweise eine Prozessnullung erforderlich. Öffnen Sie dazu die Abendkasse, sofort läuft die Garantie ab.
Erwerben
Wir haben also die Kassenschnittstelle, können die Waren per Barcode scannen und den Scheck ausdrucken. Es bleibt die Möglichkeit, mit Karte zu bezahlen.
Unsere Anwendung integriert die Unterstützung für PayMe- und Inpas-Terminals. Die ersteren sind über Bluetooth verbunden, während die letzteren über USB oder über Wi-Fi verbunden werden können.
Das Verbindungsschema für Zahlungsterminals ist dem Verbinden einer CCP sehr ähnlich, sofern keine zusätzliche Autorisierung erforderlich ist.
Es gibt jedoch gravierende Unterschiede - beim Umgang mit dem abnormalen Verhalten des Geräts. In der KPCh wurde jede Operation entweder erfolgreich bestanden oder nicht. Wenn der Vorgang fehlgeschlagen ist, können Sie es erneut versuchen oder abbrechen. Alles andere geschieht ohne Intervention.
Bei Terminals ist es notwendig, mögliche Unterbrechungen des Zahlungsvorgangs in jedem Schritt zu überwachen. Eine Bankkarte wird möglicherweise nicht berücksichtigt, oder die Karte enthält nicht genügend Guthaben. Sie können nicht auf eine Antwort von der Bank warten oder warten, sondern erhalten als Antwort einen 5xx HTTP-Code. Und in jeder Phase kann die Verbindung einfach unterbrochen werden.
Darüber hinaus können Sie ohne Zertifizierung keine ordnungsgemäß funktionierende Anwendung mit Inpas-Terminalunterstützung freigeben. Die Zertifizierung umfasst die Überprüfung der Verfügbarkeit und des korrekten Betriebs aller Benutzervorgänge des Terminals sowie die Verarbeitung von Ereignissen wie der Trennung vom Netzwerk, nachdem der Käufer bereits eine Karte an das Terminal angeschlossen hat.
Beim Testen des Terminals müssen Sie berücksichtigen, mit welcher Bank oder welchem Zahlungssystem es gekoppelt ist. In einigen Fällen wird das Geld auch im Entwicklungsmodus nur über das persönliche Konto des Kontos und nicht automatisch zurückerstattet.
Sie müssen sich auch daran erinnern, dass die Bank auch am Zahlungsprozess teilnimmt. Beispielsweise kann das Fehlen eines Belegschecks auftreten, wenn auf dem persönlichen Konto der Bank keine erforderliche Einstellung vorhanden ist.
Fazit
Das Verbinden verschiedener Geräte mit einer Android-Anwendung ist ein komplizierter, aber interessanter Prozess. Wir haben über ihn als Ganzes gesprochen, alle Hindernisse zu beschreiben, ist natürlich unrealistisch.
Wenn Sie Fragen haben, beantworte ich diese gerne in den Kommentaren. Wenn Fragen in einen separaten Artikel eingegeben werden, schreiben Sie :)