Разбираемся со сканерами в Linux: Практики использования SANE

от автора

Продолжение цикла статей:

Часть 1. Разбираемся со сканерами в Linux: получение информации об устройстве и поиск подходящего драйвера.

Часть 2. Разбираемся со сканерами в Linux: Установка и конфигурирование устройства

В третьей части продемонстрируем различные сценарии использования среды для сканирования SANE.

Методы ускорения поиска устройств

В целях унификации и поддержки как можно большего списка устройств, в стандартную сборку libsane1 включены все доступные бэкенды. Каждый запуск фронтенда инициирует поиск и загрузку этих файлов, считывание сотни строк в десятках конфигурационных файлах, не говоря уже о шторме сетевого трафика при поиске сетевых устройств. Время, затраченное на поиск устройства, увеличивается на n sec с каждого вызова локального и сетевого бэкенда.

Сократить время поиска, а, следовательно, и запуска фронтенда можно несколькими способами:

  • исключить или закомментировать из /etc/sane.d/dll.conf и /etc/sane.d/dll.d строки с неиспользуемыми бэкендами

  • в каждом оставшемся конфигурационном файле бэкенда

    • отключить поиск сетевых устройств, если есть такая возможность;

    • ограничить список сетевых устройств, опять же, если есть такая возможность;

    • оставить записи с идентификаторами VID и PID только необходимых устройств.

Для информации

По умолчанию, в /etc/sane.d/dll.conf перечислено 92 бэкенда. 15 из них, устаревших и уже закомментированы. Также, в /etc/sane.d/dll.d/ присутствует 1 бэкенд hpaio. Итого, 93 активных бэкенда.

  • при стандартных настройках, поиск устройств под пользователем занимает 7,5 сек

    time scanimage -L

time scanimage -L real    0m7,569s
  • исключение hpaio, сократит время выполнения на 1,1 секунду

  • отключение устаревших бэкендов для поддержки SCSI-устройств, а также подключенных по параллельному порту — прироста в скорости не дает

  • самые «жирные» бэкенды, которые тратят больше всего времени на выполнение, — magicolorkodakaioepsonepsonds. Без них, поиск занимает под пользователем 2 (две) секунды

Строго говоря, внесение правок в конфигурационные .conf файлы для управления списком бэкендов и моделей — не самое лучшее решение. Более «гибкий» вариант — использование комбинаций конфигурационных файлов dll.conf и <backend_name>.conf, собранных вместе в отдельной директории. В этом случае можно «на горячую» задавать списки бэкендов и устройств при запуске фронтенда через переменную SANE_CONFIG_DIR.

К примеру, так будет выглядеть конфигурация под говорящим названием sane_kyocera с двумя моделями устройств, использующих разные бэкенды:

tree /opt/sane_kyocera/

/opt/sane_kyocera/ ├── kyocera_wc3_usb.conf ├── kyocera.conf └── dll.conf

Где файлы бэкендов /opt/sane_kyocera/kyocera.conf и /opt/sane_kyocera/kyocera_wc3_usb.conf содержат упоминание лишь по одной модели,

/opt/sane_kyocera/kyocera.conf

#Kyocera MFP supported device # FS-1320 MFP usb 0x0482 0x04FE

/opt/sane_kyocera/kyocera_wc3_usb.conf

# Kyocera WC3 supported device # ECOSYS M2040dn usb 0x0482 0x069d

 а также, разумеется, упоминание этих бэкендов в dll.conf.

/opt/sane_kyocera/dll.conf

kyocera kyocera_wc3_usb

Запуск выполняется следующим образом:

SANE_CONFIG_DIR=/opt/sane_kyocera scanimage -L

В такой конфигурации выполнение scanimage с указанием пути до каталога с конфигурационными файлами поможет сократить время запуска до n sec. Или оно может применяться для тестовых задач, не затрагивая основную конфигурацию. Минимального времени запуска можно добиться:

  • оставив строку с единственным бэкендом pantum6500 в /etc/sane.d/dll.conf;

  • оставив одну запись в pantim6500.conf об idVendor и idProduct устройства.

Значение переменной можно импортировать как одному пользователю,

echo "SANE_CONFIG_DIR=/opt/sane_kyocera" | tee -a /home/<username>/.profile

так и для всех пользователей системы.

echo "SANE_CONFIG_DIR=/opt/sane_kyocera" | sudo tee -a /etc/environment

Конфигурации могут храниться централизованно, и администратор получит удобный инструмент для управления поиска устройств на рабочих станциях.

Есть и другое решение, не требующее вмешательства в конфигурационные файл, — запуск фронтенда с указанием имени устройства. При таком запуске этап поиска всеми бэкендами будет пропущен и по факту произойдёт считывание всех конфигурационных файлов из /etc/sane.d/dll.conf; /etc/sane.d/dll.d, а инициализация только целевого бэкенда

fly-scan -d pantum6500:libusb:001:003

[22:55:34.470452] [dll] sane_open: trying to open `pantum6500:libusb:001:003' [22:55:34.470592] [dll] load: searching backend `pantum6500' in `/usr/lib/x86_64-linux-gnu/sane:/usr/lib/sane:/usr/lib64/sane' [22:55:34.470720] [dll] load: trying to load `/usr/lib/x86_64-linux-gnu/sane/libsane-pantum6500.so.1' [22:55:34.470939] [dll] load: dlopen()ing `/usr/lib/x86_64-linux-gnu/sane/libsane-pantum6500.so.1' [22:55:34.480892] [dll] init: initializing backend `pantum6500' [22:55:34.507091] [dll] init: backend `pantum6500' is version 1.0.13 [22:55:34.507266] [dll] init: backend `pantum6500' initialization completed in 26 ms

Не все утилиты сканирования это поддерживают, но в scanimage и fly-scan возможность запуска с параметром -d (device name) есть. Даже simple-scan принимает имя устройства в формате simple-scan <device_name>. На время запуска может также оказывать влияние «тяжесть» фронтенда. fly-scan отрисует готовое к работе окно интерфейса за 1,5 секунд.

Справочное руководство scanimage (sane-utils)

Рассмотрим все доступные параметры scanimage и приведем примеры с их использованием в различных сценариях. Всё это уже доступно по команде man scanimage.

Процесс сканирования

Сканирование представляет собой линейный процесс, в котором сперва выполняем поиск доступных сканирующих устройств. Затем запрашиваем список доступного функционала (-A) и проверяем работоспособность устройства при помощи серии тестов (-T). Последним этапом выполняем сканирование с настройками бэкенда по умолчанию.

Используемые параметры сканирования

-L, —list-devices

Поиск устройств. При поиске будут использованы все бэкенды, перечисленные в /etc/sane.d/dll.conf и /etc/sane.d/dll.d. В результате выполнения получим список обнаруженных устройств в виде:

scanimage -L

device `escl:https://10.0.0.120:9096' is a ESCL Kyocera ECOSYS M2540dn platen,adf scanner device `escl:https://10.0.12.21:443' is a ESCL Pantum BM5100ADW Series 4B94CA platen,adf scanner device `pantum6500:tcp 10.0.12.21 9200-BM5100ADW' is a  Pantum BM5100ADW (tcp 10.0.12.21 9200-BM5100ADW) device `airscan:e0:Kyocera ECOSYS M2540dn' is a eSCL Kyocera ECOSYS M2540dn ip=10.0.0.120 device `airscan:e1:Pantum BM5100ADW Series 4B94CA' is a eSCL Pantum BM5100ADW Series 4B94CA ip=10.0.12.21

-f format, —formatted-device-list=format

Управление форматом вывода имен найденных устройств. При использовании параметра -f добавлять поиск устройств -L не требуется. Доступные квантификаторы:

%d - имя устройства %v - вендор (производитель) %m - модель %t - тип сканирующего устройства %i - порядковый номер (начинается с 0) %n - перенос строки

Вывод списка найденных устройств с заданным форматом:

scanimage -f «%i: Найден %t, имя устройства %d; производитель %v; модель %m%n»

