Стек бездрайверного сканирования и печати ОС Linux (Александр Певзнер, OSSDEVCONF-2023)

Материал из 0x1.tv

Докладчик
Александр Певзнер

Описываются пакеты sane-airscan и ipp-usb. Sane-airscan — это драйвер SANE, реализующий поддержку «бездрайверного» сканирования. Драйвер поддерживает два наиболее популярных протокола: eSCL (часть Apple Airprint) и Microsoft WDS. Ipp-usb — это системный демон, обеспечивающий поддержку «бездрайверного» сканирования и печати для USB устройств без сетевого подключения. Даётся обзор технологии «бездрайверного» сканирования и печати, которая существенно упрощает администрирование и настройку принтеров и сканеров, делая её доступной даже неквалифицированным пользователям.

Видео

on youtube

Презентация

Стек бездрайверного сканирования и печати ОС Linux (Александр Певзнер, OSSDEVCONF-2023).pdf Стек бездрайверного сканирования и печати ОС Linux (Александр Певзнер, OSSDEVCONF-2023).pdf Стек бездрайверного сканирования и печати ОС Linux (Александр Певзнер, OSSDEVCONF-2023).pdf Стек бездрайверного сканирования и печати ОС Linux (Александр Певзнер, OSSDEVCONF-2023).pdf Стек бездрайверного сканирования и печати ОС Linux (Александр Певзнер, OSSDEVCONF-2023).pdf Стек бездрайверного сканирования и печати ОС Linux (Александр Певзнер, OSSDEVCONF-2023).pdf Стек бездрайверного сканирования и печати ОС Linux (Александр Певзнер, OSSDEVCONF-2023).pdf Стек бездрайверного сканирования и печати ОС Linux (Александр Певзнер, OSSDEVCONF-2023).pdf Стек бездрайверного сканирования и печати ОС Linux (Александр Певзнер, OSSDEVCONF-2023).pdf Стек бездрайверного сканирования и печати ОС Linux (Александр Певзнер, OSSDEVCONF-2023).pdf Стек бездрайверного сканирования и печати ОС Linux (Александр Певзнер, OSSDEVCONF-2023).pdf Стек бездрайверного сканирования и печати ОС Linux (Александр Певзнер, OSSDEVCONF-2023).pdf Стек бездрайверного сканирования и печати ОС Linux (Александр Певзнер, OSSDEVCONF-2023).pdf Стек бездрайверного сканирования и печати ОС Linux (Александр Певзнер, OSSDEVCONF-2023).pdf Стек бездрайверного сканирования и печати ОС Linux (Александр Певзнер, OSSDEVCONF-2023).pdf Стек бездрайверного сканирования и печати ОС Linux (Александр Певзнер, OSSDEVCONF-2023).pdf Стек бездрайверного сканирования и печати ОС Linux (Александр Певзнер, OSSDEVCONF-2023).pdf Стек бездрайверного сканирования и печати ОС Linux (Александр Певзнер, OSSDEVCONF-2023).pdf Стек бездрайверного сканирования и печати ОС Linux (Александр Певзнер, OSSDEVCONF-2023).pdf Стек бездрайверного сканирования и печати ОС Linux (Александр Певзнер, OSSDEVCONF-2023).pdf

Thesis

Что такое бездрайверное сканирование и печать?

Традиционно любое внешнее устройство нуждается в своём специфическом драйвере. Поиск, установка и настройка драйверов

—  не всегда простая задача. Особенно если речь идёт не о Windows.

В то же время, мы привыкли, что любая флешка в любом компьютере под управлением любой ОС «просто работает» и в настройке не нуждается.

Это стало возможным потому, что все флешки поддерживают единый, стандартный протокол. На этом примере мы видим смену парадигмы: теперь не операционная система подстраивается (с помощью драйвера) под аппаратуру, а аппаратура и ОС подстраиваются под стандартный, не зависящий от производителей, протокол.

Аналогичная технология в отношении принтеров и сканеров называется «бездрайверной» печатью и сканированием — в том смысле, что общий, единый для всех устройств драйвер становится частью ОС, а не поставляется вместе с аппаратурой.

Стандарты и протоколы

Существует два набора стандартов для «бездрайверного» сканирования и печати.

Первый набор активно продвигается (и частично разработан) компанией Apple. Он основан на таких открытых стандартах IETF, как DNS-SD[1] для поиска устройств в сети и IPP[2], [3] для печати.

