Стек бездрайверного сканирования и печати ОС Linux (Александр Певзнер, OSSDEVCONF-2023)
Материал из 0x1.tv
- Докладчик
- Александр Певзнер
Описываются пакеты sane-airscan и ipp-usb. Sane-airscan — это драйвер SANE, реализующий поддержку «бездрайверного» сканирования. Драйвер поддерживает два наиболее популярных протокола: eSCL (часть Apple Airprint) и Microsoft WDS. Ipp-usb — это системный демон, обеспечивающий поддержку «бездрайверного» сканирования и печати для USB устройств без сетевого подключения. Даётся обзор технологии «бездрайверного» сканирования и печати, которая существенно упрощает администрирование и настройку принтеров и сканеров, делая её доступной даже неквалифицированным пользователям.
Содержание
Видео
Презентация
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.
Настройка устройств максимально автоматизирована и в большинстве случаев сводится к выбору нужного устройства из предложенного списка.
Стек бездрайверного сканирования и печати состоит из нескольких компонент, обеспечивающих следующие функции:
- Автоматическое обнаружение устройств в сети.
- Поддержку протокола печати.
- Поддержку протокола сканирования.
- Поддержку 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 явились, по мнению автора, следующие:
- Востребованность самих проектов.
- Участие автора в дискуссиях на площадках зарубежных форумов коллективной поддержки популярных дистрибутивов Linux.
- Качественная реализация.
- Распространение программ не только в исходных текстах, но и в виде пригодных для инсталляции пакетов для многих дистрибутивов.
- Быстрая реакция на сообщения пользователей о проблемах и ошибках.
Для сборки пакетов использовалась площадка OpenSUSE Build Service, поддерживающая, кроме OpenSUSE,
множество других дистрибутивов. Использование этой площадки бесплатно для проектов с открытыми исходными текстами.