0: Найден multi-functional device, имя устройства kyocera_wc3_usb:libusb:001:002; производитель Kyocera; модель ECOSYS M2540dn 1: Найден platen,adf scanner, имя устройства escl:https://10.0.0.120:9096; производитель ESCL; модель Kyocera ECOSYS M2540dn 2: Найден platen,adf scanner, имя устройства escl:https://10.0.12.21:443; производитель ESCL; модель Pantum BM5100ADW Series 4B94CA 3: Найден , имя устройства pantum6500:tcp 10.0.12.21 9200-BM5100ADW; производитель ; модель Pantum BM5100ADW (tcp 10.0.12.21 9200-BM5100ADW) 4: Найден ip=10.0.0.120, имя устройства airscan:e0:Kyocera ECOSYS M2540dn; производитель eSCL; модель Kyocera ECOSYS M2540dn 5: Найден ip=10.0.12.21, имя устройства airscan:e1:Pantum BM5100ADW Series 4B94CA; производитель eSCL; модель Pantum BM5100ADW Series 4B94CA 

-A, —all-options

Вывод всех возможностей бэкенда.
Внимание! Возможностей именно бэкенда, а не устройства. Выполнение команды не приведёт к сканированию. Например:

scanimage -A

All options specific to device `kyocera_wc3_usb:libusb:001:002':   Standard:     --source Auto|DP|Platen|2-sided (Binding Top)|2-sided (Binding Left/Right) [Auto]         Selects the scan source (such as a document-feeder).     --mode Mono|Gray|Color [Mono]         Selects the scan mode (e.g., lineart, monochrome, or color).     --resolution 200|300|400|600dpi [200]         Sets the resolution of the scanned image.   Advanced:     --originalSize A4|A5|A6|B5(JIS)|B5(ISO)|B6|Legal|Letter|Executive [A4]         Original Size options     --sendingSize Auto|A4|A5|A6|B5(JIS)|B5(ISO)|B6|Legal|Letter|Executive [Auto]         Sending Size options     --imageQuality Text|Photo|Text+Photo [Text+Photo]         Image Quality options     --densityType Manual|Auto [Manual]         Density type options     --density -3..3 (in steps of 1) [0]         Density options     --page-height 0..23330816mm [0] [read-only]         Specifies the height of the media.     --page-width 0..14155776mm [0] [read-only]         Specifies the width of the media.  Required for automatic centering of         sheet-fed scans.

В квадратных скобках указаны значения описанных параметров, установленные по умолчанию.

h, —help

Справка о возможностях scanimage. Помимо этого, параметр —help выведет аналогичную scanimage -A информацию. Но время выполнения займет больше времени, так как в конце будет произведен поиск устройств. По сути, выполнение равноценно scanimage -A -L

scanimage —help
Usage: scanimage [OPTION]...  Start image acquisition on a scanner device and write image data to standard output.  Parameters are separated by a blank from single-character options (e.g. -d epson) and by a "=" from multi-character options (e.g. --device-name=epson). -d, --device-name=DEVICE   use a given scanner device (e.g. hp:/dev/scanner)     --format=pnm|tiff|png|jpeg|pdf  file format of output file -i, --icc-profile=PROFILE  include this ICC profile into TIFF file -L, --list-devices         show available scanner devices -f, --formatted-device-list=FORMAT similar to -L, but the FORMAT of the output                            can be specified: %d (device name), %v (vendor),                            %m (model), %t (type), %i (index number), and                            %n (newline) -b, --batch[=FORMAT]       working in batch mode, FORMAT is `out%d.pnm' `out%d.tif'                            `out%d.png' or `out%d.jpg' by default depending on --format                            This option is incompatible with --output-file.    --batch-start=#        page number to start naming files with     --batch-count=#        how many pages to scan in batch mode     --batch-increment=#    increase page number in filename by #     --batch-double         increment page number by two, same as                            --batch-increment=2     --batch-print          print image filenames to stdout     --batch-prompt         ask for pressing a key before scanning a page     --accept-md5-only      only accept authorization requests using md5 -p, --progress             print progress messages -o, --output-file=PATH     save output to the given file instead of stdout.                            This option is incompatible with --batch. -n, --dont-scan            only set options, don't actually scan -T, --test                 test backend thoroughly -A, --all-options          list all available backend options -h, --help                 display this help message and exit -v, --verbose              give even more status messages -B, --buffer-size=#        change input buffer size (in kB, default 32) -V, --version              print version information Output format is not set, using pnm as a default.  Options specific to device `katusham247:192.168.10.24':     --resolution 75|100|150|200|300|600dpi [300]         Sets the resolution of the scanned image.   Geometry:     --Paper size Letter|Executive|A4|A5|B5|Statement|Custom [Letter]      -l 0..216mm [0]         Top-left x position of scan area.     -t 0..293mm [0]         Top-left y position of scan area.     -x 0..216mm [216]         Width of scan-area.     -y 0..293mm [293]         Height of scan-area.     --source Flatbed|Automatic Document Feeder|ADF Duplex [Flatbed]         Selects the scan source (such as a document-feeder).     --preview[=(yes|no)] [no]         Request a preview-quality scan.     --mode Lineart|Gray|Color [Gray]         Selects the scan mode (e.g., lineart, monochrome, or color).   Enhancement:     --halftoning Threshold|Error Diffusion [Threshold]      --brightness -60..60 (in steps of 1) [0]         Controls the brightness of the acquired image.     --contrast -20..20 (in steps of 1) [0]         Controls the contrast of the acquired image.  Type ``scanimage --help -d DEVICE'' to get list of all options for DEVICE.  List of available devices:     katusham247:192.168.10.24 katusham247:libusb:001:002

-d, —device-name

Имя используемого устройства. Значение может быть скопировано из вывода scanimage -L или в случае использования псевдонимов — короткое имя (alias) устройства. Если имя устройства не указать, scanimage считает имя устройства из переменной SANE_DEFAULT_DEVICE (по умолчанию, переменная не задана). Если переменная не задана, будет использовано первое найденное устройство.

Имя устройства (DeviceURI), содержащее пробелы, необходимо заключить в двойные, или одинарные кавычки. Имени устройства также соответствует квантификатор %d при использовании параметра -f . Примеры использования:

scanimage -d escl:https://10.0.0.20:443 -A scanimage -d kyocera_wc3_usb:libusb:001:002 -A scanimage -d "airscan:e1:Pantum BM5100ADW Series 4B94CA" -A SANE_DEFAULT_DEVICE=kyocera_wc3_usb:libusb:001:002 scanimage -A export SANE_DEFAULT_DEVICE=kyocera_wc3_usb:libusb:001:002 && scanimage -A

-i profile, —icc-profile=profile

Применить к отсканированной копии tiff-файла цветового профиля. Параметр — путь к файлу .icc. Например:

scanimage -d "pantum6500:tcp 10.0.12.21 9200-BM5100ADW" --format tiff --batch=p%04d.tiff -p --resolution 150 -i ../Canon_iP4300_InkTec_C908_LomondSGloss260.icm --batch-count=1

-p, —progress

Процесс выполнения задания сканирования в процентах. Информация отображается при консольном выполнении scanimage для каждой сканируемой страницы. Не ожидайте отображения статуса выполнения в реальном времени от сетевых бэкендов, только для локальных (USB, SCSI) устройств.

-n, —dont-scan

Выполнение команд scanimage без сканирования. Например, для передачи устройству особых команд: сброс счетчика скан-копий, установка таймера выключения и прочее, в зависимости от возможностей бэкенда.

-T, —test

Тестирование функционала бэкенда с устройством используя SANE API. Результат выполнения не всегда говорит об исправности устройства, так как разные вендоры демонстрируют разный результат. Запуск scanimage -T приведет устройство в рабочий режим и выполнит тестовое сканирование (проход лампы) без выходного файла. Например, вывод команды с заведомо исправных устройств Pantum BM5100ADW (pantum6500:tcp):

