sobota, 8 marca 2014

Skanowanie po naciśnięciu przycisku na skanerze

Cel:

Skanowanie za pomocą skanera (Canon MP360) po naciśnięciu przycisku.

Opis sytuacji:

Skaner (drukarka wielofunkcyjna) stoi sobie w pokoju koło serwera z Linux-em. Aby zeskanować trzeba podpiąć drukarkę do laptopa, lub do jakiegoś innego komputera. Pomysł jest taki, że można podłączyć skaner do serwera i po naciśnięciu przycisku uruchomić skanowanie, którego wynikiem będzie plik png w danej lokalizacji.

Przygotowanie:


Aby możliwe było skanowanie konieczne są pakiety: sane-utils, sane i cups

Cups są potrzebne aby drukarka była widoczna przez sane.
Po instalacji pakietów należy sprawdzić czy wszystko działa:

scanimage -L


Wynik powinien być podobny do:
device `pixma:04A9263C_8027C0' is a CANON PIXMA MP360 multi-function peripheral

Z pomocy polecenia scanimage można wyczytać jakie dodatkowe opcje ma dany backend sane do skanowania.

Mięsko


Czyli skrypt, który umożliwi więcej niż jedno skanowanie przeniesie wynik do odpowiedniego katalogu:
#!/bin/bash

CURRENT_SCAN_FILE=/tmp/current_scan_file.tiff
OUTPUT_DIR=/mnt/shared/skany
RESOLUTION=300

EMAIL_ADDRESS="root@sobczak.tk"
EMAIL_SUBJECT="Scan image fail"
EMAIL_MESSAGE="/tmp/scaner_fail.msg"

PID_FILE="/var/run/scan-after-button.pid"

if [ ! -d "$OUTPUT_DIR" ]; then
        mkdir $OUTPUT_DIR
fi


echo $$ > $PID_FILE

while true; do
        scanimage --resolution $RESOLUTION --button-controlled=yes > $CURRENT_SCAN_FILE
        if [ $? == 0 ]; then
                CURRENT_TIME=`date +%F_%H.%M.%S`
                convert "${CURRENT_SCAN_FILE}" "${OUTPUT_DIR}/${CURRENT_TIME}.png"
        else
                echo "Scan failed. scanimage output code: $?" > $EMAIL_MESSAGE
                sleep 10;
                mail -s "$EMAIL_SUBJECT" "$EMAIL_ADDRESS" < $EMAIL_MESSAGE
        fi
done

Automatyzacja

Kolejnym krokiem jest dodanie automatyzacji. Umieszczamy skrypt w katalogu /usr/local/sbin/ i sprawdzamy czy wszystko działa jak należy (nie zapomnij o nadaniu praw do wykonywania). Teraz tworzymy skrypty udev dzięki, któremu będziemy mogli reagować na włączenie/wyłączenie skanera. /usr/local/sbin/start-scan-after-button.sh
#!/bin/bash

PID_FILE="/var/run/scan-after-button.pid"

/sbin/start-stop-daemon --start --pidfile $PID_FILE  --background --exec /usr/local/sbin/scan-after-button.sh
/usr/local/sbin/stop-scan-after-button.sh
#!/bin/bash

PID_FILE="/var/run/scan-after-button.pid"
PID=`cat ${PID_FILE}`

pkill -P $PID && kill $PID

rm $PID_FILE
i /etc/udev/rules.d/85-scan-ater-button.rules
ACTION=="add", ENV{ID_MODEL}=="MP360_Series", RUN+="/usr/local/sbin/start-scan-after-button.sh"
ACTION=="remove", ENV{ID_MODEL}=="MP360_Series", RUN+="/usr/local/sbin/stop-scan-after-button.sh"

Brak komentarzy: