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
- Szukanie drukarki
- Ograniczenia oryginalnego oprogramowania
- Web Bluetooth API
- Jak prosta jest w użyciu
- Podsumowanie
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.
- Kod biblioteki: github.com/Endriur24/detonger_web_bt
- Live demo: detonger-web-bt-example.pages.dev