scanimage -d «pantum6500:tcp 10.0.12.21 9200-BM5100ADW» -T
Output format is not set, using pnm as a default. scanimage: scanning image of size 2550x3507 pixels at 24 bits/pixel scanimage: acquiring RGB frame, 8 bits/sample scanimage: reading one scanline, 7650 bytes...  PASS scanimage: reading one byte...          PASS scanimage: stepped read, 2 bytes...     PASS scanimage: stepped read, 4 bytes...     PASS scanimage: stepped read, 8 bytes...     PASS scanimage: stepped read, 16 bytes...    PASS scanimage: stepped read, 32 bytes...    PASS scanimage: stepped read, 64 bytes...    PASS scanimage: stepped read, 128 bytes...   PASS scanimage: stepped read, 256 bytes...   PASS scanimage: stepped read, 512 bytes...   PASS scanimage: stepped read, 1024 bytes...  PASS scanimage: stepped read, 2048 bytes...  PASS scanimage: stepped read, 4096 bytes...  PASS scanimage: stepped read, 8192 bytes...  PASS scanimage: stepped read, 8191 bytes...  PASS scanimage: stepped read, 4095 bytes...  PASS scanimage: stepped read, 2047 bytes...  PASS scanimage: stepped read, 1023 bytes...  PASS scanimage: stepped read, 511 bytes...   PASS scanimage: stepped read, 255 bytes...   PASS scanimage: stepped read, 127 bytes...   PASS scanimage: stepped read, 63 bytes...    PASS scanimage: stepped read, 31 bytes...    PASS scanimage: stepped read, 15 bytes...    PASS scanimage: stepped read, 7 bytes...     PASS scanimage: stepped read, 3 bytes...     PASS

и Kyocera M2540dn (kyocera_wc3_usb)

scanimage -d «kyocera_wc3_usb:libusb:001:002» -T
Output format is not set, using pnm as a default. scanimage: scanning image of size 1653x2338 pixels at 1 bits/pixel scanimage: acquiring gray frame, 1 bits/sample scanimage: reading one scanline, 207 bytes...   PASS scanimage: reading one byte...          FAIL No data scanimage: stepped read, 2 bytes...     FAIL No data scanimage: stepped read, 4 bytes...     FAIL No data scanimage: stepped read, 8 bytes...     FAIL No data scanimage: stepped read, 16 bytes...    FAIL No data scanimage: stepped read, 32 bytes...    FAIL No data scanimage: stepped read, 64 bytes...    FAIL No data scanimage: stepped read, 128 bytes...   FAIL No data scanimage: stepped read, 256 bytes...   PASS scanimage: stepped read, 255 bytes...   PASS scanimage: stepped read, 127 bytes...   FAIL No data scanimage: stepped read, 63 bytes...    FAIL No data scanimage: stepped read, 31 bytes...    FAIL No data scanimage: stepped read, 15 bytes...    FAIL No data scanimage: stepped read, 7 bytes...     FAIL No data scanimage: stepped read, 3 bytes...     FAIL No data

—accept-md5-only

Принимать запросы на авторизацию только с использованием MD5 для передачи логина\пароля в зашифрованном виде. Порядок настройки авторизации для доступа к бэкендам на сервере saned описан в статье Saned. Подключение удаленного сканера.

-B, —buffer-size=#

Размер входного буфера в килобайтах. Справка выводит информацию об установленном значении по умолчанию в 32 кб. Начиная с версии SANE Backends 1.3.1, размер буфера по умолчанию уже установлен в 1Мб. Малый размер буфера может оказывать негативное влияние на производительность сканирования и тянется со времен слабых ПК.

—format=format

Указание формата выходного файла (stdout) или расширения файла, заданного в параметром —output-file. Доступные форматы: pnm, tiff, png, jpeg и pdf. Если значение не задано, файл будет сохранен в pnm.

-V, —version

Вывести информацию о версии sane-backends и scanimage как его части.

-v, —verbose

Вывод отладочной информации о работе scanimage. Пожалуй, самый бесполезный параметр. Для вывода отладочной информации используются переменные окружения SANE_DEBUG_<BACKENDNAME>=LOGLEVEL. Например:

SANE_DEBUG_DLL=255 SANE_DEBUG_KYOCERA_WC3_USB=255 scanimage -L

-o path, —output-file=path

Сохранение выходного изображения в файл. Параметр несовместим с —batch. Если разрешение файла не задано, будет ошибка

Could not guess output format from the given path and no --format given.

Примеры использования

# Сканирование в файл с указанием расширения при помощи --format scanimage -d 'kyocera_wc3_usb:libusb:001:004' --format=jpeg -o scan_copy file scan_copy scan_copy: JPEG image data, JFIF standard 1.01, resolution (DPI), density 200x200, segment length 16, baseline, precision 8, 1653x2338, components 1 # Сканирование в файл с расширением scanimage -d 'kyocera_wc3_usb:libusb:001:004' -o scan_copy.jpeg scan_copy.jpeg: JPEG image data, JFIF standard 1.01, resolution (DPI), density 200x200, segment length 16, baseline, precision 8, 1653x2338, components 1

—batch*

Все параметры batch предназначены для сканирования через АДП (АПД дуплекс).

-b [format], —batch=[format]

Формат сохраняемых файлов. Каждая страница будет сохранена в отдельный файл. Если формат не задан, по умолчанию будет использован формат out%d.pnm. При указании формата, имя файла будет выглядеть:

  • out%d.tiff для —format=tiff

  • out%d.png для —format=png

  • out%d.jpg для —format=jpeg

  • out%d.pdf для —format=pdf

Параметр не совместим с —output-path. Используемый формат имен совместим с форматом функции printf c одним целочисленным параметром.

Если файл с создаваемым именем уже есть в текущем каталоге, он будет перезаписан. Для сокращения набора параметров расширение файла можно указывать в самом параметре, не задавая дополнительно —format . Кроме этого, в роли имени файла можно использовать результат выполнения команд, в этом случае значение заключается в одинарные скобки.

Примечание. На самом деле, возможно передать более двух параметров, но значения будут начинаться не с «1» (если счетчик не задан иным через параметр —batch-start ) — вместо этого, счетчик будет представлять рандомное 10-значное число.

Примеры:

# Использование устройства kyocera_wc3_usb:libusb:001:004 по-умолчанию export SANE_DEFAULT_DEVICE=kyocera_wc3_usb:libusb:001:004 # Не задан формат имен файлов scanimage -b --format=pdf --source='Automatic Document Feeder' file out1.pdf # Формат не задан, будет сохранен по умолчанию в pnm scanimage --batch=scan%d file scan1 scan1: Netpbm image data, size = 1653 x 2338, rawbits, bitmap # Самая короткая запись, файл сохранен в pdf scanimage --batch=scan%d.pdf file scan1 scan1: PDF document, version 1.3 # Имя выходного файла без расширения, но в формате pdf scanimage --batch=scan%d --format=pdf $ file scan1 $ scan1: PDF document, version 1.3 # Избыточное указание параметров, но всё же допустимо $ scanimage --batch=scan%d.pdf --format=pdf $ file scan1.pdf scan1.pdf: PDF document, version 1.3 # Если указан --format, его значение будет иметь высший приоритет scanimage --batch=scan%d.pdf --format=jpeg file scan1.pdf scan1.pdf: JPEG image data, JFIF standard 1.01, resolution (DPI), density 200x200, segment length 16, baseline, precision 8, 1653x2338, components 1 # Использование двух переменных удобно для генерации уникального имени scanimage --batch=scan%d%d.pdf scan12045603552.pdf # Использование date для создания уникального имени файла\ов scanimage --batch=$(date +%Y%m%d_%H%M%S)_p%d.pdf 20241004_223757_p1.pdf # Форматирование имени выходного файла при помощи модификатора 'p%03' scanimage --batch=p%03d.pdf p001.pdf # Форматирование имени выходного файла при помощи модификатора '%9d' scanimage --batch=%9d.pdf '        1.pdf' # Форматирование имени выходного файла при помощи модификатора '%-9d' scanimage --batch=%-9d.pdf 1        .pdf

—batch-start=start

Выбор номера страницы, с которой будет начинаться нумерация имени файла. Если значение не задано, счетчик начинает с «1». Это значение (numbering from 2) можно также увидеть в стандартном выводе команды scanimage

Output format is not set, using pnm as a default. Scanning infinity pages, incrementing by 1, numbering from 2 Scanning page 2

Примеры:

# Сканирование одного листа с АПД scanimage --batch=%d.pdf --batch-start=2 2.pdf

—batch-count=count

