Создание службы Bonjour AirPrint на устройстве iOS

Итак, я понял, что для публикации (объявления службы) на iOS-устройство в качестве принтера я использую NSNetService и устанавливаю тип _ipp._tcp.

Но для того, чтобы быть признанным принтером AirPrint, требования включают:

  • AirPrint использует IPP для управления печатью.
  • AirPrint прослушивает mDNS (Bonjour/Avahi) для обнаружения принтера.
  • AirPrint требует, чтобы подтип _universal присутствовал в объявлении _ipp, прежде чем он рассмотрит возможность включения принтера в список.
  • AirPrint требует, чтобы дополнительная запись TXT, «URF», присутствовала и была непустой, прежде чем она рассмотрит список принтеров.
  • Хотя этот формат URF (см. ниже) кажется будущим вариантом для Apple, все текущие приложения с поддержкой AirPrint, похоже, отправляют данные для печати в формате PDF.
  • Когда принтер защищен именем пользователя/паролем, демон iTunes/AirPrint отправит запись TXT «air=username,password».

Источник

Итак, я пытаюсь выяснить, как опубликовать подтип и опубликовать запись TXT в NSNetService, чего я не смог сделать. У кого-нибудь есть идеи?


person Prasanth    schedule 05.09.2011    source источник


Ответы (1)


Поскольку вы пока даже не показываете начальную точку или заглушку своего кода, вот еще одна подсказка: вы можете имитировать действительное, работающее объявление службы AirPrint в вашей локальной/беспроводной локальной сети, что позволит вашим клиентам iOS успешно печатать на существующий принтер (AirPrint или нет).

Требования: Mac с OS X.

После того, как вы заработали, теперь вы можете использовать что-то вроде Wireshark или tcpdump для захвата пакетов по сети или из эфира, а также для их сохранения и анализа.

Затем начните кодировать собственное приложение и сделайте так, чтобы оно выдавало те же пакеты, что и симуляция.


Известно, что следующее работает на OS X Yosemite (10.10.x).

Предполагая,...

  • у вас есть Mac(Book) под управлением OS X,
  • имя хоста этого Mac — mymac,
  • его IP-адрес 192.168.111.111,
  • на нем установлен общий принтер с именем abcd (НЕ должен быть с поддержкой AirPrint!), и
  • общий принтер не требует аутентификации (поместите DefaultAuthType none в /etc/cups/cupsd.conf),

... затем вы можете сделать очередь abcd доступной для клиентов iOS.

Чтобы проверить это, просто выполните следующую команду в окне Terminal.app (внимание, команда не вернется — если вы закроете окно Terminal.app, действие команды пропадет!):

 dns-sd                 \
   -P AirPrint-abcd     \
   _ipp._tcp,_universal \
   local.               \
   631                  \
   mymac.local.         \
   192.168.111.111      \
         pdl="application/pdf,image/urf"    \
         kind="document"                    \
         priority="1"                       \
         product="Model Name of my Printer" \
         rp="printers/abcd"                 \
         URF="DM3"                          \
         Duplex="T"                         \
         Color="T"                          \
         note="Testing AirPrint via MacBook"\
         txtvers="1"                        \
         qtotal="1"                         \
         printer-type="0x0480FFFC"          \
         printer-state="3"                  \
         air="none"                         \
         UUID="54321abc-1234-1234-abcd-1238e4babcd8"

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

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


Справочная информация:

Утилита командной строки dns-sd предназначена для тестирования и разработки для всех, кто использует Bonjour, mDNS (многоадресный DNS) и DNS-SD (обнаружение служб на основе DNS). Это часть каждой системы OS X с момента появления Bonjour.

Параметр -P для dns-sd сделает "прокси-уведомление" Bonjour для вашей локальной сети LAN/WLAN. Объявление сообщит потенциальным клиентам AirPrint следующую информацию:

  • В вашем домене .local. доступно устройство AirPrint.
  • Его зовут Airprint-abcd.
  • Доступ к нему возможен через IP-адрес 192.168.111.111 и порт 631.
  • Используйте имя очереди печати printers/abcd для печати в нее.
  • Он может использовать растровые документы PDF и URF.
  • Он не требует аутентификации.
  • Он может выводить двусторонние и цветные документы.

Подробнее об этой утилите см. man dns-sd. Дополнительные сведения см. на страницах dns-sd.org и эти другие ответы.

person Kurt Pfeifle    schedule 04.07.2016