Solicite un monitor en lugar de una impresora térmica de cocina

Monitor de pedidos

Una pequeña búsqueda para reemplazar una impresora de pedidos de cocina en un restaurante con un monitor de 24 "con pedidos de raspberryPi durante la noche. Esto es cierto para casi cualquier sistema erp (todos los sistemas 1C modernos en equipos comerciales admiten impresoras de recibos, de manera similar con otros sistemas).

Observación


En los restaurantes y cafeterías, las impresoras de pedidos (impresoras de "marca") se utilizan con mayor frecuencia para imprimir pedidos en la cocina. Estas son pequeñas impresoras térmicas (parientes de las cajas registradoras), pero sin unidades fiscales, y con mayor frecuencia tienen un botón: bobinado de cinta. Anteriormente, las impresoras térmicas se conectaban principalmente a sistemas como FrontOffice a través de un puerto COM, pero hace unos 10 años la situación cambió, el soporte de Ethernet apareció en las impresoras.

Experiencia


Las impresoras, que se encontraron en el trabajo de los fabricantes Shtrikh-M, Posiflex, Sam4s, son del mismo tipo, utilizan el protocolo RAW (Protocolo unidireccional) para imprimir. Tienen pequeños servidores web con configuraciones de velocidad de impresión, especificaciones de puertos, codificaciones, funcionalidad adicional y configuraciones de red. Algunos modelos tienen la capacidad de conectar un escáner de código de barras para recibir notificaciones sobre la preparación de los platos (enviar el código de barras a la red). El costo para el día actual para los modelos de presupuesto comienza desde 10 tr. y puede alcanzar hasta 30 tr en Epson. Esperanza de vida en uso intensivo de un par de años. Las principales causas de falla son la rotura del cortador de papel, la grasa (cubre la impresora por fuera y parcialmente los mecanismos por dentro), la falla del cabezal térmico, el secado de los rodillos y engranajes de plástico, y las impresoras se inundan con líquidos. La reparación y el reemplazo de elementos es el 50% del costo de la impresora, además, por supuesto, el consumible es papel térmico.

Desafío


Entonces, de acuerdo con la cocina y la administración, en lugar de la siguiente impresora térmica fallida, se montó un monitor con una frambuesa pi 3 B con una tarjeta SD de 2 GB.
La tarea principal es no realizar cambios en el sistema FrontOffice y que el software no difiera de la impresora de recibos / pedidos.

Software de camareros FrontOffice Shtrikh-M, el Shtrih-600 se especifica como la impresora de pedidos. Anteriormente, cuando las impresoras rusas cambiaron a coreanas, resultó que la página de códigos en la que se transmiten los paquetes es el puerto 9100 de Windows-1251.

Selección y configuración del sistema operativo


Como una mini PC será Raspberry Pi 3 Modelo B, implementaremos en ella el sistema ligero Raspbian Stretch Lite .

Realizaremos un pequeño ajuste: entregaremos el administrador de ventanas de openbox, el administrador de inicio de sesión de LightDM al sistema, configuraremos el inicio de sesión automático, ocultaremos el registro de descarga.

Un poco de analisis


A continuación, crearemos un servidor de socket simple para descubrir cómo se codifica la información en el paquete y qué se envía generalmente a la impresora térmica allí.

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

El software FrontOffice envía datos en un paquete en el que vuela un paquete especial. personajes antes y después de la parte principal. La información de referencia sobre las fuentes y su tamaño está codificada con caracteres que no están en la codificación utf8. Cada línea es seguida por / r / n. Puede escribir una función que filtre caracteres especiales, pero tenemos una noche, y en la "marca" el comienzo está muy bien separado por una cadena de asteriscos, el final por una cadena de caracteres menos. Agregue una muleta, descarte caracteres especiales al principio y al final, decodifique en utf8. En la ventana de la consola obtenemos el recibo, tal como es al imprimir en la "marca" de la impresora.

Arquitectura de aplicaciones futuras


Echemos un vistazo a la arquitectura de la aplicación.

  1. Un servidor de socket que está constantemente esperando la recepción.
  2. Servidor web
  3. La aplicación de visualización es un navegador con pantalla completa.
  4. Un sistema de mensajería entre un servidor de socket y un servidor web.

Producción


Resolveremos los puntos primero y cuarto agregando el servidor de socket descrito anteriormente, redis, con un almacenamiento de valor clave, con miras a futuras mejoras (canales - suscripciones), en el camino reduciremos el desgaste de la tarjeta SD. Y agregue una señal: una notificación sobre la llegada de un nuevo pedido, jugaremos a través de hdmi en las columnas del monitor. La salida de sonido se activa a través de 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() 

En el segundo párrafo, subiremos el servidor web al matraz con actualización automática cada 15 segundos (por ahora esta es la opción más fácil), marque socketio en la lista de tareas y la cola puede ser apio o redis. Ordenamos todos los pares clave-valor disponibles y los mostramos en la página. Al hacer clic en la "marca" eliminaremos de redis y del escritorio, respectivamente.

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

Agregar plantilla 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> 

Hubo el ítem 3, haremos el navegador más mínimo sin botones de 13 líneas.

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

A continuación, debe crear servicios para ejecutar todos los scripts escritos anteriormente.
O regístrelos rápidamente en el archivo de inicio automático de Openbox

Resultado
Monitor de orden de cocina

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


All Articles