Указание количества страниц для сканирования. Если значение не задано, scanimage будет продолжать сканировать, пока устройство не вернется в состояние, отличное от «ОК». Не все сканирующие устройства с АПД сигнализируют о пустом лотке АПД. Именно для этих случаев и предназначен этот параметр. Например:

scanimage --format=pdf --batch=scan_dp%d.pdf --batch-count=2 --source=DP Scanning 2 pages, incrementing by 1, numbering from 1 Scanning page 1 scanimage: sane_start: Document feeder out of documents Batch terminated, 0 pages scanned

—batch-increment=increment

Устанавливает числовое значение, на которое увеличивается число в имени файла. Обычно это используется при сканировании двусторонних документов с помощью одностороннего устройства подачи документов. Параметр —batch-double — специальная команда, предназначенная для этого.

—batch-double

Автоматическое увеличение числового значения в имени файла на 2. Равносильно —batch-increment=2

Это значение (incrementing by 2) можно также увидеть в стандартном выводе команды scanimage:

u@alse-174-sane:~$ scanimage --format=tiff --batch=scan%d.tiff --batch-double --source='Automatic Document Feeder' Scanning infinity pages, incrementing by 2, numbering from 1 Scanning page 1 sane_pantum6500_start: dev->doc_source = 200, scanning = 0, reading = 0 Scanned page 1. (scanner status = 5) Scanning page 3 sane_pantum6500_start: dev->doc_source = 200, scanning = 1, reading = 1 Scanned page 3. (scanner status = 5) Scanning page 5 Scanned page 5. (scanner status = 5) Scanning page 7 scanimage: sane_start: Document feeder out of documents Batch terminated, 3 pages scanned ls scan1.tiff  scan3.tiff  scan5.tiff

—batch-prompt

Запрос на продолжение сканирования от пользователя после сканирования страницы. Может быть использовано при сканировании нескольких страниц на устройстве без АПД. Например:

scanimage --format=pdf --batch=scan%d.pdf -p --batch-prompt Scanning infinity pages, incrementing by 1, numbering from 1 Place document no. 1 on the scanner. Press <RETURN> to continue. Press Ctrl + D to terminate.

Многостраничное сканирование

Для сканирования многостраничных документов очевидно следует передавать в параметры источника бумаги значение source и формат имени создаваемых файлов через batch. Каждый бэкенд именует его по разному. Это может быть как ADF, так и «Automatic Document Feeder». Например:

scanimage --source 'Automatic Document Feeder' --format tiff --batch=scan%04d.tiff -p --resolution 150

Если не задать формат создаваемых файлов, а просто указать единый выходной файл, то будет сохранена только одна отсканированная копия. Другие страницы просто пройдут через АПД без сканирования.

scanimage --source 'Automatic Document Feeder' --format tiff -p --resolution 150 > scan.tiff

Но можно и сразу положить все копии в один файл, scanimage поддерживает сохранение в pdf

scanimage --source 'Automatic Document Feeder' --format pdf --batch=scan%04d.pdf -p --resolution 150

Обработка копий

Для обработки используется утилита convert с сумасшедшим функционалом. Например, конвертирование созданных файлов нескольких tiff-файлов в один pdf

convert -adjoin *.tiff 1.pdf

scanimage и convert можно комбинировать и собирать конструкции вроде

scanimage --source 'Automatic Document Feeder' --format tiff --batch=scan%04d.tiff -p --resolution 150 && convert -adjoin *.tiff 1.pdf && rm *.tiff

для объединения нескольких копий в одну и удаление оригиналов.

Внимание!

Для возможности конвертирования в pdf, необходимо выполнить установку и настройку imagemagick.

sudo apt install imagemagick -y

Внести изменения в /etc/ImageMagick-6/policy.xml, изменив

<policy domain="coder" rights="none" pattern="PDF" />

на 

<policy domain="coder" rights="read | write" pattern="PDF" />

Псевдонимы (aliases)

Использование псевдонимов — «изящное» решение частой проблемы, когда переподключение локального устройства или перезагрузка компьютера приводит к изменению имени, что имя устройства, с которым работали фронтенды (fly-scannaps2simple-scan) изменяется. Вследствие чего пользователь сталкивается с ошибкой недоступности устройства. Единственным способом решить проблему — выполнить повторный поиск устройства. Разработчики SANE заложили на этот случай воpможность использовать костыль в виде обращения к устройству через псевдоним, указанный в файле /etc/sane.d/dll.aliases и скрипта для udev-правила, который назначит этому псевдониму актуальное имя. Такой подход избавит от проблем с «Избранными» локальными устройствами, каждый раз получающих различные значения DeviceNumber после перезагрузки компьютера.

Настройка несложна. Ниже пример скрипта для устройства Pantum 5100ADW, использующий бэкенд pantum6500, которое является единственным подключенным к компьютеру

/opt/pantum5100adw.sh

#!/bin/bash  MODEL="Pantum BM5100 ADW" SANEBACKEND=pantum6500 PID=232b  BUS=$(lsusb | grep $PID | awk '{ print $2}') NUM=$(lsusb | grep $PID | awk '{ print $4}' | sed 's/.$//') DEVICE=$SANEBACKEND:libusb:$BUS:$NUM echo "alias \"$MODEL\" $DEVICE" > /etc/sane.d/dll.aliases

Необходимо заполнить переменные MODELSANEBACKENDPID

Сделать скрипт исполняемым

sudo chmod +x /opt/pantum5100adw.sh

Создать udev-правило /etc/udev/rules.d/61-pantum-alias.rules, которое будет идти следом за 60-pantum_mfp.rules и выполнять скрипт RUN+=»/opt/pantum5100adw.sh

/etc/udev/rules.d/61-pantum-alias.rules

SUBSYSTEMS=="usb",ATTRS{idVendor}=="232b",ATTRS{idProduct}=="2732",RUN+="/opt/pantum5100adw.sh"

Для применения udev-правила достаточно перезагрузить устройство, или выполнить

sudo udevadm trigger

Проверить успешность выполнения правила можно, взглянув на /etc/sane.d/dll.aliases,

/etc/sane.d/dll.aliases

alias Pantum BM5100 ADW pantum6500:libusb:001:009

файл должен содержать актуальный libusb-путь к устройству. Отныне фронтенд будет работать с псевдонимом (alias) устройства.

scanimage -L

device `PantumMB5100ADW' is a  Pantum BM5100ADW series (libusb:001:009)

Аналогичным образом это применимо и к сетевым устройствам. Псевдоним поможет хоть каким-то образом идентифицировать одинаковые модели устройств. Но, к примеру, NAPS2 пошёл своим путем и к нему не применим механизм alias. Как тут с первой попытки попасть на нужный HP — вопрос. Naps2 следует поработать над DeviceURI бэкенда hpaio.

Добавить устройство очень просто:

Список обнаруженных устройств

scanimage -L

device `hpaio:/net/laserjet_pro_m428-m429?ip=10.177.7.76&queue=false' is a Hewlett-Packard laserjet_pro_m428-m429 all-in-one device `hpaio:/net/colorlaserjet_mfp_m282-m285?ip=10.177.7.173&queue=false' is a Hewlett-Packard colorlaserjet_mfp_m282-m285 all-in-one 

Файл /etc/sane.d/dll.aliases

alias HP428 hpaio:/net/laserjet_pro_m428-m429?ip=10.173.22.3&queue=false alias HP282 hpaio:/net/colorlaserjet_mfp_m282-m285?ip=10.173.22.7&queue=false

Итоговый результат:

scanimage -L

device `HP428' is a Hewlett-Packard laserjet_pro_m428-m429 all-in-one device `HP282' is a Hewlett-Packard colorlaserjet_mfp_m282-m285 all-in-one 

Стоит заметить, что псевдонимы могут также использоваться с целью скрыть реальное имя устройства в целях безопасности или для точной идентификации пользователем при выборе сетевых устройств. В зависимости от настроек устройства и активных сетевых протоколов (например, Bonjour для escl), имя может быть контринтуитивным для пользователя. Например:

