Commandez un moniteur au lieu d'une imprimante thermique de cuisine

Moniteur de commande

Une petite quête sur le remplacement d'une imprimante de commande de cuisine dans un restaurant avec un moniteur de 24 "avec des commandes de framboise au cours de la soirée. Cela est vrai pour presque tous les systèmes ERP (tous les systèmes 1C modernes dans l'équipement commercial prennent en charge les imprimantes de reçus, de la même manière qu'avec d'autres systèmes).

Remarque


Dans les restaurants et les cafés, les imprimantes à commandes (imprimantes «de marque») sont le plus souvent utilisées pour imprimer les commandes dans la cuisine. Ce sont de petites imprimantes thermiques (apparentées aux caisses enregistreuses), mais sans entraînements fiscaux, et elles ont le plus souvent un bouton - enroulement de ruban. Auparavant, les imprimantes thermiques étaient principalement connectées à des systèmes tels que FrontOffice via un port COM, mais il y a environ 10 ans, la situation a changé, le support Ethernet est apparu dans les imprimantes.

L'expérience


Les imprimantes, qui ont été trouvées dans les travaux des fabricants Shtrikh-M, Posiflex, Sam4s, sont du même type, elles utilisent le protocole RAW (One-way Protocol) pour l'impression. Ils ont de petits serveurs Web avec des paramètres de vitesse d'impression, des spécifications de port, des encodages, des fonctionnalités supplémentaires et des paramètres réseau. Certains modèles ont la possibilité de connecter un scanner de codes-barres pour les notifications sur l'état de préparation des plats (envoyer le code-barres au réseau). Le coût de la journée en cours pour les modèles de budget commence à partir de 10 tr. et peut atteindre jusqu'à 30 tr sur Epson. Espérance de vie en utilisation intensive à partir de quelques années. Les principales causes de défaillance sont la rupture du coupe-papier, la graisse (recouvre l'imprimante à l'extérieur et partiellement les mécanismes à l'intérieur), la défaillance de la tête thermique, le séchage des rouleaux et des engrenages en plastique et les imprimantes inondées de liquides. La réparation et le remplacement des éléments représentent 50% du coût de l'imprimante, plus, bien sûr, le consommable est du papier thermique.

Défi


Ainsi, en accord avec la cuisine et l'administration, au lieu de la prochaine imprimante thermique défaillante, un moniteur avec une framboise pi 3 B avec une carte SD de 2 Go a été monté.
La tâche principale n'est pas d'apporter des modifications au système FrontOffice, et pour que le logiciel ne diffère pas de l'imprimante des reçus / commandes.

Logiciel de serveurs FrontOffice Shtrikh-M, le Shtrih-600 est spécifié comme imprimante de commandes. Plus tôt, lorsque les imprimantes russes sont passées au coréen, il s'est avéré que la page de codes dans laquelle les paquets sont transmis est le port 9100 de Windows-1251.

Sélection et configuration du système d'exploitation


Comme un mini-PC sera le Raspberry Pi 3 Model B, nous y déploierons le système léger Raspbian Stretch Lite .

Nous allons faire un peu de réglage: nous allons livrer le gestionnaire de fenêtres openbox, le gestionnaire de connexion LightDM au système, configurer la connexion automatique, masquer le journal de téléchargement.

Un peu d'analyse


Ensuite, nous allons construire un simple serveur socket pour découvrir comment les informations sont encodées dans le paquet et ce qui est généralement envoyé à l'imprimante thermique.

#!/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() 

Le logiciel FrontOffice envoie les données dans un paquet dans lequel un paquet spécial vole. caractères avant et après la partie principale. Les informations de référence sur les polices et leur taille sont codées avec des caractères qui ne sont pas dans le codage utf8. Chaque ligne est suivie de / r / n. Il était possible d'écrire une fonction filtrant les caractères spéciaux, mais nous avons un soir, et dans la «marque» le début est très bien séparé par une chaîne d'astérisques, la fin par une chaîne de caractères moins. Ajoutez une béquille, jetez les caractères spéciaux au début et à la fin, décodez dans utf8. Dans la fenêtre de la console, nous obtenons le reçu, comme c'est le cas lors de l'impression sur la "marque" de l'imprimante.

Architecture d'application future


Jetons un œil à l'architecture de l'application.

  1. Un serveur de socket qui attend constamment la réception.
  2. Serveur Web.
  3. L'application de visualisation est un navigateur en plein écran.
  4. Un système de messagerie entre un serveur socket et un serveur web.

La production


Nous allons résoudre les premier et quatrième points en ajoutant le serveur de socket décrit ci-dessus - redis - avec un stockage de valeur-clé, en vue des améliorations futures (canaux - abonnements), en cours de route, nous réduirons l'usure de la carte sd. Et ajoutez un signal - une notification de l'arrivée d'une nouvelle commande, nous jouerons via HDMI sur les colonnes du moniteur. La sortie audio est activée via raspi-config.

 #!/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() 

Dans le deuxième paragraphe, nous téléchargerons le serveur Web dans une fiole avec mise à jour automatique toutes les 15 secondes (pour l'instant, c'est l'option la plus simple), marquons socketio dans la liste des tâches et la file d'attente peut être céleri ou redis. Nous trions toutes les paires clé-valeur disponibles et les affichons sur la page. En cliquant sur la «marque», nous supprimerons respectivement de redis et du bureau.

 # -*- 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') 

Ajouter un modèle jinja

 <!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> 

Il y avait l'article 3, nous ferons le navigateur le plus minimal sans boutons de 13 lignes.

 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_()) 

Ensuite, vous devez créer des services pour exécuter tous les scripts écrits ci-dessus.
Ou enregistrez-les rapidement dans un fichier openbox à démarrage automatique.

Résultat
Moniteur de commande de cuisine

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


All Articles