# Scanner Access Now Easy

Scanner Access Now Easy (SANE) es una interfaz de programación de aplicaciones (API) que proporciona acceso estandarizado a cualquier dispositivo de escaneo (escáner de sobremesa, escáner de mano, cámaras y videocámaras, etc.). El API de SANE es de dominio público y su discusión y desarrollo está abierto a todo el mundo.

## General

SANE difiere de TWAIN en que diferencia claramente los frontends (programas de usuario) y los backends (controladores de los escáneres) disminuyendo el tiempo de desarrollo y la duplicación de código. Mientras que el controlador TWAIN maneja tanto la Interfaz de usuario como las comunicaciones con el escáner, el controlador de SANE solo proporciona una interfaz con el dispositivo y describe un número de "opciones" que controla cada escaneo.
Estas opciones especifican parámetros tales como la resolución de escaneo, el área de escaneo, modelo de color, etc. Cada opción tiene un nombre, y la información acerca de su tipo, unidades, y rango o valores posibles (por ejemplo una lista enumerada). Por convención hay varias opciones "bien conocidas" con los que los frontends pueden interactuar con los GUI convenientes p.e las opciones del área de escaneo pueden establecerse arrastrando un recuadro sobre una imagen preliminar. Otras opciones pueden ser presentadas utilizando elementos GUI adecuados a su tipo p.e deslizadores, cajas de listado, botones, etc.
Una consecuencia de esta separación es que se implementa fácilmente el escaneado a través de la red sin un control específico tanto por parte de los frontends como de los backends. En un host con un escáner, se ejecuta el demonio saned que maneja las peticiones en red. En las máquinas clientes, el backend "net" (controlador) se conecta al servidor remoto para tomar las opciones del escáner, y realizar tanto el escaneo preliminar como el escaneo final. El demonio saned actúa como un frontend localmente, pero simplemente pasa las peticiones y los datos entre las conexiones de red y el escáner local. De igual manera, el backend "net" pasa las peticiones y los datos entre el frontend local y el host remoto.
Varios tipos de procesamiento por lotes son posibles con un mínimo de soporte necesario en el backend (controlador). Muchos escáneres soportan la utilización de alimentadores de documentos que permiten que un gran número de hojas de papel sean escaneadas de forma sucesiva. Utilizando la API de SANE, el frontend simplemente tiene que "ejecutar" el mismo conjunto de opciones para cada escaneado, controlando el alimentador de documentos entre escaneos para cargar la siguiente hoja de papel. El frontend solo tiene que obtener el conjunto de opciones del usuario una vez.

## Estructura
### Backends de SANE

Los backends son los controladores que implementan las funciones que proporciona la capa de abstracción de SANE para la comunicación de las aplicaciones de usuario con los diferentes dispositivos de escaneo soportados.
Cada backend puede soportar uno o varios dispositivos ya que, en realidad, lo que el backend implementa es el protocolo de comunicación con el chipset del dispositivo, el cual puede estar integrado en varios escáneres. Los identificadores de los dispositivos soportados pueden estar embebidos en el código fuente del backend o especificados en su archivo de configuración, el cual se encuentra en el directorio 'sane.d' dentro de '/etc' o bien '/usr/local/etc' (Puede variar en función del sistema operativo). Esto posibilita la inclusión de nuevos escáneres especificando su ID sin necesidad de recompilar el software.
Los backends deben aportar las siguientes funciones (al menos en la versión 1.0.25):
* sane_init
* sane_get_devices
* sane_open
* sane_get_option_descriptor
* sane_control_option
* sane_get_parameters
* sane_start
* sane_read
* sane_cancel
* sane_set_io_mode
* sane_get_select_fd
* sane_close
* sane_exit
Estas funciones proporcionan la funcionalidad necesaria para inicializar el dispositivo, obtener y establecer las opciones de escaneo, comenzar el escaneo, leer la imagen durante el escaneo, cancelar y realizar las operaciones previas a la finalización del mismo.
La lista de backends con los dispositivos soportados puede encontrarse en SANE Supported devices

### Interfaz DLL

Por encima de los backends se encuentra la interfaz DLL, una biblioteca de enlace dinámico que puede entenderse como un backend más, ya que implementa las mismas funciones que estos pero proporciona la posibilidad de utilizar más de un backend.
Para hacer uso de los backends, estos han de estar registrados. Para ello, debe existir la entrada correspondiente en el archivo 'dll.conf' localizado en el directorio 'sane.d'
Cuando un frontend inicia la interfaz dll de SANE, esta inicializa los backends registrados en dll.conf, los cuales realizan un barrido en busca de los dispositivos soportados devolviendo mediante sane_get_devices aquellos que se han encontrado. Si cualquiera de los encontrados coincide con el deseado por el usuario, continua la carga del frontend y se inicializan los datos destinados al control del escáner seleccionado.

### Frontends de SANE