device `airscan:w5:HP LaserJet Pro M428-M429 [4FB2F4] (4)' is a WSD HP LaserJet Pro M428-M429 [4FB2F4] (4) ip=10.0.0.41 device `hpaio:/net/colorlaserjet_mfp_m282-m285?ip=10.0.0.43&queue=false' is a Hewlett-Packard colorlaserjet_mfp_m282-m285 all-in-one

Но и это ещё не все. Помимо возможности скрыть имя устройства, конкретное устройство можно «спрятать» от пользователя не внося изменения в настройки конфигурационных файлов бэкенда. Для этого используется команда hide в том же файле /etc/sane.d/dll.aliases. Пример, с сокрытием устройства, для которого назначен псевдоним:

alias Pantum BM5100 ADW pantum6500:libusb:001:009 hide pantum6500:libusb:001:009

В результате поиска при помощи scanimage -L, список будет пуст.

Внимание!

Формат использования hide в /etc/sane.d/dll.aliases чуть отличен от alias. Передавать команде следует имя устройства, но не псевдоним. Это накладывает некие ограничения на гибкость решения, так как требуется править начальный исполняемый скрипт /opt/pantum5100adw.sh для получения актуального имени.

#!/bin/bash  MODEL="Pantum BM5100 ADW" SANEBACKEND=pantum6500 PID=232b  BUS=$(lsusb | grep $PID | awk '{ print $2}') NUM=$(lsusb | grep $PID | awk '{ print $4}' | sed 's/.$//') DEVICE=$SANEBACKEND:libusb:$BUS:$NUM echo "hide $DEVICE" > /etc/sane.d/dll.aliases

Тестовый бэкенд (test)

SANE заложил возможность использование виртуального устройства через бэкенд test [40]. По-умолчанию, строка с названием бэкенда test закомментирована в /etc/sane.d/dll.conf. Виртуальное устройство именуется аналогично — test. Пример тестового сканирования тестового бэкенда (да, вот такой каламбур):

scanimage -d test -T

Output format is not set, using pnm as a default. scanimage: scanning image of size 157x196 pixels at 8 bits/pixel scanimage: acquiring gray frame, 8 bits/sample scanimage: reading one scanline, 157 bytes...   PASS scanimage: reading one byte...          PASS scanimage: stepped read, 2 bytes...     PASS scanimage: stepped read, 4 bytes...     PASS scanimage: stepped read, 8 bytes...     PASS scanimage: stepped read, 16 bytes...    PASS scanimage: stepped read, 32 bytes...    PASS scanimage: stepped read, 64 bytes...    PASS scanimage: stepped read, 128 bytes...   PASS scanimage: stepped read, 256 bytes...   PASS scanimage: stepped read, 255 bytes...   PASS scanimage: stepped read, 127 bytes...   PASS scanimage: stepped read, 63 bytes...    PASS scanimage: stepped read, 31 bytes...    PASS scanimage: stepped read, 15 bytes...    PASS scanimage: stepped read, 7 bytes...     PASS scanimage: stepped read, 3 bytes...     PASS 

Использование виртуального устройства будет полезным для тестирования графических программ с максимально широкими возможностями драйвера test. В основном, просто помогает запустить фронтенд (например fly-scan), чтобы посмотреть функционал графического приложения.

Виртуальное устройство (pnm)

Довольно экзотический способ тестирования фронтенда для обработки изображений с использованием бэкенда pnm. Библиотека /usr/lib/x86_64-linux-gnu/sane/libsane-pnm.so.1.1.1 входит в состав libsane1, для его включения необходимо только добавить строку pnm в конфигурационный файл /etc/sane.d/dll.conf. В результате, список устройств пополнится pnm:0 и pnm:1

scanimage -L

device `pnm:0' is a Noname PNM file reader virtual device device `pnm:1' is a Noname PNM file reader virtual device device `pantum6500:libusb:001:004' is a  Pantum BM5100ADW series (libusb:001:004)

ipp-usb (ipp-usb)

Не удастся обойти стороной и пакет ipp-usb. Хоть он и не является частью SANE, с его наличием в ОС связана одна из распространенных проблем с обнаружением локального устройства. Пакет ставится как зависимость sane-airscan (поведение в 1.7.6.Х будет изменено, пакет будет отмечен как предлагаемый Suggests для sane-airscan_0.99.19-1~bpo10+1+ci1), и служба ipp-usb.service благополучно запустится самостоятельно после подключения устройства к USB.

Без лишних уведомлений для пользователя. В dmesg, с некоторой задержкой после подключения может проскочить сообщение о выгрузке модуля usblp. Но с настройками по умолчанию в конфигурационном файле /etc/ipp-usb/ipp-usb.conf указано использование loopback интерфейса, и устройство больше не будет доступно. Ни локальное, ни сетевое. Не доступно как с хоста, так и с другого сетевого клиента.

Как узнать, что локальное устройство занято запущенной службой ipp-usb.service?

Разумеется, присутствие самого пакета ipp-usb

dpkg -l ipp-usb

ii  ipp-usb        0.9.17-3+b2  amd64        Daemon for IPP over USB printer support

и запущенная одноименная служба,

sudo systemctl status ipp-usb

● ipp-usb.service - Daemon for IPP over USB printer support    Loaded: loaded (/lib/systemd/system/ipp-usb.service; static; vendor preset: enabled)    Active: active (running) since Tue 2024-05-07 21:45:24 MSK; 23min ago      Docs: man:ipp-usb(8)  Main PID: 19633 (ipp-usb)     Tasks: 11 (limit: 2220)    Memory: 2.8M       CPU: 126ms    CGroup: /system.slice/ipp-usb.service            └─19633 /sbin/ipp-usb udev  мая 07 21:45:24 alse176 systemd[1]: Started Daemon for IPP over USB printer support. 

или вывод команды ipp-usb,

sudo ipp-usb check

IPP over USB devices:  Num  Device              Vndr:Prod  Model    1. Bus 004 Device 004  232b:2732  "Pantum BM5100ADW series"

или, мой самый любимый, — наличие файлов в директории с отладочной информацией /var/log/ipp-usb/<device_name>.log

При всем этом sane-find-scanner найдет устройство. Ранее мы говорили об этом для определения сканера, он проверяет значения bInterfaceClass=255 (Vendor Specific Interface) интерфейсов.

Как это выглядит со стороны фронтенда. scanimage покажет, что устройство (интерфейс) предположительно занято модулем scanner или usblp.

SANE_DEBUG_SANEI_USB=4 scanimage -L

[20:17:56.207492] [sanei_usb] device name: libusb:004:004-BM5100ADW series [20:17:56.207910] [sanei_usb] com_pantum_sanei_usb_open: libusb complained: Resource busy [20:17:56.208012] [sanei_usb] Maybe the kernel scanner driver or usblp claims the interface? Ignoring this error... [20:17:56.208147] [sanei_usb] com_pantum_sanei_usb_open: libusb complained: Resource busy [20:17:56.208223] [sanei_usb] Maybe the kernel scanner driver claims the scanner's interface? [20:17:57.208731] [sanei_usb] com_pantum_sanei_usb_open: libusb complained: Resource busy [20:17:57.208848] [sanei_usb] Maybe the kernel scanner driver or usblp claims the interface? Ignoring this error... [20:17:57.208974] [sanei_usb] com_pantum_sanei_usb_open: libusb complained: Resource busy [20:17:57.209062] [sanei_usb] Maybe the kernel scanner driver claims the scanner's interface? [20:17:58.209563] [sanei_usb] com_pantum_sanei_usb_open: libusb complained: Resource busy [20:17:58.209680] [sanei_usb] Maybe the kernel scanner driver or usblp claims the interface? Ignoring this error... [20:17:58.209829] [sanei_usb] com_pantum_sanei_usb_open: libusb complained: Resource busy [20:17:58.209919] [sanei_usb] Maybe the kernel scanner driver claims the scanner's interface?

Чуть иначе для сравнения выглядит вывод отладочной информации от драйвера kyocera_wc3_usb

SANE_DEBUG_KYOCERA_WC3_USB=255 scanimage -L

