Dodanie drukarki USB do routera z OpenWrt

Ostatnio zdecydowałem się na dodanie drukarki podłączonej za pomocą portu USB do mojego routera z oprogramowaniem OpenWrt.
Podczas gdy na co dzień korzystam z rozwiązania bezprzewodowego z wbudowanym AirPrint (dzięki czemu drukuję bezpośrednio z iPhone/iPad), udostępnienie drukarki na USB w sieci wiąże się z zakupem serwera druku (print server).
Niestety, obecnie dostępnym serwerom druku brakuje wsparcia dla, chociażby AirPrint, czyli możliwości drukowania bezprzewodowego z urządzeń Apple takich jak iPhone czy iPad.
Jeżeli już znajdę taki, który podsiada AirPrint, to albo jest on bardzo drogi, albo producent zaprzestał jego dalszego rozwoju, a szkoda.
W związku z tym postanowiłem wykorzystać mój router z oprogramowaniem OpenWrt. Jako że posiada on dwa porty USB, z czego jeden, USB 2.0, który akurat mam wolny, nadaje się on idealnie do podłączenia drukarki.
Tak naprawdę zależało mi najbardziej na AirPrint, a co z tego wyszło, przeczytasz dalej.
Sprawdzone w wersji OpenWrt 21.02 oraz OpenWrt 22.03
Słowem wstępu
Na wstępie sprzęt, który będę używał w poniższym przykładnie:
- Router: Linksys WRT3200ACM z oprogramowaniem OpenWrt
- Drukarka: Samsung CLP-325 na USB
Moim głównym założeniem będzie udostępnienie drukarki w sieci, z możliwością druku z komputera z macOS. Dodatkowo uwzględnię drukowanie z poziomu komputera z systemem Windows.
W typowym rozwiązaniu (Raspbian + Raspberry Pi + drukarka USB) posłużyłbym się pakietem CUPS i tyle. Niestety, w obecnej wersji oprogramowania OpenWrt pakietu CUPS nie uświadczymy, ze względu na ograniczenia ze strony routerów (pamięć i moc obliczeniowa). CUPS sam w sobie ma spore wymagania pod tym względem, w związku z tym oficjalne źródła zalecają inne podejście.
Oczywiście, jeżeli chcesz, to możesz skompilować własny pakiet CUPS ze źródeł. Da się i nawet będzie działać. Jednakże problem pojawi się, gdy będziesz chciał zaktualizować oprogramowanie na twoim routerze. Mimo że według mojego opisu będziesz w łatwy sposób mógł przywrócić ustawienia i zainstalowane pakiety, go w przypadku CUPS, będziesz musiał go skompilować na nowo, a wierz mi, nie jest to szybkie rozwiązanie.
Instalacja serwera druku
Serwer druku p910nd dostępny jest w postaci gotowego pakietu do zainstalowania z poziomu przeglądarki (System > Software) lub terminala:
opkg update
opkg install p910nd
Dodatkowo warto zainstalować aplikację, dodającą możliwość zarządzania serwerem z poziomu naszego panelu administracyjnego LuCI.
opkg install luci-app-p910nd
Ostatnim pakietem, który potrzebujemy, jest obsługa drukarek USB.
opkg install kmod-usb-printer
Znalezienie drukarki
Nim zaczniemy konfigurację naszego serwera druku, musimy sprawdzić, czy nasza drukarka jest wykrywana przez system.
Po podłączeniu kabla USB (przy włączonej drukarce) i wykonaniu w terminalu komendy dmsg
powinniśmy zobaczyć coś takiego:
usb 1-1: new high-speed USB device number 4 using orion-ehci
usblp 1-1:1.0: usblp0: USB Bidirectional printer dev 4 if 0 alt 0 proto 2 vid 0x04E8 pid 0x329F
I za pomocą komendy lsusb
sprawdzamy, czy nasze urządzenie jest rozpoznane prawidłowo. W przypadku mojej drukarki otrzymałem:
Bus 001 Device 004: ID 04e8:329f Samsung Electronics Co., Ltd CLP-325 Color Laser Printer
Czyli wszystko na dobrej drodze.
Sprawdzamy, czy drukarka jest prawidłowo rozpoznana:
ls /dev/usb/lp*
Po czym możemy przejść dalej.
Konfiguracja serwera druku
Z poziomu przeglądarki przechodzimy do Services (Usługi) > p910nd - Print server.
Konfiguracja jest w zasadzie bardzo prosta.
Po pierwsze zaznaczamy opcję enabled aby nasz serwer był włączony.
W następnym kroku musimy sprecyzować nasze urządzenie (Device). Domyślnie /dev/usb/lp0. Jeżeli mamy tylko jedną drukarkę, to w zasadzie nie musimy nic tutaj zmieniać.
W pozycji Interface (Interfejs) wybieramy LAN, czyli nasza serwer druku będzie nasłuchiwać żądań wydruku z sieci lokalnej.
Następnie Port, który domyślnie ustawiony jest na 9100.
Zaznaczenie Bidirectional mode pozostawiamy bez zmian (w przypadku co niektórych drukarek atramentowych tę opcję będziemy musieli wyłączyć).
Następnie klikamy Save & Apply (Zapisz i Zastosuj).
WAŻNE Po całych tych zabawach warto uruchomić nasz router ponownie lub z poziomu terminala uruchomić ponownie serwer p910nd aby uniknąć problemów.
/etc/init.d/p910nd restart
Osobiście tego nie zrobiłem przy pierwszym podejściu i zastanawiałem sięm, dlaczego nie działa 😂.
Instalacja drukarki na komputerze z macOS
Na poniższym przykładzie użyłem macOS Big Sur 11.0.1
Przechodzimy do ustawień systemowych (Settings) i sekcji Drukarki i Skanery (Printers & Scanners).
Za pomocą przycisku + (plus) dodajemy naszą drukarkę.
W oknie Dodaj Drukarkę (Add Printer) wybieramy środkową ikonę i wprowadzamy adres IP naszego routera w polu adresu.
W polu protokół (Protocol) wybieramy HP JetDirect - Socket.
Następnie przechodzimy do pola Use, w którym musimy wybrać, jaką metodą nasz komputer przetwarzał drukowane dokumenty.
Wybieramy Select software… i z listy wybieramy naszą drukarkę. Jeżeli wcześniej podłączaliśmy drukarkę do naszego komputera za pomocą kabla USB i można było na niej drukować, bardzo prawdopodobne, że oprogramowanie będzie dostępne.
Oczywiście, w polu nazwy (Name), które przeskoczyłem, wpisujemy nazwę naszej drukarki, jaką chcemy widzieć w systemie.
Następnie należy nacisnąć przycisk Add (Dodaj) i spróbować coś wydrukować.
Podczas dodawania drukarki możemy otrzymać komunikat, że system nie jest w stanie zweryfikować drukarki w naszej sieci. Nie musimy się za bardzo tym przejmować, więc klikamy przycisk Kontynuuj (Continue).
Instalacja drukarki na komputerze z Windows 10
Na poniższym przykładzie używałem Windows 10 (20H2)
Aby zainstalować drukarkę w systemie Windows 10, z poziomu menu Start przechodzimy do Ustawień a następnie do sekcji Urządzenia.
Z lewej strony okna wybieramy Drukarki i skanery po czym klikamy na przycisk Dodaj drukarkę lub skaner.
Oczywiście, na tym etapie nasza drukarka nie zostanie wyszukana automatycznie, w związku z tym musimy kliknąć opcję Drukarki, której szukam, nie ma na liście.
W następnym oknie wybieramy Dodaj drukarkę, używając adresu TCP/IP lub nazwy hosta i klikamy Dalej.
W polu adresu wpisujemy IP naszego routera.
Odznaczamy pole Sprawdź drukarkę i automatycznie wybierz sterowniki do użycia, gdyż nasz router nie informuje jaka drukarka jest aktualnie podłączona. Wybieramy przycisk Dalej.
Po chwili system rozpocznie wykrywanie portu TCP/IP.
Gdy to zostanie zakończone, na następnym etapie pozostawiamy domyślnie wybrane ustawienia (Generic Network Card) i klikamy Dalej.
Teraz przyjdzie nam wybrać sterowniki naszego urządzenia.
Podobnie jak w poprzednim kroku, jeżeli wcześniej podłączaliśmy naszą drukarkę za pomocą kabla USB do komputera i mogliśmy drukować bez problemu, wszystko powinno być w systemie.
Po wybraniu tego, czego szukamy, klikamy Dalej.
W następnym kroku możemy sprecyzować nazwę naszej drukarki lub zostawić domyślnie wybraną przez system. Klikamy Dalej.
Na pytanie, czy chcemy udostępnić drukarkę w sieci, wybieramy Nie udostępniaj tej drukarki, gdyż jest ona już w sieci.
W ostatnim kroku będziemy mieli możliwość wydrukowania strony testowej. Jeżeli wszystko wykonaliśmy poprawnie, drukarka powinna zacząć drukować.
Ale co z AirPrint?
I tak jak nie chciałem iść drogą CUPS, który dodałby mi AirPrint w prosty sposób, musiałem pomyśleć co dalej.
Czytając głębiej, dowiedziałem się co nieco, że AirPrint korzysta z protokołu IPP. Serwer p910nd działa na zasadzie AppSocket ze wsparciem protokołu LPD/LPR.
Dodatkowo AirPrint wymaga obsługi mDNS (Bonjour/Avahi) w celu wykrycia drukarki przez urządzenia Apple.
Pakiet avahi dostępny jest z poziomu pakietów w OpenWrt.
Ale po kolei.
Najpierw upewniłem się, że drukarka wykrywana jest w sieci automatycznie.
Automatyczne wykrywanie drukarki w sieci
W tym celu wykorzystujemy wpisy w usłudze avahi.
Jeżeli nie mamy avahi w systemie, zainstalujemy je w następujący sposób:
opkg update
opkg install avahi-daemon
Zgodnie z oryginalnym wpisem tworzymy nowy plik z poziomu terminala nano /etc/avahi/services/printer.service
i wklejamy poniższą zawartość.
<?xml version="1.0" standalone='no'?><!--*-nxml-*-->
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
<name replace-wildcards="yes">Samsung CLP-325 on %h</name>
<service>
<type>_pdl-datastream._tcp</type>
<port>9100</port>
<txt-record>qtotal=1</txt-record>
<txt-record>note=room 2</txt-record>
<txt-record>ty=Samsung CLP-325</txt-record>
<txt-record>product=(Samsung CLP-320 series)</txt-record>
<txt-record>usb_MFG=Samsung</txt-record>
<txt-record>usb_MDL=CLP-320 series</txt-record>
<txt-record>Color=F</txt-record>
<txt-record>Duplex=F</txt-record>
<txt-record>Bind=F</txt-record>
<txt-record>Collate=F</txt-record>
<txt-record>Sort=F</txt-record>
<txt-record>Staple=F</txt-record>
<txt-record>Punch=F</txt-record>
<txt-record>PaperMax=legal-A4</txt-record>
</service>
</service-group>
Oczywiście, nazwę drukarki dostosowujemy do naszych potrzeb.
Uruchamiamy ponownie usługę:
/etc/init.d/avahi-daemon restart
W przypadku macOS wartość w sekcji product=
odpowiada za nazwę sterownika w systemie, dzięki czemu nasza drukarka nie tylko będzie wykrywana automatycznie, ale również system wybierze poprawne sterowniki.
Jak jednak zauważysz, drukarka jest prawidłowo wykrywana w systemie macOS, ale nie w Windows 10.
Taka to natura avahi oraz brak wsparcia ze strony Windows 10.
W przypadku systemu Windows 10, dodawanie drukarki musimy wykonać w sposób bardziej manualny, tak jak opisałem powyżej.
Drukowanie z telefonu (w tym iPhone)
Niestety, przy zastosowaniu p910nd jako serwera druku, nici z dodania obsługi AirPrint.
Po mału zacząłem się z tym oswajać (szukając innego rozwiązania), ale postanowiłem poeksperymentować.
Otóż skoro moja drukarka działa w sieci, jest wykrywana przez system macOS automatycznie, to może jest nadzieja.
HP (obecny właściciel sekcji drukarek Samsunga), tak jak i inni producenci wypuszczają własne oprogramowanie dla urządzeń przenośnych (czy to z Androidem, czy iOS/iPadOS) umożliwiających drukowane, nawet w przypadku, gdy nie ma możliwość wykorzystania natywnie wbudowanej opcji w system tj. AirPrint.
Sięgnąłem więc po aplikację Mobile Print (Android, iOS/iPadOS).
Mimo, że nie jestem fanem tego typu rozwiązań, tak jak większość użytkowników, o czym świadczą bardzo niskie oceny, nic więcej mi nie zostało.
Po uruchomieniu aplikacji kliknąłem napis Select Device aby dodać urządzenie i po chwili zobaczyłem, że moje urządzenie jest wykrywane poprawnie! Do więcej, po dodaniu go do programu nagle wyświetliła się jako dostępna z zielonym ptaszkiem.
Szybko wydrukowałem jedno zdjęcie z mojej galerii. Coś, czego bym się nie spodziewał, wydruk się pojawił i to tak jak powinien.
A więc działa!
Mimo że połowiczny sukces (nadal nie mam wygodnego AirPrint), to mogę drukować.
No ale co z AirPrint?
Niestety, z wykorzystaniem OpenWrt, na obecnym etapie rozwojowym nie jest to możliwe. Koniec i kropka.
Oczywiście jest nadzieja dzięki projektowi OpenPrinting/ipp-usb, ale to może w przyszłości.
Użycie p910nd zamiast CUPS ma swoje wady i zalety.
Zaletą, jak wspomniałem wcześniej, jest mała zasobożerność, dzięki czemu można go zainstalować i używać bez problemów nawet na mało wydajnym routerze. Serwer druku jest szybki, przygotowanie druku (spooling) następuje po stronie klienta i wysyłane jest bezpośrednio do drukarki.
Wadą jest natomiast chociażby brak obsługi AirPrint, przez co drukowanie z telefonów tj. iPhone, odbywać się może tylko dzięki dodatkowej aplikacji, tak jak wspomniałem wcześniej.
Co więc pozostaje?
Cel niniejszego wpisu, czyli dodanie drukarki USB do routera z OpenWrt, umożliwiający drukowanie w sieci został osiągnięty.
Dla mnie jednak to nie wystarczy, więc całość powyżej traktuje raczej jako eksperyment i skusze się jeszcze raz na wykorzystanie Raspberry Pi.
Tym razem, na The Pi Hut kupiłem Raspberry Pi Zero W, które kosztowało tylko £9.30 (~46.60zł)! Do tego dokupiłem kabel mini-HDMI (bo akurat tego nie miałem) - £2.40 (~12zł) oraz obudowę za £3.00 (15zł). Wykorzystując jakąś nieużywaną ładowarkę do telefonu (1.5A), rozwiązałem problem ładowania. Wykorzystałem również walającą się w szufladzie kartę microSD oraz przejściówkę microUSB na pełnowymiarowy port USB. I tak z wykorzystaniem czystego Raspbian oraz doinstalowanego pakietu CUPS mogę w prosty sposób otrzymać własny, bezprzewodowy oraz mało prądożerny serwer druku… z obsługą AirPrint.
Ah.. mogłem tak zrobić od razu, ale wolałem sprawdzić, czy nie da się wykorzystać tego, co już mam. A nóż komuś powyższe rozwiązanie się przyda.
Pozdrawiam.