Спецификация eSCL (протокол для сканирования) сначала была доступна только на условиях NDA, но позже [https://mopria.org/spec-download была опубликована Mopria Alliance]. Тем самым, в настоящий момент весь стек протоколов является открытым.

Маркетинговые названия, под которыми Apple продвигает этот набор протоколов (Bonjour Printing и AirPrint. AirPrint) для сканеров неофициально называется AirScan.

Другой набор протоколов, близкий семантически, но совершенно не совместимый на уровне форматов запросов и ответов, разработан и придвигается компанией Microsoft и называется Web Services for Devices (WSD) и состоит из WS-Discovery, протокола поиска устройств, и WS-Scan/WS-Print, протоколов сканирования/печати. Спецификация опубликована.

Для поддержки USB-устройств без сетевого подключения существует протокол IPP over USB, который вернее было бы назвать HTTP over USB. Его идея заключается в замене TCP-транспорта USB-транспортом в HTTP, и тем самым

—  обеспечения поддержки протоколов IPP и eSCL, основанных на HTTP. Даже встроенная в принтер конфигурационная

веб-консоль работает через IPP over USB.

При этом протоколы WSD через IPP over USB не поддерживаются.

Основные компоненты стека

Бездрайверное сканирование и печать работает с устройствами, которые подключаются по сети (Ethernet или WiFi) или через USB.

Настройка устройств максимально автоматизирована и в большинстве случаев сводится к выбору нужного устройства из предложенного списка.

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


  1. Автоматическое обнаружение устройств в сети.
  2. Поддержку протокола печати.
  3. Поддержку протокола сканирования.
  4. Поддержку IPP over USB.


Автором был разработан драйвер сканера sane-airscan, реализующий оба семейства протоколов сканирования в одном драйвере и программа (системный демон) ipp-usb, реализующая поддержку IPP over USB.

sane-airscan

sane-airscan — это драйвер сканера, совместимый с проектом SANE (но не входящий в него, независимый). Он написан на языке Си.

sane-airscan реализует оба протокола сканирования, eSCL и WSD.

Поиск eSCL-устройств полагается на DNS-SD демона Avahi, но поиск WSD-устройств пришлось реализовать в драйвере самостоятельно из-за отсутствия в Linux стандартной реализации WS-Discovery.

При разработке sane-airscan ставилась задача обеспечить максимальный комфорт для пользователя. Это потребовало решения ряда интересных технических задач.

% %\item 1. Сведение вместе результатов поиска одного и того же устройства. % Одно и то же устройство может быть найдено сразу в нескольких экземплярах: eSCL/WSD, IPv4/IPv6, HTTP/HTTPS и т.п. sane-airscan сводит все такие «находки» вместе, предлагая пользователю выбирать из списка фактически присутствующих физических устройств. Это оказалось достаточно неочевидной задачей, и её решение занимает

примерно 1/4 кодовой базы драйвера.

2. Оптимизация скорости поиска WSD. Поиск DNS-SD через Avahi работает быстро, т.к. фактически Avahi сканирует сеть всё время и по запросу возвращает свой кэш. А вот работающему без демона-помощника WS-Discovery, для надёжного обнаружения устройств требуется время на сканирование сети.

Для ускорения сканирования используется тот факт, что большинство WSD-сканеров являются МФУ, совмещёнными с IPP-принтерами: сканирование можно прекратить, как только прояснится статус всех устройств, которые видны через Avahi как IPP-принтеры.

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

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

Для решения этой проблемы sane-airscan спекулятивно возвращает параметры изображения, совпадающие с запрошенными, а при распаковке изображения приводит его в соответствие с заявленными параметрами.

ipp-usb

ipp-usb — это демон, реализующий поддержку IPP over USB. Он написан на языке Go.

Ранняя реализация для Linux, ippusbxd, была очень простая. Эта программа принимала TCP-соединения, принятые из TCP-сокета, данные отправляла в USB, пришедший из USB ответ отправляла назад в TCP.

Работало это не очень хорошо. При некорректном поведении клиента синхронизация между хостом и устройством терялась, и это нарушало обработку последующих запросов. Причина в том, что в отличии от TCP, в USB нет механизма, позволяющего восстановить синхронизацию, просто закрыв соединение.

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

Текущее состояние и перспективы развития

Оба проекта несколько лет находятся в активной эксплуатации и входят во все основные дистрибутивы Linux. Усилиями пользователей sane-airscan перенесён на все основные ветки BSD. Ipp-usb недавно был перенесён на FreeBSD. Sane-airscan входит в состав Google ChromeOS. Реализация IPP over USB из ChromeOS является разработкой Google, но основана на наработках и идеях, позаимствованных из ipp-usb.

Список устройств, протестированных (усилиями пользователей) на совместимость с sane-airscan, состоит более чем из 170-и записей и постоянно продолжает расти.

Можно ожидать, что в перспективе нескольких лет практически все новые принтеры и сканеры будут «бездрайверными».

Опыт продвижения проектов в дистрибутивы Linux

Ключевыми моментами успешного продвижения проектов в дистрибутивы Linux явились, по мнению автора, следующие:

  1. Востребованность самих проектов.
  2. Участие автора в дискуссиях на площадках зарубежных форумов коллективной поддержки популярных дистрибутивов Linux.
  3. Качественная реализация.
  4. Распространение программ не только в исходных текстах, но и в виде пригодных для инсталляции пакетов для многих дистрибутивов.
  5. Быстрая реакция на сообщения пользователей о проблемах и ошибках.


Для сборки пакетов использовалась площадка OpenSUSE Build Service, поддерживающая, кроме OpenSUSE, множество других дистрибутивов. Использование этой площадки бесплатно для проектов с открытыми исходными текстами.


Стек бездрайверного сканирования и печати ОС Linux (Александр Певзнер, OSSDEVCONF-2023)!.jpg

Примечания и ссылки

  1. S. Cheshire, M. Krochmal, DNS-Based Service Discovery, RFC-6763, 2013
  2. M. Sweet, Internet Printing Protocol/1.1: Encoding and Transport, RFC-8010, 2017
  3. M. Sweet, Internet Printing Protocol/1.1: Model and Semantics, RFC-8011, 2017