Los frontends son aplicaciones que hacen uso de la capa de abstracción proporcionada por SANE para acceder a los dispositivos de escaneo. Estos programas no tienen por qué conocer el funcionamiento interno de cada dispositivo ya que de ese trabajo se encargan los backends. Esto presenta al menos dos ventajas. Por una parte, los programadores de frontends pueden dedicar su esfuerzo en adaptar sus programas a los diferentes entornos de trabajo disponibles, a mejorar las prestaciones y a facilitar el manejo de los escáneres mediante interfaces amigables de cara al usuario. Por otro lado, al contrario que lo que ocurre con implementaciones TWAIN proporcionadas por los fabricantes para entornos Windows, estas aplicaciones perduran a lo largo del tiempo ya que el soporte de nuevos escáneres se realiza de forma transparente para el frontend, permitiendo al usuario utilizar la aplicación que le sea más familiar independientemente del escáner que adquiera en un futuro.
Algunos ejemplos de frontends conocidos son:
* scanimage: Aplicación para consola (modo texto)
* xscanimage: Versión para X11
* XSane: Versión para GTK+
* kooka: Aplicación para entornos KDE
Otras aplicaciones especializadas hacen uso de módulos o plugins que proporcionan la funcionalidad de un frontend para acceso a los escáneres mediante SANE, como por ejemplo GIMP u OpenOffice.org.

## Utilidades
### sane-find-scanner

sane-find-scanner es una aplicación incluida en el proyecto SANE cuyo propósito es buscar y detectar aquellos dispositivos del sistema que pudieran ser soportados por alguno de los backends. Para ello, realiza un barrido en la lista de dispositivos conectados mediante USB, dispositivos SCSI, dispositivos conectados a puertos paralelos y otras interfaces de comunicación analizando las propiedades de cada dispositivo encontrado. Además, envía una pequeña trama de datos específicos a los dispositivos encontrados para, evaluando la respuesta, identificar el chipset integrado en los mismos. Esta forma de identificación permite encontrar dispositivos compatibles con un chipset concreto que pueda ser controlado por un backend de SANE, añadiendo su identificación en el archivo de configuración del backend correspondiente, aun cuando éste no está reconocido como soportado de antemano.
Esta aplicación funciona de forma autónoma, es decir, los dispositivos encontrados pueden estar o no soportados por cualquiera de los backends existentes o incluso identificar erróneamente el chipset integrado en un dispositivo.
Algunos usuarios tienden a confundir el propósito de esta utilidad con el listado de escáneres detectados que proporciona el frontend scanimage mediante el comando:
En este caso, el frontend scanimage muestra los dispositivos compatibles localizados por los backends activados en el archivo 'dll.conf'. Si un dispositivo de escaneo no aparece en dicho listado y sí en sane-find-scanner, hay que suponer lo siguiente:
* El backend que lo controla está desactivado: Es decir, no aparece el nombre del backend que lo controla o aparece comentado (precedido del carácter #) en el archivo 'dll.conf'
* El backend que lo controla no incluye ese dispositivo en su archivo de configuración: Si se ha identificado el chipset del escáner es posible que el backend que lo soporta pueda hacerlo funcionar si se le proporciona su identificación en el archivo de configuración del backend.
* La detección del chipset del dispositivo sea errónea: Normalmente, los controladores gráficos incluidos en los escáneres no contienen una identificación expresa. Así pues, la detección del chipset se basa en la espera de una respuesta concreta a un comando o supuesta modificación de valores en sus registros. Este método no es del todo fiable debido a que un chipset totalmente ajeno a las prestaciones de un escáner puede dar una respuesta equivalente a uno soportado. O incluso, detectar un chipset concreto cuando en realidad es una variante o una versión actualizada cuyas diferencias de programación pueden provocar reacciones imprevistas que ocasionen daños en el escáner.
Por ello, la finalidad más importante de esta utilidad es permitir a los desarrolladores localizar nuevos dispositivos susceptibles de ser controlados por sus respectivos backends para darles el soporte necesario.

### Botones del escáner

La versión 1.0 de la API de SANE no soporta el control de escáneres mediante los botones que incorporan debido a que, en el momento de su diseño, no existía esa peculiaridad. La versión 1.1 de la API sí cubre esa funcionalidad mediante el uso de opciones específicas para los botones.
Existen dos proyectos ajenos a SANE que también posibilitan el uso de los botones:
* KScannerButtons: Si bien un frontend no tiene acceso estandarizado a los botones de un escáner, los backends pueden realizar ciertos trucos, no oficiales, para lograr esa información mediante opciones genéricas con un patrón de nombre determinado que actúan como sensores. Cuando un backend detecta un botón pulsado o liberado altera el estado de dichas opciones. KScannerButtons está formado por un demonio (sanebuttond) que, instalado en el sistema, monitoriza el estado de esas opciones y tras detectar el cambio en su estado ejecuta la acción configurada por el usuario. Incorpora además una GUI para KDE. Debido a que no es un estándar, no todos los backends soportan esa funcionalidad.
* scanbuttond: Esta aplicación es autónoma. No depende de las librerías de SANE para acceder a los escáneres sino que incorpora sus propios backends, cuyo código se ha extraído de los existentes en SANE. Dispone de un demonio con la misma funcionalidad.