Bestellen Sie einen Monitor anstelle eines Küchenthermodruckers

Bestellmonitor

Eine kleine Aufgabe, einen Küchenbestelldrucker in einem Restaurant durch einen 24-Zoll-Monitor mit Himbeer-Pi-Bestellungen über den Abend zu ersetzen. Dies gilt für fast jedes ERP-System (alle modernen 1C-Systeme in kommerziellen Geräten unterstützen Quittungsdrucker, ähnlich wie andere Systeme).

Bemerkung


In Restaurants und Cafés werden Bestelldrucker (Markendrucker) am häufigsten zum Drucken von Bestellungen in der Küche verwendet. Dies sind kleine Thermodrucker (Verwandte von Registrierkassen), jedoch ohne Steuerantriebe, und sie haben meistens einen Knopf - Bandwicklung. Früher waren Thermodrucker hauptsächlich über einen COM-Anschluss mit Systemen wie FrontOffice verbunden, aber vor etwa 10 Jahren änderte sich die Situation, und die Ethernet-Unterstützung wurde in Druckern angezeigt.

Erfahrung


Drucker, die in der Arbeit der Hersteller Shtrikh-M, Posiflex, Sam4s gefunden wurden, sind vom gleichen Typ, sie verwenden das RAW-Protokoll (One-Way-Protokoll) zum Drucken. Sie verfügen über kleine Webserver mit Einstellungen für Druckgeschwindigkeit, Portspezifikationen, Codierungen, zusätzliche Funktionen und Netzwerkeinstellungen. Einige Modelle können einen Barcode-Scanner anschließen, um Benachrichtigungen über die Bereitschaft von Geschirr zu erhalten (senden Sie den Barcode an das Netzwerk). Die Kosten für den aktuellen Tag für Budgetmodelle beginnen bei 10 tr. und kann bis zu 30 tr auf Epson erreichen. Lebenserwartung bei intensiver Nutzung ab einigen Jahren. Die Hauptursachen für Fehler sind ein Ausfall des Papierschneiders, Fett (bedeckt den Drucker außen und teilweise die Mechanismen innen), ein Versagen des Thermokopfs, das Trocknen der Walzen und des Zahnrads aus Kunststoff sowie Drucker, die mit Flüssigkeiten geflutet werden. Die Reparatur und der Austausch von Elementen machen 50% der Kosten des Druckers aus, und natürlich ist das Verbrauchsmaterial Thermopapier.

Herausforderung


In Übereinstimmung mit der Küche und der Verwaltung wurde anstelle des nächsten ausgefallenen Thermodruckers ein Monitor mit einem Himbeer-Pi 3 B mit einer 2-GB-SD-Karte montiert.
Die Hauptaufgabe besteht darin, keine Änderungen am FrontOffice-System vorzunehmen und die Software nicht vom Drucker für Belege / Bestellungen zu unterscheiden.

Software von Kellnern FrontOffice Shtrikh-M, der Shtrih-600 wird als Drucker von Bestellungen angegeben. Als russische Drucker auf Koreanisch umstellten, stellte sich heraus, dass die Codepage, auf der die Pakete übertragen werden, der Windows-1251-Port 9100 ist.

Auswahl und Einrichtung des Betriebssystems


Da es sich bei einem Mini-PC um Raspberry Pi 3 Model B handelt, werden wir darin das leichte Raspbian Stretch Lite-System einsetzen .

Wir werden ein wenig optimieren: Wir werden den Openbox-Fenstermanager und den LightDM-Anmeldemanager an das System senden, die automatische Anmeldung konfigurieren und das Download-Protokoll ausblenden.

Ein bisschen Analyse


Als Nächstes erstellen wir einen einfachen Socket-Server, um herauszufinden, wie die Informationen im Paket codiert sind und was im Allgemeinen dort an den Thermodrucker gesendet wird.

#!/usr/bin/env python # -*- coding: utf-8 -*- import socket sock = socket.socket() sock.bind(('', 9100)) sock.listen(1) while True: conn, addr = sock.accept() data = conn.recv(16384) print(data) # print(((data.rsplit('*',1)[1]).rsplit('- -',9)[0]).decode('cp1251').encode('utf8')) # clear_data = ((data.rsplit('*',1)[1]).rsplit('- -',9)[0]).decode('cp1251').encode('utf8') conn.close() 

Die FrontOffice-Software sendet Daten in einem Paket, in dem ein spezielles Paket fliegt. Zeichen vor und nach dem Hauptteil. Referenzinformationen zu Schriftarten und ihrer Größe werden mit Zeichen codiert, die nicht in der utf8-Codierung enthalten sind. Auf jede Zeile folgt / r / n. Es war möglich, eine Funktion zum Filtern von Sonderzeichen zu schreiben, aber wir haben einen Abend, und in der „Markierung“ ist der Anfang sehr gut durch eine Reihe von Sternchen getrennt, das Ende durch eine Folge von Minuszeichen. Fügen Sie eine Krücke hinzu, verwerfen Sie Sonderzeichen am Anfang und Ende und dekodieren Sie in utf8. Im Konsolenfenster erhalten wir die Quittung, wie sie beim Drucken der "Markierung" vom Drucker ist.