[kyocera_debug] Setting debug level of kyocera_wc3_usb to 255. [kyocera_wc3_usb] >>sane_init [kyocera_wc3_usb] sane_init() : Kyocera backend (build 1), version != null, authorize != null [kyocera_wc3_usb] <<sane_init [kyocera_wc3_usb] >>sane_get_devices [kyocera_wc3_usb] sane_get_devices() : start reading config file kyocera_wc3_usb.conf <...> [kyocera_wc3_usb] attach_one_usb() [kyocera_wc3_usb] attach_one() [kyocera_wc3_usb] connect_scanner() : INFO : connecting usb scanner device libusb:002:002 [kyocera_wc3_usb] attach_one() : ERROR : failed to open scanner with device name libusb:002:002 [kyocera_wc3_usb] sane_get_devices() : usb 0x0482 0x0ca7

В обоих случаях libusb (более верно будет сказать бэкенд через libusb) не может обменяться данными с устройством. Интерфейс(ы) кем-то заняты. После неудачных попыток обращения бэкенда dmesg выведет 3 одинаковых сообщения (по одному на каждый интерфейс) от usbfs о том, что интерфейс занят usbfs.

dmesg —level=warn

Перечисленные ниже события имеют тип Warning. Вывести все события этого уровня можно через dmesg —level=warn

[42294.012641] usb 1-1: usbfs: interface 0 claimed by usbfs while 'scanimage' sets config #1 [42295.013138] usb 1-1: usbfs: interface 0 claimed by usbfs while 'scanimage' sets config #1 [42296.013534] usb 1-1: usbfs: interface 0 claimed by usbfs while 'scanimage' sets config #1

в этом можно убедиться, просмотрев вывод

sudo cat /sys/kernel/debug/usb/devices

T:  Bus=04 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#=  4 Spd=480  MxCh= 0 D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1 P:  Vendor=232b ProdID=2732 Rev= 1.00 S:  Manufacturer=Pantum S:  Product=BM5100ADW series S:  SerialNumber=CK1A046238 C:* #Ifs= 3 Cfg#= 1 Atr=c0 MxPwr=  2mA I:  If#= 0 Alt= 0 #EPs= 2 Cls=07(print) Sub=01 Prot=02 Driver=usbfs E:  Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms E:  Ad=01(O) Atr=02(Bulk) MxPS= 512 Ivl=1250us I:* If#= 0 Alt= 1 #EPs= 2 Cls=07(print) Sub=01 Prot=04 Driver=usbfs E:  Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms E:  Ad=82(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms I:  If#= 1 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=ff Driver=usbfs E:  Ad=83(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms E:  Ad=03(O) Atr=02(Bulk) MxPS= 512 Ivl=1250us E:  Ad=84(I) Atr=03(Int.) MxPS=  12 Ivl=64ms I:* If#= 1 Alt= 1 #EPs= 2 Cls=07(print) Sub=01 Prot=04 Driver=usbfs E:  Ad=04(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms E:  Ad=85(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms I:  If#= 2 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=01 Prot=01 Driver=usbfs E:  Ad=86(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms E:  Ad=05(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms I:* If#= 2 Alt= 1 #EPs= 2 Cls=07(print) Sub=01 Prot=04 Driver=usbfs E:  Ad=06(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms E:  Ad=87(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms

