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

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

(Новая страница: «;{{SpeakerInfo}}: {{Speaker|Александр Певзнер}} <blockquote> </blockquote> {{VideoSection}} {{vimeoembed||800|450}} {{youtubelink|}} {{SlidesSe…»)
 
 
(не показана одна промежуточная версия этого же участника)
;{{SpeakerInfo}}: {{Speaker|Александр Певзнер}}
<blockquote>
Описываются пакеты sane-airscan и ipp-usb. Sane-airscan  это драйвер SANE, реализующий поддержку «бездрайверного»
сканирования. Драйвер поддерживает два наиболее популярных протокола: eSCL (часть Apple Airprint) и Microsoft WDS.
Ipp-usb  это системный демон, обеспечивающий поддержку «бездрайверного» сканирования и печати для USB устройств без
сетевого подключения. Даётся обзор технологии «бездрайверного» сканирования и печати, которая существенно упрощает
администрирование и настройку принтеров и сканеров, делая её доступной даже неквалифицированным пользователям.

* https://github.com/alexpevzner/sane-airscan
* https://github.com/OpenPrinting/ipp-usb
</blockquote>

{{VideoSection}}

{{vimeoembed|901722600|800|450}}
{{youtubelink|}}

{{SlidesSection}}
[[File:Стек бездрайверного сканирования и печати ОС Linux (Александр Певзнер, OSSDEVCONF-2023).pdf|left|page=-|300px]]

{{----}}

== Thesis ==

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

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

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

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

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

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

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

Первый набор активно продвигается  частично разработан) компанией Apple. Он основан на таких открытых стандартах IETF,
как DNS-SD<ref> S. Cheshire, M. Krochmal, DNS-Based Service Discovery, RFC-6763, 2013</ref> 
для поиска устройств в сети и IPP<ref>M. Sweet, Internet Printing Protocol/1.1: Encoding and Transport, RFC-8010, 2017</ref>, <ref>M. Sweet, Internet Printing Protocol/1.1: Model and Semantics, RFC-8011, 2017</ref> для печати.

Спецификация 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, протоколов сканирования/печати. [https://learn.microsoft.com/en-us/windows-hardware/drivers/image/web-services-on-devices-reference Спецификация опубликована].

Для поддержки USB-устройств без сетевого подключения существует [https://www.usb.org/document-library/ipp-protocol-10 протокол 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 ===
[https://github.com/alexpevzner/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 ===
[https://github.com/OpenPrinting/ipp-usb ipp-usb]  это демон, реализующий поддержку IPP over USB. Он написан на языке Go.

Ранняя реализация для Linux, [https://github.com/OpenPrinting/ippusbxd 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, но основана на
наработках и идеях, позаимствованных из [https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/ippusb_bridge ipp-usb].

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

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

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

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


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


{{----}}
[[File:{{#setmainimage:Стек бездрайверного сканирования и печати ОС Linux (Александр Певзнер, OSSDEVCONF-2023)!.jpg}}|center|640px]]
{{LinksSection}}
<!-- <blockquote>[©]</blockquote> -->

<references/>

[[Категория:OSSDEVCONF-2023]]
[[Категория:Open-source projects]]
[[Категория:Draft]]

Текущая версия на 13:15, 11 января 2024

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

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

Видео

Презентация

Стек бездрайверного сканирования и печати ОС 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