detonger-web-bt - drukowanie z www

Biblioteka JS/TS do obsługi termicznych drukarek Detonger bezpośrednio z przeglądarki, przez Web Bluetooth API – bez lokalnych sterowników, bez pośredniczącego serwera. Z integracją do React.

To biblioteka, która pozwala połączyć się z termiczną drukarką Detonger i wydrukować z niej bezpośrednio z poziomu przeglądarki – bez instalowania czegokolwiek na komputerze. Poniżej krótka historia, jak do tego doszedłem.

Potrzeba szybkiego druku

W Pineaddle, drukując zdjęcia na miejscu podczas eventów, chciałem też łatwo dostarczać ich cyfrowe wersje. To szybko doprowadziło mnie do prostej koncepcji: wrzuć zdjęcie do chmury, pokaż klientowi kod QR. Pierwsza wersja tego pomysłu zadziałała całkiem nieźle – kody QR wyświetlane na ekranie komputera czy telefonu szybko przypadły gościom do gustu, bo technologia jest na tyle oczywista, że nikomu nie trzeba tłumaczyć, o co chodzi.

To doprowadziło mnie do kolejnej myśli: co, gdyby nakleić naklejkę z kodem QR bezpośrednio na odwrocie zdjęcia? Wtedy nie trzeba pokazywać kodu każdemu z osobna ani czekać, aż ktoś go zeskanuje.

Szukanie drukarki

Zacząłem szukać drukarki. W idealnym scenariuszu miała dać się obsługiwać z poziomu przeglądarki, być budżetowa – niekoniecznie profesjonalna drukarka przemysłowa – i przyjmować dowolny papier termiczny czy naklejki, bez chipa ograniczającego wybór do dedykowanych materiałów.

Wybór padł na rodzinę drukarek Detonger, DP23/DP30S. (Swój pierwszy egzemplarz, DP23 z uszkodzonym układem zasilania, kupiłem tanio do testów – ale to już inna historia.)

Ograniczenia oryginalnego oprogramowania

Do drukarek Detonger producent oferuje kilka ścieżek: aplikację WePrint (domyślną opcję), kilka bibliotek do integracji na Androida i iOS, oraz „web print” – webową aplikację do drukowania. Problem w tym, że nawet ten web print wymaga zainstalowania lokalnego sterownika, który hostuje usługę druku na danym porcie – przeglądarka nie rozmawia bezpośrednio z drukarką, tylko z tą lokalną usługą.

W praktyce oznaczało to niestabilny proces instalacji, blokady firewalla i sterowniki dostępne tylko dla Windowsa i Linuksa. Krótko mówiąc: producent daje aplikację webową, ale bez zainstalowanego programu na komputerze i tak nic z niej nie wydrukujesz.

Obejście dla macOS

Żeby cokolwiek wydrukować z komputera z macOS, musiałem zbudować prawdziwego potworka. W sieci lokalnej postawiłem RaspberryPi z zainstalowanym sterownikiem i podpiętą do niego drukarką. Na samym RaspberryPi uruchomiłem nginx jako proxy, żeby dało się połączyć po self-signed SSL – to był warunek konieczny, bo strona działająca po SSL nie może łączyć się z adresem bez SSL innym niż localhost. Do tego musiałem zmodyfikować samą bibliotekę webową łączącą się ze sterownikiem, bo domyślnie zakładała, że sterownik siedzi na tej samej maszynie, a nie gdzieś w sieci.

Czyli żeby wydrukować z Maca, potrzebowałem: komputera, routera, RaspberryPi i drukarki.

macOS  --https (self-signed)-->  RASPBERRY PI (nginx + sterownik)  --USB-->  DRUKARKA

Nie polecam.

Web Bluetooth API

Trochę wcześniej eksperymentowałem z Web Bluetooth API, budując aplikację do sterowania głowicą opartą na Arduino. To naprowadziło mnie na pytanie: skoro da się tak połączyć z Arduino, to czemu nie miałoby się dać połączyć bezpośrednio z drukarką?

PRZEGLĄDARKA  <-------- Web Bluetooth -------->  DRUKARKA (DP30S)

Zacząłem od wyszukiwania urządzeń przez API i pierwszych mignięć diody na drukarce, potem rozszyfrowywanie protokołu komunikacji na podstawie innych bibliotek (z pomocą LLM-ów), aż w końcu opakowanie całości w bibliotekę z integracją do Reacta.

Ciekawostka: nazwa „bluetooth” pochodzi od przydomka duńskiego króla Haralda I Sinozębego (Harald Blåtand), który w X wieku zjednoczył skłócone duńskie plemiona pod jednym panowaniem. Nazwa ma symbolizować łączenie różnych, niekompatybilnych standardów – podobnie jak on połączył zwaśnione strony. Logo Bluetooth to zresztą runiczny monogram jego inicjałów, H i B.

Co umożliwia biblioteka

Bezpośrednio ze strony, z obsługiwanej przeglądarki, można połączyć się z drukarką po Bluetooth i wydrukować:

  • Tekst – z zadaną wielkością czcionki, automatycznym skalowaniem gdy tekst jest za duży, zawijaniem linii i wyrównaniem do lewej, środka lub prawej strony.
  • Obrazy – z wbudowanym skalowaniem i ditheringiem, więc nie trzeba samemu przygotowywać bitmapy pod drukarkę.
  • Canvas – można przekazać do druku gotowy element <canvas>, co daje pełną kontrolę nad layoutem co do piksela, przydatne przy bardziej złożonych wydrukach.

Jak prosta jest w użyciu

To sprawa względna, ale najmniejszy przykład – jeden plik HTML, bez żadnego build stepu – łączy się z drukarką i drukuje „Hello World” w 71 liniach kodu, z czego większość to standardowe stylowanie layoutu. Do użycia w większym projekcie wystarczy npm install detonger-web-bt.

Podsumowanie

Wersja webowa okazała się dużo prostsza niż cały ten cyrk z RaspberryPi – bez lokalnych sterowników, bez pośredniczącego serwera, bez firewalla blokującego instalację. Jest jeden haczyk: Web Bluetooth API na dziś działa tylko w Chrome i Edge – Safari (a więc i iPhone) go nie obsługuje. Na macOS w Chrome działa już bez żadnych kombinacji.


© 2024. Wszelkie prawa zastrzeżone.

Powered by Hydejack v9.2.1