Все альтернативные интерфейсы (If#= 0-2 Alt= 1) стали активными (сравните с выводом в начале), и для них уже загружен модуль usbfs. Интерфейсы заняты тем же libusb, функцией libusb_claim_interface() [41], но породил этот процесс ipp-usb

sudo lsof /dev/bus/usb/001/003

COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME ipp-usb 19633 root   12u   CHR  189,2      0t0  468 /dev/bus/usb/001/003

Вот для сравнения вывод usb-devices при отключенной службе ipp-usb

ipp-usb disable

T:  Bus=04 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#=  5 Spd=480 MxCh= 0 D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1 P:  Vendor=232b ProdID=2732 Rev=01.00 S:  Manufacturer=Pantum S:  Product=BM5100ADW series S:  SerialNumber=CK1A046238 C:  #Ifs= 3 Cfg#= 1 Atr=c0 MxPwr=2mA I:  If#=0x0 Alt= 0 #EPs= 2 Cls=07(print) Sub=01 Prot=02 Driver=usblp I:  If#=0x1 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=ff Driver=(none) I:  If#=0x2 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=01 Prot=01 Driver=(none) 

и активной

ipp-usb enabled

T:  Bus=04 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#=  5 Spd=480 MxCh= 0 D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1 P:  Vendor=232b ProdID=2732 Rev=01.00 S:  Manufacturer=Pantum S:  Product=BM5100ADW series S:  SerialNumber=CK1A046238 C:  #Ifs= 3 Cfg#= 1 Atr=c0 MxPwr=2mA I:  If#=0x0 Alt= 1 #EPs= 2 Cls=07(print) Sub=01 Prot=04 Driver=usbfs I:  If#=0x1 Alt= 1 #EPs= 2 Cls=07(print) Sub=01 Prot=04 Driver=usbfs I:  If#=0x2 Alt= 1 #EPs= 2 Cls=07(print) Sub=01 Prot=04 Driver=usbfs

Включенная отладка usbfs_snoop (см. раздел Диагностика) будет содержать событие об открытом процессом ipp-usb интерфейсе usb 1-1

dmesg

[296556.897166] usb 1-1: new high-speed USB device number 6 using ehci-pci [296557.350512] usb 1-1: New USB device found, idVendor=232b, idProduct=2732, bcdDevice= 1.00 [296557.350536] usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [296557.350551] usb 1-1: Product: BM5100ADW series [296557.350562] usb 1-1: Manufacturer: Pantum [296557.350573] usb 1-1: SerialNumber: CK1A046238 [296557.467506] usblp 1-1:1.0: usblp0: USB Bidirectional printer dev 6 if 0 alt 0 proto 2 vid 0x232B pid 0x2732 [296557.703523] usb 1-1: opened by process 23010: ipp-usb

Тут же можно зафиксировать периодический обмен данными устройства с хостом

Отладочная информация
<...> [296657.745671] data: 0e 03 50 00 61 00 6e 00 74 00 75 00 6d 00                                                        ..P.a.n.t.u.m. [296657.745756] usb 1-1: usbdev_do_ioctl: REAPURBNDELAY [296657.745768] usb 1-1: reap 00007ef698000fc0 [296657.745801] usb 1-1: usbdev_do_ioctl: REAPURBNDELAY [296657.745926] usb 1-1: usbdev_do_ioctl: SUBMITURB [296657.745938] usb 1-1: control urb: bRequestType=80 bRequest=06 wValue=0300 wIndex=0000 wLength=0004 [296657.745980] usb 1-1: userurb 00007ef698000c60, ep0 ctrl-in, length 4 [296657.768639] usb 1-1: urb complete [296657.768651] usb 1-1: userurb 00007ef698000c60, ep0 ctrl-in, actual_length 4 status 0 [296657.768670] data: 04 03 09 04                                                                                      .... [296657.768758] usb 1-1: usbdev_do_ioctl: REAPURBNDELAY [296657.768770] usb 1-1: reap 00007ef698000c60 [296657.768803] usb 1-1: usbdev_do_ioctl: REAPURBNDELAY [296657.768919] usb 1-1: usbdev_do_ioctl: SUBMITURB [296657.768932] usb 1-1: control urb: bRequestType=80 bRequest=06 wValue=0302 wIndex=0409 wLength=00ff [296657.768975] usb 1-1: userurb 00007ef698000fc0, ep0 ctrl-in, length 255 [296657.792433] usb 1-1: urb complete [296657.792445] usb 1-1: userurb 00007ef698000fc0, ep0 ctrl-in, actual_length 34 status 0 [296657.792464] data: 22 03 42 00 4d 00 35 00 31 00 30 00 30 00 41 00 44 00 57 00 20 00 73 00 65 00 72 00 69 00 65 00  ".B.M.5.1.0.0.A.D.W. .s.e.r.i.e. [296657.792478] data: 73 00                                                                                            s. [296657.792565] usb 1-1: usbdev_do_ioctl: REAPURBNDELAY [296657.792577] usb 1-1: reap 00007ef698000fc0 [296657.792611] usb 1-1: usbdev_do_ioctl: REAPURBNDELAY [296657.792732] usb 1-1: usbdev_do_ioctl: SUBMITURB [296657.792745] usb 1-1: control urb: bRequestType=80 bRequest=06 wValue=0300 wIndex=0000 wLength=0004 [296657.792786] usb 1-1: userurb 00007ef698000c60, ep0 ctrl-in, length 4 [296657.815483] usb 1-1: urb complete [296657.815496] usb 1-1: userurb 00007ef698000c60, ep0 ctrl-in, actual_length 4 status 0 [296657.815515] data: 04 03 09 04                                                                                      .... [296657.815608] usb 1-1: usbdev_do_ioctl: REAPURBNDELAY [296657.815620] usb 1-1: reap 00007ef698000c60 [296657.815652] usb 1-1: usbdev_do_ioctl: REAPURBNDELAY [296657.815767] usb 1-1: usbdev_do_ioctl: SUBMITURB [296657.815780] usb 1-1: control urb: bRequestType=80 bRequest=06 wValue=0303 wIndex=0409 wLength=00ff [296657.815822] usb 1-1: userurb 00007ef698000fc0, ep0 ctrl-in, length 255 [296657.836933] usb 1-1: urb complete [296657.836945] usb 1-1: userurb 00007ef698000fc0, ep0 ctrl-in, actual_length 22 status 0 [296657.836964] data: 16 03 43 00 4b 00 31 00 41 00 30 00 34 00 36 00 32 00 33 00 38 00                                ..C.K.1.A.0.4.6.2.3.8. <...>

Чтобы устройство стало доступно по сети, потребуется поменять значение interface с loopback на all (указать конкретный интерфейс, например eth0 не удастся, служба не запустится) в конфигурационном файле /etc/ipp-usb/ipp-usb.conf

/etc/ipp-usb/ipp-usb.conf

interface = all

тут же можно указать диапазон портов, поддержку ipv6 и уровень логирования.

В целом, концепция работы описана на странице [42] проекта. Огромным преимуществом ipp-usb является отсутствие необходимости устанавливать драйвер. Также, ipp-usb поможет с поддержкой локального устройства на других аппаратных платформах (речь в первую очередь идёт об OpenWRT) о которых не позаботился вендор. В жертву удобству идут ограничения драйвера escl, по сравнению с локальным бэкендом. Для сравнения:

escl
All options specific to device `escl:http://10.0.0.12:60000':   Scan mode:     --mode Color|Gray|Lineart [Color]         Selects the scan mode (e.g., lineart, monochrome, or color).     --resolution 75|150|300|600dpi [75]         Sets the resolution of the scanned image.     --source Flatbed|ADF|ADF Duplex [Flatbed]         Selects the scan source (such as a document-feeder).   Geometry:     -l 0..205.063mm [0]         Top-left x position of scan area.     -t 0..286.173mm [0]         Top-left y position of scan area.     -x 10.8373..215.9mm [215.9]         Width of scan-area.     -y 10.8373..297.011mm [297.011]         Height of scan-area.   Enhancement:     --preview[=(yes|no)] [no]         Request a preview-quality scan.     --preview-in-gray[=(yes|no)] [no]         Request that all previews are done in monochrome mode.  On a         three-pass scanner this cuts down the number of passes to one and on a         one-pass scanner, it reduces the memory requirements and scan-time of         the preview.     --brightness 32766..8158832 [inactive]         Controls the brightness of the acquired image.     --contrast 32766..8158832 [inactive]         Controls the contrast of the acquired image.     --sharpen 32766..8158832 [inactive]         Set sharpen value.     --threshold 32766..8158832 [inactive]         Select minimum-brightness to get a white point 

pantum6500. Как видим, оригинальный драйвер имеет возможность сканировать в более высоком разрешении (1200dpi)

pantum6500
All options specific to device `pantum6500:libusb:004:005':   Standard:     --preview[=(yes|no)] [no]         Request a preview-quality scan.     --resolution 75|150|300|600|1200dpi [300]         Sets the resolution of the scanned image.     --mode Lineart|Gray|Color [Color]         Selects the scan mode (e.g., lineart, monochrome, or color).     --threshold 1..255 [inactive]         Select minimum-brightness to get a white point     --source Flatbed|Automatic Document Feeder|Automatic Document Feeder (Duplex) [Flatbed]         Selects the scan source (such as a document-feeder).     --geometry 稿台|A4|A5|B5|Letter|Full size [A4]         Scan area and media size options     -l 0..216mm (in steps of 1) [0]         Top-left x position of scan area.     -t 0..297mm (in steps of 1) [0]         Top-left y position of scan area.     -x 0..216mm (in steps of 1) [216]         Width of scan-area.     -y 0..297mm (in steps of 1) [297]         Height of scan-area. 

Этих и других недостатков лишен сетевой бэкенд net. Об этом чуть ниже в главе saned.

Как решить проблему с монопольным доступом к устройству службой ipp-usb? В большинстве случаев — просто удалить пакет. Или остановить, а затем отключить службу. Если все же необходимость в ipp-usb сохраняется, скажем только для конкретного USB-устройства, неугодное(ых) можно добавить в /usr/share/ipp-usb/quirks/blacklist.conf.

/usr/share/ipp-usb/quirks/blacklist.conf

[Pantum BM5100ADW series]   blacklist = true

и после перезапуска службы, локальное устройство будет снова доступно.

Более детально о синтаксисе blacklist можно узнать из man ipp-usb (раздел Quirks)

saned (sane-utils)

Служба для предоставления доступа к локально подключенному устройству по сети через бэкенд net [43]. Порядок настройки описан в статье Saned. Подключение удаленного сканера [44].

Помимо традиционных сценариев использования, скажем, поделиться локальным устройством по сети, служба также может быть использована и для сетевых устройств, для которых сетевые бэкенды имеют ограниченный функционал. Главная «киллер-фича» бэкенда — использование по сети всего функционала оригинального локального бэкенда. Для сравнения, вариант ipp-usb с бэкендом escl

escl
All options specific to device `escl:http://10.0.0.12:60000':   Scan mode:     --mode Color|Gray|Lineart [Color]         Selects the scan mode (e.g., lineart, monochrome, or color).     --resolution 75|150|300|600dpi [75]         Sets the resolution of the scanned image.     --source Flatbed|ADF|ADF Duplex [Flatbed]         Selects the scan source (such as a document-feeder).   Geometry:     -l 0..205.063mm [0]         Top-left x position of scan area.     -t 0..286.173mm [0]         Top-left y position of scan area.     -x 10.8373..215.9mm [215.9]         Width of scan-area.     -y 10.8373..297.011mm [297.011]         Height of scan-area.   Enhancement:     --preview[=(yes|no)] [no]         Request a preview-quality scan.     --preview-in-gray[=(yes|no)] [no]         Request that all previews are done in monochrome mode.  On a         three-pass scanner this cuts down the number of passes to one and on a         one-pass scanner, it reduces the memory requirements and scan-time of         the preview.     --brightness 32766..8158832 [inactive]         Controls the brightness of the acquired image.     --contrast 32766..8158832 [inactive]         Controls the contrast of the acquired image.     --sharpen 32766..8158832 [inactive]         Set sharpen value.     --threshold 32766..8158832 [inactive]         Select minimum-brightness to get a white point

и с сетевым бэкендом net

scanimage -d ‘net:10.0.0.12:pantum6500:libusb:004:005’ -T
All options specific to device `net:10.0.0.12:pantum6500:libusb:004:005':   Standard:     --preview[=(yes|no)] [no]         Request a preview-quality scan.     --resolution 75|150|300|600|1200dpi [300]         Sets the resolution of the scanned image.     --mode Lineart|Gray|Color [Color]         Selects the scan mode (e.g., lineart, monochrome, or color).     --threshold 1..255 [inactive]         Select minimum-brightness to get a white point     --source Flatbed|Automatic Document Feeder|Automatic Document Feeder (Duplex) [Flatbed]         Selects the scan source (such as a document-feeder).     --geometry 稿台|A4|A5|B5|Letter|Full size [A4]         Scan area and media size options     -l 0..216mm (in steps of 1) [0]         Top-left x position of scan area.     -t 0..297mm (in steps of 1) [0]         Top-left y position of scan area.     -x 0..216mm (in steps of 1) [216]         Width of scan-area.     -y 0..297mm (in steps of 1) [297]         Height of scan-area.

Ещё одним преимуществом является то, что запущенный saned позволяет пользоваться устройством на рабочем месте, к которому устройство подключено локально. Устройство не блокируется как с ipp-usb.

scanimage x32 (sane-utils)

Имея дело со сканирующими устройствами, часто приходится сталкиваться с ситуацией, когда устройство ещё работает (это не редко), а драйверов к нему уже нет (а вот это уже часто). Да, раньше умели делать оргтехнику. Современный рынок производитель не считает нужным почтить память снятого с производства устройства, выложив исходный код драйвера для использования сообществом. В качестве таких артефактов (и это в целом, лучше чем ничего) можно найти пакеты драйверов для i386 архитектуры. Но как ими пользоваться в 64-разрядной ОС? Простой установкой 32-битных библиотек ia32-libs тут не обойтись. Потребуется использовать фронтенд для работы с этими библиотеками.

Попробуем собрать 32 битную версию scanimage для поддержки консольного сканирования на стареньком Xerox 3100. Посмотрите на этого красавца, «Где мой 2008 год…»)

