Nun, um das zu realisieren habe ich schon vor längerer Zeit einen Scanner gekauft. Fujitsu fi-4120C. Altes Modell, aber immerhin ein echter Dokumentenscanner, mit Duplex und automatischem Einzelblatteinzug. Eigentlich wollte ich den mit einem Raspberry ins Netz bringen, kürzlich ist aber bei einer anderen Bastelei ein TP-Link TL-MR3020 abgefallen. Den kriegt man gebraucht schon unter 20 Euro, und in Kombination mit der freien Firmware OpenWRT ist das echt interessantes Spielzeug — das sogar Pakete enthält die meinen Scanner befeuern können.
Leider ist der Router so klein dass mit einer Standard-Installation von OpenWRT kein Platz mehr für meine Zwecke ist. Und einfach Pakete deinstallieren geht nicht, die vorinstallierten wird man nicht los. Es sei denn man baut ein eigenes Image-File…
Glücklicherweise ist das mit dem Image Generator kein Problem. In dem Paket ist alles wichtige vorcompiliert enthalten. Das stellt man sich geeignet zusammen, pflegt bei Bedarf ein paar eigene Dateien ein und fertig ist die Laube. In meinem Fall habe ich folgende Dateien angelegt, alle in einem Unterordner files
unter dem entpackten OpenWRT-Paket:
files/etc/resolv.conf
undfiles/etc/config/network
— Konfiguration für mein Netzfiles/etc/config/system
— Hostnamen einstellenfiles/etc/fstab
— ein Laufwerk von meinem Server mountenfiles/etc/hotplug.d/button/buttons
— ruft das Scan-Skript auffiles/root/scan.sh
— das eigentliche Scan-Skriptfiles/etc/zabbix_agentd.conf
— Überwachung mit Zabbix (soviel Platz war noch frei )
Das ist alles keine Raketentechnik. Zentral sind aber die beiden Dateien die mit dem Scanner zu tun haben (hätte ich auch in einer Datei machen können, finde ich so aber übersichtlicher). Zum einen ist das files/etc/hotplug.d/button/buttons
, das wird vom Hotplug-Daemon gestartet sobald der Button auf dem Router gedrückt wird:
1 2 3 4 5 6 |
#!/bin/sh SCAN=/root/scan.sh if [ $ACTION == "pressed" ]; then logger "Button pressed, calling $SCAN" $SCAN fi |
Und zum anderen das eigentliche Scan-Skript files/root/scan.sh
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#!/bin/sh MOUNTPOINT=/mnt TEMPDIRECTORY=$MOUNTPOINT/temp OUTDIRECTORY=$MOUNTPOINT/in.ocr DATE=$(date +%Y%m%d-%H%M%S) logger "preparing to scan page to $TEMPDIRECTORY/$DATE" if [ ! -d $TEMPDIRECTORY ]; then logger "mounting $MOUNTPOINT" mount $MOUNTPOINT fi if [ ! -d $TEMPDIRECTORY ]; then logger "FATAL: target dir doesn't exist: $TEMPDIRECTORY" exit 1 fi scanimage --format=tiff --source "ADF Duplex" --resolution=300 \ --batch=$TEMPDIRECTORY/$DATE-scan-%03d.tif mv $TEMPDIRECTORY/$DATE-* $OUTDIRECTORY |
Sind diese Dateien angelegt ist man nur noch einen Make-Aufruf von der eigenen Firmware entfernt:
1 2 3 |
make image PROFILE=TLMR3020 FILES=files/ PACKAGES="nfs-utils kmod-fs-nfs \ portmap sane-frontends sane-fujitsu zabbix-agentd -firewall -iptables -ip6tables \ -kmod-ath9k -kmod-ip6tables -kmod-ipv6 -odhcp6c -ppp -ppp-mod-pppoe" |
Nach kurzer Bauzeit lag in meinem Fall unter bin/ar71xx
eine Datei die ich vermutlich auch direkt aus der originalen Firmware hätte flashen können. Da ich schon OpenWRT und somit eine Shell auf dem Router hatte konnte ich das dort machen:
1 |
sysupgrade -n openwrt-15.05.1-ar71xx-generic-tl-mr3020-v1-squashfs-factory.bin |
Die Installation beendet sich mit einem Reboot. Per Telnet komme ich direkt auf das Gerät, da es sich ja direkt in mein Netz verbinden kann (kabelgebunden, ich habe eine Steckdose an der Stelle wo der Scanner stehen soll). Und mit scanimage -L
sehe ich direkt den Scanner: device `fujitsu:fi-4120Cdj:44135' is a FUJITSU fi-4120Cdj scanner
. Und scannen kann ich direkt auf Knopfdruck aus dem Skript heraus.
Ich habe mir auch schon Skripte gebastelt die die Scans weiter verarbeiten. Leere Seiten rausfischen, alles gerade rücken, Texte erkennen, komprimieren und Sandwich-PDF erstellen. So habe ich jetzt einen Haufen elektronisch durchsuchbarer Dokumente. Was mir noch fehlt ist eine nette Lösung um die dann auch zu archivieren. Mit Suchfunktion und so. Bis jetzt nutze ich Alfresco, aber für zu Hause ist das zu groß und zu umständlich. Für Tipps bin ich offen!
Das einzige was ich jetzt noch zu meinem Glück fehlt ist eine Möglichkeit, herauszufinden in welchem Zustand sich der Scanner befindet. Der hat eine Taste und eine Anzeige ‚Function‘, damit könnte ich dann die weitere Verarbeitung des Scans steuern… mal sehen, vielleicht finde ich dafür auch noch was. Mit scanimage -A
sehe ich dass das irgendwie implementiert ist, aber ich habe noch nicht herausgefunden wie ich es benutzen kann.
Großartiges Tutorial, ich bin schon länger am überlegen, genau so was zu bauen, aber ich wäre nicht auf die Idee gekommen, das mit einem MR3020 zu realisieren. Da ich davon auch einen habe (und auch einen Dokumentenscanner), hab ich mich mal dran gemacht, das nachzubauen, dabei sind mir einige Sachen aufgefallen, die noch fehlen, bzw. die man anders machen könnte.
Ich werd das wohl selber noch mal verbloggen, aber ich wollte das hier auch schon mal anbringen.
Zum einen will man natürlich die Sane-Pakete für „seinen“ Scanner mitinstallieren (in meinem Fall für einen Canon DR-2080C), zum anderen sollte man noch das File „/etc/TZ“ mit dem Inhalt „CET-1CEST,M3.5.0,M10.5.0/3“ anlegen, da sonst die Scans immer nach UTC datiert werden.
Darüber hinaus hab ich beide Scripte so angepasst, dass man den Schiebe-Schalter am 3020 benutzen kann, um einen „Modus“ festzulegen:
Schalterposition AP: Farbe, 150DPI, nur Vorderseite
Schalterposition WISP: S/W, 200 DPI, nur Vorderseite
Schalterposition 3G: S/W, 200 DPI, Duplex
„Farbe mit Duplex“ hab ich mal ausgelassen, weil der Schalter nur 3 Positionen hat, und ich das eh am seltensten brauche, kann man aber ja ändern wie man will.
meine „buttons“-datei:
root@scanner:~# cat /etc/hotplug.d/button/buttons
#!/bin/sh
SCAN=/root/scan.sh
if [ $ACTION == „pressed“ ] && [ $BUTTON == „wps“ ] ; then
logger „WPS Button pressed, calling $SCAN“
$SCAN
fi
und entsprechend meine scan.sh:
root@zeus-mobil:~# cat scan.sh
#!/bin/sh
MOUNTPOINT=/mnt
TEMPDIRECTORY=$MOUNTPOINT/scanner/temp
OUTDIRECTORY=$MOUNTPOINT/scanner/in.ocr
DATE=$(date +%Y%m%d-%H%M%S)
# determine switch position
# 3G: sw1=1, sw2=0 -> B/W, Duplex
# WISP: sw1=0, sw2=1 -> B/W, single
# AP: sw1=1, sw2=1 -> color, single
if grep -qe „sw1.*in hi“ /sys/kernel/debug/gpio ; then
SW1=“1″
else
SW1=“0″
fi
if grep -qe „sw2.*in hi“ /sys/kernel/debug/gpio ; then
SW2=“1″
else
SW2=“0″
fi
if [ $SW1 == „1“ ] && [ $SW2 == „1“ ]; then
SLIDER=“AP“
MODE=“Color“
SOURCE=“ADF Front“
RES=“150″
elif [ $SW1 == „1“ ] && [ $SW2 == „0“ ]; then
SLIDER=“3G“
MODE=“Gray“
SOURCE=“ADF Duplex“
RES=“200″
elif [ $SW1 == „0“ ] && [ $SW2 == „1“ ]; then
SLIDER=“WISP“
MODE=“Gray“
SOURCE=“ADF Front“
RES=“200″
else
logger „Unable to read slider position, aborting“
exit 1;
fi
logger „#####“
logger „Slider set to $SLIDER, lets begin…“
logger „mode is „$MODE“ from $SOURCE in $RES dpi“
logger „preparing to scan page to $TEMPDIRECTORY/$DATE“
if [ ! -d $TEMPDIRECTORY ]; then
logger „mounting $MOUNTPOINT“
mount $MOUNTPOINT
fi
if [ ! -d $TEMPDIRECTORY ]; then
logger „FATAL: target dir doesn’t exist: $TEMPDIRECTORY“
exit 1
fi
scanimage –format=tiff –source „$SOURCE“ –mode „$MODE“ –resolution=“$RES“ –batch=$TEMPDIRECTORY/$DATE-scan-%03d.tif
logger „Scanning done“
mv $TEMPDIRECTORY/$DATE-* $OUTDIRECTORY
exit 0;
Das ist dann etwas länger ausgefallen, aber es funktioniert auf jeden Fall. Gibt es eigentlich WordPress-Plugins, die Quelltext in Kommentaren schön machen? Naja egal. Ansonsten bleibt nur noch zu sagen, dass ich die DPI weit runterdrehen musste. obwohl der DR-2080C nominell 600 DPI kann, ist er hin und wieder bei 300 DPI abgestürzt, ich weiss nicht ob das am Scanner, oder am begrenzten Arbeitsspeicher vom TP-Link liegt, aber 200DPI-S/W reicht ja auch eigentlich.
-zeus
Cool, Danke! Das mit der Zeit hat mich zwar irritiert, aber nicht genug um dem wirklich nachzugehen. Das mit dem Schiebeschalter ist eine sehr gute Idee, das werde ich bei mir auch noch nachruesten. Auf Duplex muss ich wohl nicht verzichten, ich habe nachgelagert ein Skript das leere Seiten entfernt, OCR macht und ein PDF baut. Allerdings nicht mehr auf dem kleinen Router.
Schoene Quelltexte… ich teste mal:
na dann kriegste demnächst noch mal mehr zu testen. was ich noch nachimplementiert habe, ist, dassdie 3 LEDs zwischen der „power on“ led und dem taster nun die schalterstellung indiziieren. mit nem ettikettiergerät schnell noch draufgeschrieben, was was tut, und das ganze is von der usability ein ganzes stück netter. darüber hinaus ist die LED des tasters by default nun aus, der leuchtet, sobald man die taste drückt, und geht wieder aus, wenn der scanvorgang beendet ist…will heissen, wenn das scanscript mit „0“ exited.
das hat 2 vorteile:
1: man sieht, ob der scanvorgang schon beendet ist, bevor man das nächste scannt. je nach dem ob und wie viel post-processing man macht, ist das eine wichtige information (z.B. wenn man mit scanimage noch croppt, oder rotated oder so).
2: man sieht direkt, ob das script beendet wurde, und auch ob erfolgreich.
also quasi max responsiveness durch eine LED…
das einzige was noch fehlt, ist, dass wenn das script mit 1 exited, dass der taster dann 3x blinkt oder so, aber das sind dann ja auch nur noch 2 zeilen.
wenns fertig ist, verblogge ich das mal.
ansonsten, was ich fast vergessen hätte:
deine „Skripte […] die die Scans weiter verarbeiten, leere Seiten rausfischen, alles gerade rücken, Texte erkennen, komprimieren und Sandwich-PDF erstellen“….
…die hätte ich auch gerne…
-zeus
so, fertig: https://blog.tastatursport.de/2016/09/tl-mr3020-openwrt-sane-scan-server-die-zweite/
Schick! Ein paar von Deinen Ideen muss ich dann auch noch bei mir implementieren.