Zukünftige Anwendungsarchitektur


Werfen wir einen Blick auf die Anwendungsarchitektur.

  1. Ein Socket-Server, der ständig auf den Empfang wartet.
  2. Webserver.
  3. Die Anzeigeanwendung ist ein Browser mit Vollbild.
  4. Ein Nachrichtensystem zwischen einem Socket-Server und einem Webserver.

Produktion


Wir werden den ersten und vierten Punkt lösen, indem wir den oben beschriebenen Socket-Server - redis - mit einem Schlüsselwertspeicher hinzufügen, um zukünftige Verbesserungen (Kanäle - Abonnements) zu berücksichtigen und den Verschleiß der SD-Karte zu verringern. Und fügen Sie ein Signal hinzu - eine Benachrichtigung über das Eintreffen einer neuen Bestellung, wir werden hdmi auf den Monitorspalten durchspielen. Die Tonausgabe wird über raspi-config aktiviert.

 #!/usr/bin/env python # -*- coding: utf-8 -*- import socket import redis import pygame sock = socket.socket() sock.bind(('', 9100)) sock.listen(1) pygame.mixer.pre_init(frequency=44100, size=-16, channels=2, buffer=4096) pygame.mixer.init(44100, -16, 2, 4096) sound = pygame.mixer.Sound("icq.wav") #print(sound.get_num_channels()) r = redis.StrictRedis(host='localhost', port=6379, db=0) n=0 while True: conn, addr = sock.accept() data = conn.recv(16384) print(((data.rsplit('*',1)[1]).rsplit('- -',9)[0]).decode('cp1251').encode('utf8')) sound.play() clear_data = ((data.rsplit('*',1)[1]).rsplit('- -',9)[0]).decode('cp1251').encode('utf8') r.set('data'+str(n), clear_data) n=n+1 conn.close() 

Im zweiten Absatz laden wir den Webserver alle 15 Sekunden mit automatischer Aktualisierung auf flask hoch (dies ist derzeit die einfachste Option), markieren socketio in der Aufgabenliste und die Warteschlange kann Sellerie oder Redis sein. Wir sortieren alle verfügbaren Schlüssel-Wert-Paare und zeigen sie auf der Seite an. Durch Klicken auf die „Marke“ werden wir von Redis bzw. vom Desktop entfernt.

 # -*- coding: utf-8 -*- from flask import Flask, render_template, redirect import os import redis r = redis.StrictRedis(host='localhost', port=6379, db=0) app = Flask(__name__) def kernel_ver(): try: f = open(os.path.dirname(os.path.abspath(__file__)) + '/release.txt') lines = f.readlines() f.close() return lines[0] except IOError as e: return "--" @app.route('/') def index(): d = {} for item in r.keys(): d[item] = (r.get(item)).decode('utf8') return render_template("index.html", release=kernel_ver(), di = d) @app.route('/del/<key>') def delstamp(key): r.delete(key) return redirect("http://192.168.1.80:5000/", code=302) if __name__ == "__main__": app.run(host='0.0.0.0') 

Jinja-Vorlage hinzufügen

 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta http-equiv="refresh" content="30"/> <title>  </title> <link href="http://fonts.googleapis.com/css?family=Reenie+Beanie:regular" rel="stylesheet" type="text/css"> </head> <body> <ul> {% for key in di %} <li> <a href="/del/{{key}}"> <!-- h2>Title #1</h2 --> {% for item in di[key].splitlines() %} <p>{{ item }}</p> {% endfor %} </a> </li> {% endfor %} </ul> </body> </html> 

Es gab Punkt 3, wir werden den minimalsten Browser ohne Schaltflächen mit 13 Zeilen erstellen.

 import sys from PySide import QtCore, QtGui, QtWebKit class MainWindow(QtGui.QMainWindow): def __init__(self): super(MainWindow, self).__init__() self.showFullScreen() self.web = QtWebKit.QWebView(self) self.web.load(QtCore.QUrl('http://127.0.0.1:5000')) self.setCentralWidget(self.web) app = QtGui.QApplication(sys.argv) main_window = MainWindow() main_window.show() sys.exit(app.exec_()) 

Als Nächstes müssen Sie Dienste erstellen, um alle oben beschriebenen Skripte auszuführen.
Oder registrieren Sie sie schnell in der Autostart-Openbox-Datei.

Ergebnis
Küchenbestellmonitor

Source: https://habr.com/ru/post/de418961/


All Articles