在 iOS 设备中创建 Bonjour AirPrint 服务

问题描述 投票:0回答:2

所以我发现要作为打印机发布(宣布服务)到 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=用户名,密码”。

来源

所以我试图弄清楚如何发布子类型并在 NSNetService 下发布 TXT 记录,但我无法做到。大家有什么想法吗?

ios printing bonjour airprint nsnetservice
2个回答
2
投票

由于到目前为止您甚至没有显示代码的起点或存根,因此这里有一个不同的提示:您可以在本地 LAN/WLAN 中模拟有效的、正在运行的 AirPrint 服务公告,这将允许您的 iOS 客户端成功打印到现有打印机(AirPrint 或非 AirPrint)。

要求:一台装有 OS X 的 Mac。

完成此操作后,您现在可以使用 Wireshark 或

tcpdump
等工具来捕获网络上或空中的数据包并保存和分析它们。

然后开始编写您自己的应用程序并使其发出与模拟相同的包。


已知以下内容适用于 OS X Yosemite (10.10.x)。

假设...

  • 您有一台运行 OS X 的 Mac(Book),
  • 此 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 的服务发现)提供测试和开发工具。自 Bonjour 诞生以来,它已成为每个 OS X 系统的一部分。

-P
参数将向您的本地 LAN/WLAN 发出 Bonjour“代理公告”。该公告将告诉潜在的 AirPrint 客户以下信息:

您的
    dns-sd
  • 域中有可用的 AirPrint 设备。
    它的名字是
  • .local.
  • 可以通过IP地址
  • Airprint-abcd
  • 和端口
    192.168.111.111
    到达。
    使用打印队列名称 
  • 631
  • 进行打印。
    它可以使用PDF和URF光栅文档。
  • 不需要认证。
  • 可以输出双面和彩色文档。
  • 有关此实用程序的详细信息,请参阅

printers/abcd

。有关更多背景信息,请参阅 
dns-sd.org这些其他答案


0
投票

© www.soinside.com 2019 - 2024. All rights reserved.