因此,我弄清楚了要将NS作为打印机发布(宣布服务)到iOS设备的方法,我使用NSNetService并将类型设置为_ipp._tcp

但是为了被公认为AirPrint打印机,要求包括:

  • AirPrint使用IPP进行打印管理。
  • AirPrint侦听mDNS(Bonjour / Avahi)以发现打印机。
  • AirPrint要求_universal公告中包含_ipp子类型,然后才考虑列出打印机。
  • AirPrint需要额外的TXT记录“URF”,并且该记录不可为空,然后才考虑列出打印机。
  • 虽然此URF格式(见下文)似乎是Apple的 future 选择,但所有当前启用AirPrint的应用程序似乎都以PDF格式发送打印数据。
  • 当打印机受用户名/密码保护时,iTunes / AirPrint守护程序将发送TXT记录“air = username,password”。

  • Source

    因此,我试图找出如何在NSNetService下发布子类型和发布TXT记录的方法,但我做不到。有人有主意吗?

    最佳答案

    由于到目前为止您甚至都没有显示代码的起点或存根,因此有一个不同的提示:您可以在本地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作业,该脚本或cron作业每次在Mac启动时都会执行此命令(并使其在后台运行)。这留给读者练习。

    (如果第一台Mac提供了共享的打印队列,并且上面的所有详细信息都与第一台Mac的设置匹配,那么即使从第二台完全不同的Mac,您也可以从第二台完全不同的Mac运行相同的命令。)

    背景信息:

    dns-sd 命令行实用程序是一种测试和开发工具,适用于每个戳入Bonjour,mDNS(多播DNS)和DNS-SD(基于DNS的服务发现)的人。自Bonjour诞生以来,它是每个OS X系统的一部分。
    -P dns-sd 参数将向本地LAN / WLAN发出Bonjour“代理声明”。该公告将告知潜在的AirPrint客户以下信息:
  • 您的.local.域中有一个AirPrint设备。
  • 其名称为Airprint-abcd
  • 可以通过IP地址192.168.111.111和端口631进行访问。
  • 使用printers/abcd的打印队列名称进行打印。
  • 它可以使用PDF和URF栅格文档。
  • 不需要身份验证。
  • 它可以输出双面和彩色文档。

  • 有关此实用程序的详细信息,请参见man dns-sd。有关更多背景信息,请参见dns-sd.orgthese other answers

    07-26 09:38