اطلب الشاشة بدلاً من طابعة حرارية للمطبخ

رصد النظام

مهمة صغيرة لاستبدال طابعة طلب مطبخ في مطعم بشاشة 24 بوصة مع طلبات raspberryPi خلال المساء. وينطبق هذا على أي نظام erp تقريبًا (جميع أنظمة 1C الحديثة في طابعات استلام المعدات التجارية تدعم ، على غرار الأنظمة الأخرى).

ملاحظة


في المطاعم والمقاهي ، غالبًا ما تستخدم طابعات الطلبات (طابعات "العلامة التجارية") لطباعة الطلبات في المطبخ. هذه طابعات حرارية صغيرة (أقارب مسجلات نقدية) ، ولكن بدون محركات مالية ، وغالباً ما يكون لها زر واحد - لف الشريط. في السابق ، كانت الطابعات الحرارية متصلة أساسًا بأنظمة مثل FrontOffice عبر منفذ COM ، ولكن منذ حوالي 10 سنوات تغير الوضع ، ظهر دعم Ethernet في الطابعات.

الخبرة


الطابعات ، التي تم العثور عليها في أعمال الشركات المصنعة Shtrikh-M ، Posiflex ، Sam4s ، من نفس النوع ، فهي تستخدم بروتوكول RAW (بروتوكول أحادي الاتجاه) للطباعة. لديهم خوادم ويب صغيرة مع إعدادات سرعة الطباعة ، مواصفات المنفذ ، الترميز ، وظائف إضافية وإعدادات الشبكة. بعض النماذج لديها القدرة على توصيل ماسح الباركود للإخطارات حول جاهزية الأطباق (إرسال الباركود إلى الشبكة). تبدأ تكلفة اليوم الحالي لنماذج الميزانية من 10 tr. ويمكن أن تصل إلى 30 tr على إبسون. متوسط ​​العمر المتوقع في الاستخدام المكثف من بضع سنوات. الأسباب الرئيسية للفشل هي كسر مقص الورق ، والشحوم (تغطي الطابعة بالخارج وجزئيًا الآليات الداخلية) ، وفشل الرأس الحراري ، وتجفيف البكرات والتروس البلاستيكية ، والطابعات التي تغمرها السوائل. إصلاح واستبدال العناصر هو 50 ٪ من تكلفة الطابعة ، بالإضافة إلى أن المواد المستهلكة هي الورق الحراري.

التحدي


لذلك ، بالاتفاق مع المطبخ والإدارة ، بدلاً من الطابعة الحرارية الفاشلة التالية ، تم تركيب شاشة مع التوت pi 3 B مع بطاقة SD 2 جيجابايت.
المهمة الرئيسية هي عدم إجراء تغييرات على نظام FrontOffice ، وألا يختلف البرنامج عن طابعة الإيصالات / الطلبات.

برنامج النوادل FrontOffice Shtrikh-M ، يتم تحديد Shtrih-600 كطابعة للطلبات. في وقت سابق ، عندما تغيرت الطابعات الروسية إلى الكورية ، اتضح أن صفحة الرموز التي يتم نقل الحزم بها هي منفذ Windows-1251 9100.

اختيار نظام التشغيل والإعداد


نظرًا لأن جهاز الكمبيوتر المصغر سيكون Raspberry Pi 3 Model B ، سننشر فيه نظام Raspbian Stretch Lite خفيف الوزن.

سنقوم ببعض الضبط: سنقوم بتسليم مدير نافذة openbox ومدير تسجيل الدخول LightDM إلى النظام وتهيئة تسجيل الدخول التلقائي وإخفاء سجل التنزيل.

القليل من التحليل


بعد ذلك ، سنقوم ببناء خادم مأخذ بسيط لمعرفة كيفية تشفير المعلومات في الحزمة ، وما الذي يتم إرساله بشكل عام إلى الطابعة الحرارية هناك.

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

يرسل برنامج FrontOffice البيانات في حزمة واحدة تطير فيها حزمة خاصة. الشخصيات قبل وبعد الجزء الرئيسي. يتم ترميز المعلومات المرجعية حول الخطوط وحجمها بأحرف ليست في ترميز utf8. كل سطر يتبعه / r / n. كان من الممكن كتابة دالة لتصفية الأحرف الخاصة ، ولكن لدينا ليلة واحدة ، وفي "العلامة" ، يتم فصل البداية جيدًا بسلسلة من العلامات النجمية ، وتنتهي النهاية بسلسلة من الأحرف ناقص. أضف عكازًا ، وتخلص من الأحرف الخاصة في البداية والنهاية ، وفك الشفرة في utf8. في نافذة وحدة التحكم ، نحصل على الإيصال ، كما هو الحال عند الطباعة على "العلامة" من الطابعة.

هندسة التطبيقات المستقبلية


دعنا نلقي نظرة على بنية التطبيق.

  1. خادم مأخذ توصيل ينتظر الاستقبال باستمرار.
  2. خادم الويب.
  3. تطبيق المشاهدة هو متصفح بملء الشاشة.
  4. نظام مراسلة بين خادم مأخذ وخادم ويب.

الإنتاج


سنقوم بحل النقطتين الأولى والرابعة عن طريق إضافة خادم مأخذ التوصيل الموضح أعلاه - redis - مع تخزين القيمة الرئيسية ، مع التركيز على التحسينات المستقبلية (القنوات - الاشتراكات) ، على طول الطريق الذي سنقلل فيه تآكل بطاقة sd. وإضافة إشارة - إشعار حول وصول طلب جديد ، سنلعب من خلال HDMI على أعمدة الشاشة. يتم تنشيط إخراج الصوت عبر 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() 

في الفقرة الثانية ، سنقوم بتحميل خادم الويب إلى قارورة مع التجديد التلقائي كل 15 ثانية (في الوقت الحالي هذا هو الخيار الأسهل) ، في قائمة المهام سنضع علامة على socketio وقد تكون قائمة الانتظار كرفس أو على redis. نقوم بفرز جميع أزواج القيمة الرئيسية المتاحة وعرضها على الصفحة. بالضغط على "العلامة التجارية" سنقوم بإزالتها من redis ومن سطح المكتب على التوالي.

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

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

كان هناك عنصر 3 ، سنقوم بإنشاء الحد الأدنى من المتصفح بدون أزرار من 13 سطرًا.

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

بعد ذلك ، تحتاج إلى إنشاء خدمات لتشغيل جميع النصوص المكتوبة أعلاه.
أو تسجيلها بسرعة في ملف openbox التلقائي.

النتيجة
مراقبة ترتيب المطبخ

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


All Articles