Raspberry Pi
Créer une station de numérisation avec scanbd (Raspbian)
Recherche…
Introduction et installation
L'objectif de cette documentation est d'utiliser un scanner sans interface utilisateur. Une utilisation courante consiste à télécharger un fichier PDF numérisé directement sur Google Drive ou Dropbox en appuyant simplement sur les boutons du scanner.
scanbd permet de déclencher des actions à partir des boutons du scanner, il utilise sane.
Ce qui rend les choses un peu plus compliquées est que, en interrogeant le scanner, scanbd verrouille le périphérique. Comme nous avons également besoin d'analyser à partir d'outils locaux (comme scanimage), nous devons définir un proxy qui va interrompre scandb de l'interrogation si nécessaire. C'est le travail de scanbm, qui surveille le réseau et donne la priorité sur scanbd à tout accès local au scanner.
Il faut donc:
- Configurez la configuration sane locale pour analyser uniquement à partir du réseau (via scanbm)
- Configurer scanbd pour avoir accès et interroger le scanner local
En tant que root :
apt-get update
apt-get install libconfuse-dev libsane-dev libudev-dev libusb-dev xinetd
La dernière version de scanbd peut être trouvée ici: https://sourceforge.net/projects/scanbd/files/releases/
# Download the latest version of **scanbd**.
wget https://sourceforge.net/projects/scanbd/files/releases/scanbd-1.4.4.tgz/download
# Uncompress
tar xvzf scanbd-1.4.4.tgz && cd 1.4.4
# Configure with the installation path in /etc/
./configure --disable-Werror
# install it
make
make install
# Add a dbus policy to authorize "saned" user to manage scanbd :
cp integration/scanbd_dbus.conf /etc/dbus-1/system.d/
# Add the init script to manage the daemon :
cp integration/scanbd.debian /etc/init.d/scanbd
scanbd est maintenant installé mais pas encore configuré.
Configurer sain pour numériser à partir du réseau
La configuration locale de sane se trouve dans /etc/saned.d
/etc/sane.d/dll.conf
# /etc/sane.d/dll.conf - Configuration file for the SANE dynamic backend loader
#
# Backends can also be enabled by configuration snippets under
# /etc/sane.d/dll.d directory -- packages providing backends should drop
# a config file similar to dll.conf in this directory, named after the package.
#
# The next line enables the network backend; comment it out if you don't need
# to use a remote SANE scanner over the network - see sane-net(5) and saned(8)
net
dll.conf ne contient que le backend net .
/etc/sane.d/net.conf
# This is the net backend config file.
## net backend options
# Timeout for the initial connection to saned. This will prevent the backend
# from blocking for several minutes trying to connect to an unresponsive
# saned host (network outage, host down, ...). Value in seconds.
connect_timeout = 3
## saned hosts
# Each line names a host to attach to.
# If you list "localhost" then your backends can be accessed either
# directly or through the net backend. Going through the net backend
# may be necessary to access devices that need special privileges.
localhost
À ce stade, scanbm n'est pas encore configuré, aucun scanner ne peut être atteint depuis le réseau. Nous devons configurer scanbm avec scanbd pour tester la configuration.
Configurer scanbd pour interroger le scanner local
Identifier le scanner local
En utilisant lsusb, identifiez le productId (1909 ici):
pi:# lsusb
pi:# Bus 001 Device 005: ID 04a9:1909 Canon, Inc. CanoScan LiDE 110
Avec cet productId , grep le fichier de configuration correct (cela dépend de votre modèle de scanner, pour moi c'est genesys.conf ):
pi:# grep 1909 /etc/sane.d/*conf
pi:# /etc/sane.d/genesys.conf:usb 0x04a9 0x1909
Copiez le fichier dans votre dossier de configuration scanbd:
cp /etc/sane.d/genesys.conf /usr/local/etc/scanbd/
cp /etc/sane.d/dll.conf /usr/local/etc/scanbd/
Editez /usr/local/etc/scanbd/dll.conf et remplacez net par le bon moteur de numérisation:
# /etc/sane.d/dll.conf - Configuration file for the SANE dynamic backend loader
#
# Backends can also be enabled by configuration snippets under
# /etc/sane.d/dll.d directory -- packages providing backends should drop
# a config file similar to dll.conf in this directory, named after the package.
#
# The next line enables the network backend; comment it out if you don't need
# to use a remote SANE scanner over the network - see sane-net(5) and saned(8)
genesys
Confirmez que le scanner local est détecté par scanbd
Nous sommes maintenant prêts à tester:
scanbd -d7 -f
Evitez autant que possible de manipuler l'envir SANE_CONFIG_DIR. Cela peut casser des choses, la valeur par défaut est déjà configurée dans /usr/local/etc/scanbd/scanbd.conf et dans le script init.
La sortie doit être similaire à:
scanbd: foreground
scanbd: reading config file /usr/local/etc/scanbd/scanbd.conf
scanbd: debug on: level: 7
scanbd: dropping privs to uid saned
scanbd: dropping privs to gid scanner
scanbd: group scanner has member:
scanbd: saned
scanbd: pi
scanbd: drop privileges to gid: 110
scanbd: Running as effective gid 110
scanbd: drop privileges to uid: 110
scanbd: Running as effective uid 110
scanbd: dbus_init
scanbd: dbus match type='signal',interface='org.freedesktop.Hal.Manager'
scanbd: SANE_CONFIG_DIR=/usr/local/etc/scanbd/sane.d
scanbd: sane version 1.0
scanbd: Scanning for local-only devices
scanbd: found device: genesys:libusb:001:005 Canon LiDE 110 flatbed scanner
Le plus important ici est found device .
Que se passe-t-il si "périphérique trouvé" n'apparaît pas?
Vous devriez vérifier à nouveau votre configuration, en particulier la partie identification de cette documentation et effacer toute éventuelle var SANE_CONFIG_DIR env mal définie en tapant:
unset SANE_CONFIG_DIR
Configurez xinetd pour que scanbm écoute sur le réseau
Créez /etc/xinetd.d/sane-port qui contient:
service sane-port
{
port = 6566
socket_type = stream
wait = no
user = saned
group = scanner
server = /usr/local/sbin/scanbm
server_args = scanbm -c /usr/local/etc/scanbd/scanbd.conf
disable = no
}
/! \ Vérifiez le chemin de scanbm avec
which scanbm
Redémarrez ensuite xinetd et démarrez scanbd :
service xinetd restart
/etc/init.d/scanbd start
scanimage -L devrait maintenant afficher le scanner.
La plupart des problèmes à ce stade concernent les autorisations. Assurez-vous que
scanimage -Lfonctionne lorsque vous êtes connecté en tant que saned en faisantsudo -u saned -s.Sinon, vérifiez les autorisations USB:
ls -al /dev/bus/usb/***
Déclencher des actions à partir des boutons du scanner
Les actions se trouvent dans /usr/local/etc/scanbd/scanbd.conf . J'ai 4 boutons qui sont scan , copy , email et file .
Le fichier de configuration par défaut n'inclut pas toutes les actions par défaut, vous devrez probablement ajouter le bloc manuellement. Vous pouvez avoir plus ou moins de boutons selon votre modèle de scanner.
Pour chaque action, nous définirons un chemin personnalisé pour l'option de script .
action scan {
filter = "^scan.*"
numerical-trigger {
from-value = 1
to-value = 0
}
desc = "Scan to file"
# script must be an relative path starting from scriptdir (see above),
# or an absolute pathname.
# It must contain the path to the action script without arguments
# Absolute path example: script = "/some/path/foo.script
script = "/home/pi/scan.sh"
}
N'oubliez pas de commenter toute autre action par défaut à la fin de scanbd.conf:
# devices
# each device can have actions and functions, you can disable not relevant devices
#include(scanner.d/avision.conf)
#include(scanner.d/fujitsu.conf)
#include(scanner.d/hp.conf)
#include(scanner.d/pixma.conf)
#include(scanner.d/snapscan.conf)
#include(scanner.d/canon.conf)
Vous pouvez maintenant créer votre script personnalisé pour gérer chaque action:
Chaque ligne relative à
/sys/class/leds/led0/triggerde contrôler la LED pour surveiller ce qui se passe. Vous pouvez faire ce que vous voulez,cat /sys/class/leds/led0/triggervous donne tous les types de lumières.
/home/pi/scan.sh
#!/bin/bash
# don't forget to create the folder
scan_dir=/home/pi/scanned-files
datetime=`date +%F_%H%M%S`
echo none >/sys/class/leds/led0/trigger
case $SCANBD_ACTION in
scan)
filename=file-$datetime
logger -t "scanbd: $0" "$SCANBD_DEVICE $SCANBD_ACTION - scanning --resolution 150 --mode Color --depth 8 --format=tiff to $scan_dir/$filename.jpg"
echo timer >/sys/class/leds/led0/trigger
scanimage -d $SCANBD_DEVICE --resolution 150 --mode Color --depth 8 --format=tiff --brightness 5 --contrast 20 | convert tiff:- -compress jpeg $scan_dir/$filename.pdf
echo none >/sys/class/leds/led0/trigger
logger -t "scanbd: $0" "Finished scanning"
;;
email)
logger -t "scanbd: $0" "Emailing $scan_dir/file-*pdf"
echo heartbeat >/sys/class/leds/led0/trigger
# here are the lines to send the file
echo none >/sys/class/leds/led0/trigger
esac