在iOS设备中创建Bonjour AirPrint服务

时间:2011-09-05 16:13:59

标签: ios printing bonjour airprint nsnetservice

所以我想到要将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”。

Source

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

3 个答案:

答案 0 :(得分:1)

由于到目前为止您甚至没有显示代码的起点或存根,所以这里有一个不同的提示:您可以在本地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 共享打印机( NOT 需要是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 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.orgthese other answers

答案 1 :(得分:0)

This link告诉您如何配置avahi以允许访问您的打印机。

答案 2 :(得分:0)