Загружаем любимый 32-битный дистрибутив в Live-режиме и выполняем сборку backends-1.3.1

apt install autopoint gettext automake autotools-dev autoconf libtool patch autoconf-archive pkg-config libusb-dev libusb-dev build-essential libsane-dev libavahi-client-dev libavahi-glib-dev -y wget https://gitlab.com/sane-project/backends/-/archive/1.3.1/backends-1.3.1.zip unzip backends-1.3.1.zip cd backends-1.3.1 ./autogen.sh ./configure --disable-dependency-tracking make

Сборка

Получить полную справку по возможным параметрам сборки

./configure --help

Перемещаем исполняемый файл /usr/local/bin/scanimage на 64 разрядную ОС. Выполняем установку библиотек ia32-libs

sudo apt install ia32-libs

И выполняем тестовый запуск с отладочной информацией SANE_DEBUG_DLL=255 ./scanimage

[10:02:13.367457] [sanei_debug] Setting debug level of dll to 255. [10:02:13.368482] [dll] sane_init: SANE dll backend version 1.0.13 from sane-backends 1.1.1-debian [10:02:13.369346] [dll] sane_init/read_dlld: attempting to open directory `./dll.d' [10:02:13.370720] [dll] sane_init/read_dlld: attempting to open directory `/etc/sane.d/dll.d' [10:02:13.371457] [dll] sane_init/read_dlld: using config directory `/etc/sane.d/dll.d' [10:02:13.373575] [dll] sane_init/read_dlld: considering /etc/sane.d/dll.d/airscan [10:02:13.374197] [dll] sane_init/read_config: reading dll.d/airscan [10:02:13.374742] [dll] add_backend: adding backend `airscan' [10:02:13.375260] [dll] sane_init/read_dlld: done. [10:02:13.375792] [dll] sane_init/read_config: reading dll.conf [10:02:13.376303] [dll] add_backend: adding backend `net' [10:02:13.376778] [dll] add_backend: adding backend `abaton' <...> [10:02:13.405631] [dll] add_backend: adding backend `kyocera' [10:02:13.406028] [dll] add_backend: adding backend `kyocera_gdi_a3' [10:02:13.406199] [dll] add_backend: adding backend `kyocera_wc3' [10:02:13.406559] [dll] add_backend: adding backend `kyocera_wc3_usb' Output format is not set, using pnm as a default. [10:02:13.408282] [dll] sane_get_devices [10:02:13.408675] [dll] load: searching backend `kyocera_wc3_usb' in `/usr/lib/i386-linux-gnu/sane:/usr/lib/sane:/usr/lib64/sane' [10:02:13.408812] [dll] load: trying to load `/usr/lib/i386-linux-gnu/sane/libsane-kyocera_wc3_usb.so.1' [10:02:13.409279] [dll] load: couldn't open `/usr/lib/i386-linux-gnu/sane/libsane-kyocera_wc3_usb.so.1' (No such file or directory) [10:02:13.409656] [dll] load: trying to load `/usr/lib/sane/libsane-kyocera_wc3_usb.so.1' [10:02:13.409855] [dll] load: dlopen()ing `/usr/lib/sane/libsane-kyocera_wc3_usb.so.1' [10:02:13.412141] [dll] load: dlopen() failed (/usr/lib/sane/libsane-kyocera_wc3_usb.so.1: wrong ELF class: ELFCLASS64) [10:02:13.412564] [dll] load: searching backend `kyocera_wc3' in `/usr/lib/i386-linux-gnu/sane:/usr/lib/sane:/usr/lib64/sane' [10:02:13.412996] [dll] load: trying to load `/usr/lib/i386-linux-gnu/sane/libsane-kyocera_wc3.so.1' [10:02:13.413171] [dll] load: couldn't open `/usr/lib/i386-linux-gnu/sane/libsane-kyocera_wc3.so.1' (No such file or directory) [10:02:13.413558] [dll] load: trying to load `/usr/lib/sane/libsane-kyocera_wc3.so.1' [10:02:13.413748] [dll] load: dlopen()ing `/usr/lib/sane/libsane-kyocera_wc3.so.1' [10:02:13.414203] [dll] load: dlopen() failed (/usr/lib/sane/libsane-kyocera_wc3.so.1: wrong ELF class: ELFCLASS64) <...>

Замечательно, в этом случае, ошибка

[10:02:13.414203] [dll] load: dlopen() failed (/usr/lib/sane/libsane-kyocera_wc3.so.1: wrong ELF class: ELFCLASS64)

сигнализирует о корректной работе scanimage, ему необходимы 32-битные версии библиотек бэкенда. Они же потребуются для установки драйвера. Тестовое сканирование выполнять с указанием абсолютного пути до исполняемого файла. Для удобства и контроля выполнения, его можно перенести и заботливо переименовать в /usr/bin/scanimage32.

/usr/bin/scanimage --format=jpg -d XeroxPhaser3100:usb:001:002 > /image.jpg

Таким образом, в системе по умолчанию будет по-прежнему использоваться рабочее 64-битное окружение с его бэкендами и графическими фронтендами. Но в случае необходимости, существует возможность использовать 32-битные фронтенды.

Заключение

Если вам посчастливилось добраться до этой части, внимательно изучив все три материала (полагаю, это возможно в случае, если пришлось столкнуться с проблемами при настройке сканеров), то картина убогого устройства SANE у вас в голове сформировалась.

Из года в год кодовая база пополняется поддержкой новых устройств, расширяется список протестированных, решаются проблемы текущих устройств. Но основная механика остается неизменна. А что в этом плохого? Ну как:

  • legacy устройства (да, я про SCSI) тормозят простой запуск, затрачивая время на инициализацию и поиск совместимых устройств.

  • алгоритм поиска устройств не эффективен. Зачем тратить время на инициализацию всех бэкендов, когда на момент запуска, уникальный идентификатор idVendor и idProduct уже известен и можно ограничиться запуском только нужного бэкенда. Да, придется прошерстить тысячу строк, но это всё равно быстрее.

  • отсутствие механизма управления атрибутами устройства для облегчения идентификации и инвентаризации. Например: «Расположение», «Адрес», «Кабинет». Да что говорить, имя устройства (DeviceURI) не поменять!

  • отсутствие механизма управления свойств устройства для тех же целей при поиске подходящего под твои задачи устройства. Например: «Цветное сканирование», «Поддержка сканирования А3», «Двусторонний АПД» и т.п.

  • нет единого пространства управления устройствами. Фронтенд сканирования не в счет, он пользуется готовым именем и работает с тем, что нашел. Частично это решается проприетарным ПО вендора, но понятное дело, список поддерживаемых устройств этим ПО ограничен производителем.

Очевидно, проект не разрабатывается как корпоративное масштабируемое решение и предназначен в первую очередь для пользователей, но не для доменных структур. Поэтому далее продолжать нет смысла, можете сами придумать, взяв в пример функционал принт-сервера.

Появление подобного программного комплекса — вопрос времени.


ссылка на оригинал статьи https://habr.com/ru/articles/863940/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *