[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [translators] [docinfo] [indice analitico] [volume] [parte]
SANE (Scanner access now easy) è un API (Application program interface), ovvero un'interfaccia uniforme per le applicazioni che vogliono comunicare con uno scanner. Oltre a questa API, SANE include una serie di gestori specifici (driver) per una grande quantità di scanner, costituiti da librerie caricate dinamicamente.
Quando si parla di SANE, dal momento che non si tratta di un programma puro e semplice, ma di un sistema di componenti integrati tra di loro, può essere necessario distinguere tra:
il progetto della API e del protocollo di comunicazione, (1) ovvero dell'interfaccia di comunicazione;
le librerie di gestione dei vari scanner, individuate normalmente come il backend, (2) ovvero la parte terminale di SANE;
i programmi frontali, ovvero frontend, che consentono in pratica all'utente di gestire la scansione.
In questo capitolo vengono presi in considerazione principalmente gli scanner USB, mentre per le altre situazioni ci sono solo delle annotazioni superficiali. Per maggiori dettagli conviene leggere la documentazione annotata alla fine del capitolo.
Nel capitolo si fa riferimento anche a scanner raggiunti attraverso la rete. Evidentemente, per comprendere questo meccanismo occorre avere delle competenze sulle reti TCP/IP e su come si configurano queste cose in un sistema Unix comune. Si veda eventualmente il volume III.
Lo scanner comune prevede un sistema meccanico per bloccare il gruppo ottico di scansione, quando questo deve essere trasportato. Questo blocco meccanico è costituito normalmente da una levetta, da una slitta, o da qualcosa di simile. Il problema è che spesso ci si dimentica di sbloccare lo scanner prima di usarlo, cosa che ovviamente impedisce di attuare le scansioni.
|
Quando si pensa a SANE bisogna dare una collocazione ai vari componenti, anche se in modo semplificato, per poter comprendere cosa si sta facendo e dove cercare i problemi quando questi si manifestano.
|
Nella figura si vede la nuvoletta delle librerie che costituiscono la parte terminale di SANE, che va a comunicare effettivamente con lo scanner. Queste librerie vengono gestite da un sistema dinamico di caricamento (sane-dll), con il quale comunicano i programmi frontali, come scanimage e come saned; dove saned si occupa in particolare di offrire attraverso la rete l'accesso allo scanner locale.
La configurazione di SANE riguarda principalmente il sistema di librerie di accesso allo scanner e si trova normalmente nella directory /etc/sane.d/
. Dentro questa directory appaiono normalmente una serie di file con estensione .conf
, dove la radice del nome corrisponde alla libreria particolare da prendere in considerazione. Per esempio, il file hp.conf
si riferisce a un certo gruppo di scanner HP.
Oltre ai file di configurazione di una certa libreria specifica, appare sempre il file dll.conf
, che riguarda la gestione complessiva di queste librerie (dynamic backend loader). Questo file consente di specificare quali librerie utilizzare e quali ignorare del tutto. Ecco un esempio che contiene un estratto del file:
|
Per quanto riguarda la possibilità di offrire l'accesso allo scanner locale attraverso la rete, occorre verificare che il file /etc/services
contenga un riferimento appropriato alla porta 6566 TCP:
|
Inoltre occorre verificare che il supervisore dei servizi di rete sia stato configurato in modo da avviare saned quando viene richiesta quella porta. Nel caso particolare di Inetd, si tratta di intervenire nel file /etc/inetd.conf
con una riga simile a quella seguente:
|
Si osservi che l'avvio del programma saned con i privilegi dell'utente fittizio saned, associato al gruppo saned, come si vede nell'esempio, non è necessariamente corretto. Questo problema viene descritto meglio in un'altra sezione. |
Quindi occorre valutare la configurazione del programma saned, con il file /etc/sane.d/saned.conf
:
|
L'esempio mostra l'abilitazione dell'accesso da tutti gli indirizzi IPv4 privati, compreso quello locale, dell'indirizzo IPv6 loopback e di tutti gli indirizzi IPv6 di tipo site-local.
Per poter accedere a uno scanner remoto messo a disposizione tramite il programma saned, occorre predisporre localmente il file /etc/sane.d/net.conf
con l'indirizzo o il nome dell'elaboratore che ospita questo servizio:
|
Secondo questo esempio si prevede di poter accedere a uno scanner presso l'elaboratore con indirizzo IPv4 192.168.1.2.
Gli scanner sono diversi tra di loro, fondamentalmente per il tipo di connessione fisica che viene utilizzata per arrivare all'elaboratore. A seconda del tipo di collegamento, può essere necessario predisporre il kernel Linux, aggiungendo eventualmente anche i file di dispositivo appropriati.
In generale, la gestione di uno scanner che comunica soltanto attraverso una porta parallela, può essere complicata. Tuttavia, vale la pena di annotare ciò che serve almeno dal punto di vista del Kernel:
{Parallel port support
} (CONFIG_PARPORT)
Inoltre, conviene verificare anche l'hardware della porta parallela, che dovrebbe funzionare in modalità «EPP», oppure «ECP/EPP».
Se lo scanner utilizza la porta parallela simulando una comunicazione SCSI, occorre cercare la documentazione appropriata e modificare il kernel di conseguenza.
Nel caso di scanner SCSI (sezione 49.2.12), oltre alla gestione specifica dell'adattatore SCSI disponibile, occorre abilitare la gestione generica, corrispondente alla voce {SCSI generic support
} (CONFIG_CHR_DEV_SG). Se si compila questa funzione come modulo, lo si può poi caricare con il comando:
#
modprobe sg
[Invio]
Tuttavia, per la gestione generica SCSI occorre disporre anche di file di dispositivo appropriati. Se il contenuto della directory /dev/
viene generato automaticamente, attraverso Devfs (obsoleto) oppure uDev, questi file di dispositivo dovrebbero apparire automaticamente; diversamente occorre verificare che ci siano ed eventualmente provvedere a crearli:
#
cd /dev
[Invio]
#
./MAKEDEV sg
[Invio]
Se non funziona così, occorre usare direttamente il programma mknod:
#
cd /dev
[Invio]
#
mknod sg0 c 21 0
[Invio]
#
mknod sg1 c 21 1
[Invio]
...
#
mknod sg15 c 21 15
[Invio]
#
mknod sg16 c 21 16
[Invio]
Qualunque sia il modo con cui si ottengono i file di dispositivo, occorre poi studiare come organizzare i permessi, ma questo conviene farlo quando è stato chiarito in che modo si comporta la parte terminale di SANE (backend) che vi accede.
Fino ai kernel 2.4 è prevista la gestione di scanner USB, mentre con i kernel 2.6 questa scompare. In generale, non conviene attivare una gestione specifica dello scanner USB da parte del kernel, perché questo problema viene risolto in modo più semplice con l'uso di librerie note come Libusb. Pertanto, basta attivare le voci seguenti:
{Support for Host-side USB
} (CONFIG_USB)
{USB device filesystem
} (CONFIG_USB_DEVICEFS)
{EHCI HCD support
} (CONFIG_USB_EHCI_HCD)
{OHCI HCD support
} (CONFIG_USB_OHCI_HCD)
{UHCI HCD support
} (CONFIG_USB_UHCI_HCD)
A ogni modo, oltre a quanto appena mostrato, è necessario innestare il file system virtuale usbfs, intervenendo nel file /etc/fstab
:
|
Così facendo, è possibile vedere apparire dei file nella directory (virtuale) /proc/bus/usb/
, dei quali è bene osservare anche i permessi e la proprietà:
#
ls -l /proc/bus/usb
[Invio]
totale 0 -rw-r--r-- 1 root root 43 2004-08-03 17:26 001 -rw-rw---- 1 root scanner 57 2004-08-03 19:22 002 -rw-rw---- 1 root scanner 57 2004-08-03 18:45 003 |
In questo caso, si può intuire che il file 001
si riferisce al bus USB, mentre i file 002
e 003
sono riferiti a due scanner già individuati. La cosa importante è osservare che in questo caso, gli scanner sono accessibili dagli utenti che appartengono al gruppo scanner.
Sarebbe possibile cambiare i permessi di questi file in modo da consentire l'accesso a tutti gli utenti comuni di utilizzare gli scanner relativi; tuttavia ciò non conviene, perché basta staccare e riattaccare gli scanner per perdere questa configurazione. |
Per la gestione di uno scanner IEEE 1394 (lo standard è forse più noto con il nome FireWire) è necessario abilitare l'uso di questo tipo di bus, più tutto l'hardware coinvolto:
{IEEE 1394 support
} (CONFIG_IEEE1394)
...
Quando l'utilizzo di SANE è già predisposto dalla propria distribuzione GNU o BSD, dovrebbe essere stato previsto il gruppo di utenti denominato scanner, con il quale dovrebbe essere possibile controllare l'accesso allo scanner stesso. Basta controllare nel file /etc/group
:
|
Quello che si vede nell'esempio è la situazione che si trova con nanoLinux, dove gli utenti tizio, caio, sempronio, mevio e filano risultano aggregati a questo gruppo.
Generalmente, l'utilità di questa procedura serve a dare i permessi adatti ai file di dispositivo; tuttavia, questo meccanismo dovrebbe funziona anche con gli scanner USB quando si utilizza Libusb.
Per poter usare uno scanner attraverso uno dei vari programmi frontali bisogna poterlo individuare. Per fare questo si usa una stringa piuttosto articolata, che ha fondamentalmente la sintassi seguente:
nome_backend:dispositivo |
In pratica, prima dei due punti va messo un nome scelto tra quelli che appaiono nel file di configurazione /etc/sane.d/dll.conf
; si osservi però che la scelta non è sempre ovvia. Nella seconda parte, dopo i primi due punti verticali, si indica ciò che serve a raggiungere il dispositivo, ma questa può essere piuttosto articolata. A titolo di esempio ecco come potrebbe essere individuato uno scanner Canon, Canoscan LiDE 20: plustek:libusb:001:002.
Come si comprende, in questo caso il nome associato al tipo di scanner è «plustek» e non «canon» come sarebbe stato logico aspettarsi.
Fortunatamente vengono in aiuto due metodi per cercare di localizzare lo scanner presso il proprio elaboratore: il programma diagnostico sane-find-scanner e il programma frontale scanimage usato con l'opzione -L. Le prime volte conviene agire come utente root:
#
sane-find-scanner
[Invio]
# No SCSI scanners found. If you expected something different, make sure that # you have loaded a SCSI driver for your SCSI adapter. found USB scanner (vendor=0x04a9 [Canon], product=0x220d [CanoScan], \ |
#
scanimage -L
[Invio]
device `plustek:libusb:001:002' is a Canon N670U/N676U/LiDE20 USB \ |
Dei due programmi, il più attendibile è il primo, che però non specifica il nome da usare per lo scanner (nell'esempio è stata evidenziata l'informazione saliente, che però, in questo caso manca del prefisso plustek:).
Quando si dispone di un solo scanner locale e tutto va bene, come dagli esempi mostrati, si possono usare i vari programmi frontali senza bisogno di specificare le coordinate dello scanner. |
Non è da escludere che sane-find-scanner possa trovare uno scanner che scanimage -L invece non può localizzare.
L'esempio seguente è ottenuto collegando due scanner; uno dei quali è il modello HP Scanjet 4200C, a cui si accede con librerie non standard:
#
sane-find-scanner
[Invio]
# No SCSI scanners found. If you expected something different, make sure that # you have loaded a SCSI driver for your SCSI adapter. found USB scanner (vendor=0x03f0, product=0x0105) at libusb:001:003 found USB scanner (vendor=0x04a9 [Canon], product=0x220d [CanoScan], \ |
#
scanimage -L
[Invio]
device `plustek:libusb:001:002' is a Canon N670U/N676U/LiDE20 USB \ |
Dall'esempio risulta chiaro che scanimage -L non vede lo scanner HP Scanjet 4200C. In questo caso particolare, dalla documentazione originale relativa alla libreria che si occupa di questo scanner, si capisce che le coordinate corrette per individuarlo sono hp4200:libusb:001:003.
Una volta verificato che è possibile raggiungere uno scanner locale utilizzando l'utenza privilegiata root, è necessario stabilire se sia possibile farlo anche con dei privilegi «normali». Da quanto già visto in precedenza, gli utenti associati al gruppo scanner (o ad altro gruppo analogo se il proprio sistema operativo è organizzato diversamente) dovrebbero avere accesso. Si può fare una verifica, ma per questo occorre un utente a cui sia associato esattamente questo gruppo, magari si può creare proprio un utente fittizio con lo stesso nome nel file /etc/passwd
:
|
Questo esempio è coerente con un altro esempio mostrato a proposito del file /etc/group
, dove il numero GID 106 corrisponde proprio al gruppo scanner.
Per fare la prova, si usa su per acquisire i privilegi di questo utente fittizio, quindi si tenta di usare scanimage:
#
su -s /bin/sh - scanner
[Invio]
$
scaniamge -L
[Invio]
Se si ottiene lo stesso elenco che si otterrebbe con i privilegi dell'utente root, si accerta così che l'utente scanner, appartenente al gruppo scanner può accedere.
Se non funziona occorre risalire ai file che vengono utilizzati: possono essere file di dispositivo o file contenuti all'interno di /proc/bus/usb/
; lì occorre verificare qual è il gruppo e quali permessi ha il gruppo.
In precedenza è stata mostrata la configurazione relativa al supervisore dei servizi di rete per il controllo del programma saned, che ha lo scopo di offrire l'accesso allo scanner attraverso la rete. In un esempio si vede che il programma verrebbe avviato con i privilegi dell'utente fittizio saned, associato al gruppo saned:
|
Per sapere se saned può accedere realmente allo scanner locale, si può fare lo stesso tipo di prova:
#
su -s /bin/sh - saned
[Invio]
$
scaniamge -L
[Invio]
Probabilmente, se ha funzionato l'accesso come utente e gruppo scanner, non funziona in questo altro modo; pertanto conviene ritoccare la configurazione del supervisore dei servizi di rete nel modo più appropriato; per esempio così:
|
Per raggiungere uno scanner disponibile attraverso la rete, presso un elaboratore in cui è stato configurato saned, come già descritto in questo capitolo, occorre indicare una stringa simile a quanto già descritto a proposito dell'accesso agli scanner locali:
net:nodo:nome_backend_remoto:dispositivo_remoto |
Per esempio, lo scanner Canon già descritto in precedenza, potrebbe essere raggiunto presso l'elaboratore all'indirizzo IPv4 192.168.1.2 con la stringa seguente:
net:192.168.1.2:plustek:libusb:001:002 |
Tuttavia, bisogna ricordare di configurare presso l'elaboratore remoto il file /etc/sane.d/saned.conf
e il file appropriato per il supervisore dei servizi di rete (di solito /etc/inetd.conf
); inoltre, localmente occorre compilare il file /etc/sane.d/net.conf
con l'elenco dei nodi remoti che consentono l'accesso allo scanner:
|
Naturalmente, nel file /etc/sane.d/net.conf
si possono indicare gli elaboratori anche per nome, purché il sistema operativo sia in grado di tradurre correttamente tali nomi in indirizzi IP.
Nel caso sia necessario utilizzare indirizzi IPv6, questi vanno indicati racchiudendoli tra parentesi quadre, come già mostrato a proposito del file |
Una volta predisposto tutto correttamente, quando di esegue il comando scanimage -L si ottiene l'elenco completo degli scanner locali e di quelli remoti previsti, purché accessibili effettivamente:
$
scanimage -L
[Invio]
device `net:192.168.1.2:plustek:libusb:001:002' is a Canon \ |
Si osservi che se si vuole consentire l'accesso allo scanner locale a tutti gli utenti, senza bisogno di associare gli utenti a un gruppo particolare, si può predisporre il demone saned con la configurazione necessaria e il file /etc/sane.d/net.conf
con il nome o l'indirizzo dell'elaboratore locale:
|
Quando si cerca di contattare uno scanner remoto, può capitare di non riuscirci, anche se apparentemente è tutto a posto. Per scoprire cosa succede, si possono fare due verifiche: una dal lato cliente, ovvero dalla parte di scanimage; una dal lato servente, ovvero dalla parte di saned. Per cominciare si può avviare scanimage predisponendo una variabile di ambiente appropriata; in un colpo solo si può usare questo comando:
$
SANE_DEBUG_NET=128 scanimage -L
[Invio]
Ecco cosa si potrebbe ottenere dallo standard error quando tutto va bene:
[sanei_debug] Setting debug level of net to 128. [net] sane_init: authorize = 0x8049280, version_code = 0xbfffe85c [net] sane_init: SANE net backend version 1.0.12 (AF-indep+IPv6) \ |
Se invece le cose vanno male e la controparte non risponde, si può provare dal lato servente, avviando saned al di fuori del controllo del supervisore dei servizi di rete (bisogna modificare temporaneamente la configurazione del supervisore dei servizi di rete in modo che non intercetti le chiamate alla porta 6 566):
#
su -s /bin/sh - scanner
[Invio]
$
saned -d128
[Invio]
In questo modo, saned resta in ascolto per una sola chiamata, alla quale risponde, quindi termina di funzionare. Ecco come potrebbe essere il risultato che si ottiene dallo standard error quando tutto va bene:
[saned] main: starting debug mode (level 128) [saned] main: trying to get port for service `sane' (getaddrinfo) [saned] main: [0] socket () using IPv6 [saned] main: [0] setsockopt () [saned] main: [0] bind () to port 6566 [saned] main: [0] listen () [saned] main: [1] socket () using IPv4 [saned] main: [1] setsockopt () [saned] main: [1] bind () to port 6566 [saned] main: [1] bind failed: Address already in use [saned] main: waiting for control connection [saned] saned (AF-indep+IPv6) from sane-backends 1.0.14 ready [saned] check_host: detected an IPv4-mapped address [saned] check_host: access by remote host: ::ffff:192.168.1.1 [saned] check_host: remote host is not IN_LOOPBACK nor IN6_LOOPBACK [saned] check_host: local hostname: nanohost [saned] check_host: local hostname(s) (from DNS): 127.0.0.1 [saned] check_host: local hostname(s) (from DNS): 127.0.0.1 [saned] check_host: local hostname(s) (from DNS): 127.0.0.1 [saned] check_host: remote host doesn't have same addr as local [saned] check_host: opening config file: /etc/hosts.equiv [saned] check_host: can't open config file: /etc/hosts.equiv \ |
Il programma scanimage (3) è il programma frontale più importante per l'utilizzo dello scanner attraverso SANE:
scanimage [opzioni_generali] [opzioni_dello_scanner] |
Il programma prevede un gruppo di opzioni generali e un altro gruppo di opzioni particolari che dipende dalle caratteristiche della libreria usata per comunicare con lo scanner. Si ottiene l'elenco di queste opzioni aggiuntive con l'ausilio dell'opzione -h.
|
La scansione di un'immagine attraverso scanimage viene ottenuta dallo standard output di questo. Segue la descrizione di alcuni esempi.
$
scanimage -L
[Invio]
Restituisce un elenco di scanner che possono essere individuati facilmente.
$
scanimage > copia.pnm
[Invio]
Esegue una scansione attraverso lo scanner predefinito (presumibilmente l'unico che venga individuato), usando opzioni predefinite, per generare il file copia.pnm
.
$
scanimage -d hp4200:libusb:001:003 > copia.pnm
[Invio]
Esegue una scansione attraverso lo scanner locale individuato dalla stringa hp4200:libusb:001:003, usando opzioni predefinite, per generare il file copia.pnm
.
$
scanimage -d net:192.168.1.2:hp4200:libusb:001:003 > copia.pnm
[Invio]
Esegue una scansione attraverso lo scanner di rete individuato dalla stringa net:192.168.1.2:hp4200:libusb:001:003, usando opzioni predefinite, per generare il file copia.pnm
. Evidentemente lo scanner in questione si trova presso l'elaboratore 192.168.1.2.
$
scanimage -h -d hp4200:libusb:001:003
[Invio]
Richiede le opzioni specifiche dello scanner locale individuato dalla stringa net:192.168.1.2:hp4200:libusb:001:003.
$
scanimage -d hp4200:libusb:001:003 --resolution 300 > copia.pnm
[Invio]
Esegue una scansione attraverso lo scanner locale individuato dalla stringa hp4200:libusb:001:003, a una risoluzione di 300 punti per pollice, per generare il file copia.pnm
.
Esiste una grande varietà di programmi frontali per SANE, che utilizzano la grafica X. Il primo di questi che vale la pena di conoscere è Xscanimage, (4) che, come suggerisce il nome, è il fratello grafico di scanimage, anche se non dispone delle stesse opzioni:
xscanimage [opzioni] [dispositivo] |
Come si vede dalla sintassi, l'indicazione della stringa dello scanner, se fornita, avviene alla fine della riga di comando, senza un'opzione che la introduca.
|
Xsane (5) è un altro programma, un po' più sofisticato, per il controllo della scansione delle immagini:
xsane [opzioni] [dispositivo] |
|
Il limite di alcuni programmi frontali per SANE sta nell'impossibilità di specificare espressamente l'uso di un certo scanner, cosa che diventa indispensabile quando il sistema di autorilevamento non funziona come dovrebbe. Molti programmi di disegno, come Gimp per fare un esempio, consentono l'acquisizione delle immagini da scanner, con l'ausilio di uno dei vari programmi frontali comuni; purtroppo, in questo modo è praticamente obbligatorio affidarsi al sistema di autorilevamento dello scanner.
SANE è accompagnato generalmente da una serie di pagine di manuale specifiche per ogni contesto. La tabella successiva riepiloga alcune di queste pagine; per avere l'elenco completo basta usare il comando:
$
apropos sane
[Invio]
SANE - Scanner Access Now Easy
SANE: Supported Devices
SANE: Backends (Drivers)
SANE - Documentation
Howard Shane, The Scanner HOWTO
Jochen Eisinger, SANE Network Daemon
Appunti di informatica libera 2006.07.01 --- Copyright © 2000-2006 Daniele Giacomini -- <daniele (ad) swlibero·org>
1) SANE API and network protocol dominio pubblico
2) SANE backend libraries GNU GPL con alcune eccezioni
4) Xscanimage GNU GPL
5) Xscanimage GNU GPL
Dovrebbe essere possibile fare riferimento a questa pagina anche con il nome uso_dello_scanner_con_sane.htm
[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [translators] [docinfo] [indice analitico]