4

所以我想出要发布(宣布服务)到 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”。

资源

所以我想弄清楚如何发布子类型并在 NSNetService 下发布 TXT 记录,这是我无法做到的。有人有想法么?

4

1 回答 1

2

由于到目前为止您甚至没有显示代码的起点或存根,因此这里有一个不同的提示:您可以在本地 LAN/WLAN 中模拟有效的、有效的 AirPrint 服务公告,这将允许您的 iOS 客户端成功打印到现有的打印机(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参数 todns-sd将向您的本地 LAN/WLAN 发出 Bonjour“代理公告” 。该公告将告诉潜在的 AirPrint 客户以下信息:

  • .local.您的域中有可用的 AirPrint 设备。
  • 它的名字是Airprint-abcd
  • 它可以通过 IP 地址192.168.111.111和端口访问631
  • 使用打印队列名称printers/abcd打印到它。
  • 它可以使用 PDF 和 URF 光栅文档。
  • 它不需要身份验证。
  • 它可以输出双面和彩色文档。

有关此实用程序的详细信息,请参阅man dns-sd。有关更多背景信息,请参阅dns-sd.org这些其他答案

于 2016-07-04T23:04:03.690 回答