Heb je nog een oude USB-scanner die je graag zou gebruiken op al jouw apparaten thuis? In deze korte workshop configureren we een Raspberry Pi om een scanner te delen via het netwerk. We bekijken ook kort verschillende clients: een web interface, een applicatie voor Linux en een Android app.
Filip Vervloesem
Voor deze workshop heb je uiteraard een Raspberry Pi nodig en een USB-scanner. Het maakt niet echt uit welke Pi je hebt. Wij deden de test met een Pi 4, maar ook oudere modellen werken prima. Let wel op of de voeding van de Pi krachtig genoeg is wanneer je een scanner gebruikt zonder externe voeding. Bij twijfel sluit je de scanner beter aan via een USB-hub met een eigen voedingsadapter. We gaan ervan uit dat je Raspberry Pi OS reeds geïnstalleerd hebt, toegang hebt via SSH en dat je een beetje vertrouwd bent met de commandline. Indien je het OS nog moet installeren en je de Pi uitsluitend als server zult gebruiken, kies dan de Lite-versie zonder grafische desktop. Linux ondersteunt scanners via het SANE-pakket. Dat is geen standaardonderdeel van het OS, dus installeer je het met:
$ sudo apt install sane-utils
Scanner zoeken
Sluit vervolgens je scanner aan, schakel hem indien nodig in en controleer of je Pi ‘m ziet:
$ lsusb Bus 001 Device 007: ID 04a9:2220 Canon, Inc. CanoScan LIDE 25
Vind je jouw scanner niet terug in het lijstje, dan is er mogelijk iets mis met de voeding of de aansluiting en heeft het geen zin om verder te gaan. Staat die er wel tussen, controleer dan eerst of SANE een driver bevat voor jouw scanner. In onze test met een Canon CanoScan LiDE25 was dat bijvoorbeeld de plustek-driver:
$ sudo scanimage -L
device `plustek:libusb:001:009′ is a Canon CanoScan LiDE25 flatbed scanner
Met het volgende commando voert SANE een snelle test uit om te controleren of de scanner naar behoren werkt:
$ scanimage -T
Zie je uitsluitend “PASS” in de resultaten verschijnen, dan is alles in orde.
Configuratie
De configuratie van die driver vind je in /etc/sane.d/plustek.conf en de documentatie via man sane-plustek. Meestal hoef je niets te veranderen aan de driverconfiguratie. Mocht jouw scanner niet correct herkend worden, dan los je dat mogelijk op door een extra configuratiebestand aan te maken in /etc/sane.d. Voor meer informatie verwijzen we je naar https://bit.ly/3e8LIHj. Een tip: SANE gaat bij elke actie alle drivers af om jouw scanner automatisch te detecteren. Dat proces verloopt véél sneller als je enkel de correcte driver laadt. Maak eerst een kopie van het configuratiebestand:
$ sudo cp /etc/sane.d/dll.conf /etc/sane.d/dll.conf.orig
En verwijder vervolgens alle drivernamen behalve die voor jouw scanner.
Web interface
SANE werkt via een client-serverarchitectuur. Het saned-proces wacht in de achtergrond netjes op aanvragen van clients om te scannen. Door die modulaire architectuur bestaan er niet alleen verschillende grafische clients, maar ook clients voor de commandline en zelfs webbased clients. Scanimage is een voorbeeld van een commandline client. In de rest van deze workshop gaan we aan de slag met een webbased client en twee grafische clients. Als webbased client kozen we scanservjs. Installeer om te beginnen enkele benodigde systeempakketten:
$ sudo apt install imagemagick npm nodejs
Download vervolgens het .tar.gz-bestand van de laatste scanservjs release via https://github.com/sbs20/scanservjs/releases (wij hebben v1.0.3 getest). Kopieer dat bestand naar je Pi en start het installatiescript:
$ tar xzf scanservjs_20200618.221154.tar.g $ cd scanservjs $ sudo ./install.sh
Daarna surf je naar: http://<ip-adres-van-je-pi>:8080.
Minimale interface
De interface van scanservjs is erg minimaal, maar biedt wel alle noodzakelijke opties aan. Je kunt een preview maken, een gebied selecteren om te scannen en zaken instellen zoals resolutie, kleur, helderheid, contrast en uitvoerformaat. Wij kregen meteen een foutmelding zodra we een preview probeerden te maken: scanservjs kreeg geen toegang tot de scanner. Dat kwam blijkbaar door een bug in SANE waardoor de bestandsrechten niet correct worden ingesteld voor usb-scanners. Je kan makkelijk controleren of die bug ook bij jou aanwezig is. In de uitvoer van scanimage zie je twee getallen bij jouw scanner staan, bijvoorbeeld 001:009. Plaats die getallen in volgend commando:
$ ls -l /dev/bus/usb/001/009
crw-rw-r--+ 1 root root 189, 8 Jul 9 16:05 /dev/bus/usb/001/009
Staat er géén + aan het einde van de bestandsrechten? Maak dan een nieuw udev-configuratiebestand aan:
$ sudo nano /etc/udev/rules.d/65-libsane.rules
Met als tekst:
ENV{libsane_matched}=="yes", RUN+="/bin/setfacl -m g:scanner:rw $env{DEVNAME}"
En herlaad vervolgens de udev-configuratie:
$ sudo udevadm trigger
Voor elke scan verschijnt er onderaan een link naar een nieuw bestand. Vergeet niet om die bestanden via het x-icoontje na het downloaden te verwijderen, anders blijven ze in de lijst staan. Nog een laatste tip: werkt scanservjs niet meer nadat je de scanner even losgekoppeld had? Dat komt doordat de apparaatnaam dan wijzigt (bijvoorbeeld van plustek:libusb:001:009 naar plustek:libusb:001:010) en scanservjs nog de oude naam gebruikt. Pas die naam dus aan /var/www/scanservjs/device.conf.
Linux
Gebruik je liever een desktop-applicatie om te scannen? Dat kan! Je moet op je client enkel aangeven op welk IP-adres de SANE-server beschikbaar is. Open daarvoor het client-configuratiebestand:
$ sudo xed /etc/sane.d/net.conf
En voeg het IP-adres van jouw Pi toe, bijvoorbeeld:
192.168.1.44
Open vervolgens een scanapplicatie zoals Simple Scan of XSane. Als er op jouw client geen andere scanner aangesloten is, hoef je verder niets te doen. Simple Scan en XSane detecteren automatisch de gedeelde scanner en gebruiken die meteen. In de applicaties merk je eigenlijk geen verschil tussen een gedeelde netwerkscanner of een lokaal aangesloten scanner. SANE stuurt immers de gescande data over het netwerk naar jouw client-applicatie. Je kan de scans dus meteen op de client bewaren en hoeft ze niet vanaf de Pi te downloaden.
Android
Ook een Android smartphone of tablet kan overweg met onze Pi scanserver. Daarvoor installeer je de SANEDroid app van Matthew Baker (http://bit.ly/2oXjjuu) en ga je naar Preferences in het contextmenu. Klik op SANE_NET_HOSTS en vul het IP-adres van je Pi in. Eventueel kies je nog een andere directory om de scans te bewaren (Scan Directory). Klik vervolgens op Refresh Device List in contextmenu om je scanner te detecteren. Klik tenslotte op Scan om te starten met scannen. Opties zoals resolutie, kleur, enzovoorts stel je in via de tweede knop rechtsboven. Daar vind je ook de optie om eerst een preview te maken en het scangebied te selecteren.
Vernieuwde apparaten
Een Raspberry Pi is ideaal om extra functionaliteit toe te voegen aan oude apparaten. Een oude usb-scanner vorm je voor enkele tientjes om naar een netwerkscanner die je zelfs vanaf je tablet of smartphone bedient. Dat bespaart je de aanschaf van een nieuw apparaat én je hebt intussen weer wat opgestoken over Linux. Dat is een win-win situatie als je het ons vraagt!