TL-MR3020 + OpenWRT + Sane = Scan-Server

TP-Link TL-MR3020 und Fujitsu fi-4120C

TP-Link TL-MR3020 und Fujitsu fi-4120C

Ich verfolge schon lange das Ziel, eingehende Post direkt durch einen Scanner zu ziehen, um sie dann in einer Kiste verschwinden und rein elektronisch weiter verarbeiten zu können. Das mag übertrieben aufwändig klingen, aber erfahrungsgemäß kann ich in Dateien besser den Überblick behalten als in Papierstapeln. Und leider bin ich nicht ordentlich genug um Briefe sortiert abzuheften. Außerdem, selbst wenn: packe ich den Brief wegen der KFZ-Steuer zum Finanzamt oder zum Auto? Im Computer ist das ein Symlink…

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 und files/etc/config/network — Konfiguration für mein Netz
  • files/etc/config/system — Hostnamen einstellen
  • files/etc/fstab — ein Laufwerk von meinem Server mounten
  • files/etc/hotplug.d/button/buttons — ruft das Scan-Skript auf
  • files/root/scan.sh — das eigentliche Scan-Skript
  • files/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:

Und zum anderen das eigentliche Scan-Skript files/root/scan.sh:

Sind diese Dateien angelegt ist man nur noch einen Make-Aufruf von der eigenen Firmware entfernt:

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:

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.

5 Kommentare

  1. 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

  2. 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:

    1. 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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

;-) :-) :-D :-| :-/ :-( :-P more »