Qnack + qnack-mqtt-print: Web POS'unu Termal Fiş Yazıcılarına Bağlamak
Qnack konaklama için web tabanlı bir satış noktasıdır; qnack-mqtt-print tarayıcıyı termal fiş yazıcılarına MQTT üzerinden bağlayan küçük Node hizmetidir. Mimari, MQTT konu tasarımı ve ele almamız gereken hata modları.
USB üzerinden termal fiş yazıcısıyla konuşan tarayıcı tabanlı bir POS başlangıç için uygun değildir: bir tarayıcı sekmesinden USB erişimi kısıtlıdır, düşmanca ortamlar sürücü kurmaz ve yazıcı mutfakta olabilirken sipariş bardaktan alınır. Tarayıcının ulaşabileceği ve küçük bir başsız hizmetin doğal olarak konuşabileceği bir taşıma aracına ihtiyacımız vardı. Cevap MQTT oldu.
Mimari
Her biri asgari düzeyde üç bileşen:
- Qnack web POS. Barda bir tablette çalışan bir Next.js uygulaması. Sipariş girişleri, sipariş yükü ile Qnack arka ucuna bir HTTPS isteği tetikler.
- Qnack arka uç (NestJS). Siparişi kalıcı kılar, mekana kapsamlı bir MQTT konusuna bir "yazdır" etkinliği yayınlar.
- qnack-mqtt-print. Yazıcının yanında bir Raspberry Pi üzerinde çalışan küçük bir Node hizmeti. Mekana kapsamlı konuya abone olur, siparişi yazıcının ESC/POS bayt akışına biçimlendirir ve USB üzerinden yazıcıya yazar.
Neden MQTT, WebSocket değil
WebSocket çalışırdı, ama mutfak ve bar yazıcıyla aynı fiziksel ağda — bulut arka ucuyla aynı ağda değil. MQTT aracıları, internete gelen bağlantı noktası olmadan, güvenlik duvarının arkasında Pi üzerinde yerel olarak çalışabilir. Sipariş bir arka uç dağıtımını, kısa bir internet kesintisini veya bir tablet yeniden başlatmasını atlatır. Yayınlama önce yereldir, yeniden bağlanmalar boyunca dayanıklıdır ve aracıda onaylanır.
Ölçeklenen konu tasarımı
Ekiplerin çoğunun yatırımı en az yaptığı kısım konu tasarımıdır. Bizimki:
qnack/{venueId}/printers/{printerId}/jobs— belirli bir mekandaki belirli bir yazıcı için kuyruk.qnack/{venueId}/printers/{printerId}/status— son-irade-ve-vasiyet kalp atışı, böylece POS Pi kalp atmayı bırakırsa "mutfak yazıcısı çevrimdışı" gösterebilir.
Yeni bir mekan konu ağacında yeni bir daldır. Aracı mekan başına erişim kontrolünü uygular, böylece A mekanındaki hatalı yapılandırılmış bir abone B mekanının sipariş akışını okuyamaz.
Ele almamız gereken hata modları
- Pi güç döngüsü. MQTT istemcisi önyüklemede yeniden bağlanır, son-irade-ve-vasiyet bir "yazıcı çevrimdışı" mesajı yayınlar ve POS bu yazıcıya karşı sipariş kuyruğa almayı durdurur.
- Yazıcıda kağıt bitti. ESC/POS sürücüsü bir durum baytı döndürür. qnack-mqtt-print durum konusunda bir "yazıcı hatası" mesajı yayınlar ve POS bir banner gösterir.
- Arka uç ulaşılamaz ama POS hâlâ çevrimiçi. Qnack POS siparişleri yerel olarak kuyruğa alır ve geri çekilme ile yeniden dener. Arka uç kurtulduğunda mutfak yazıcısı yine de alır.
Bize öğrettiği şey
Ders POS'un ötesinde genellenebilir: tarayıcıdan-fiziksel-cihaz iletişimine ihtiyacınız olduğunda, köprü hizmeti herkesin hafife aldığı sıkıcı kısımdır. Her ön uç yeniden yazımından uzun yaşayacakmış gibi inşa edin — çünkü yaşayacaktır.
