所以我发现要作为打印机发布(宣布服务)到 iOS 设备,我使用 NSNetService 并将类型设置为
_ipp._tcp
。
但要被识别为 AirPrint 打印机,要求包括:
_universal
公告中包含 _ipp
子类型,然后才会考虑列出打印机。所以我试图弄清楚如何发布子类型并在 NSNetService 下发布 TXT 记录,但我无法做到。大家有什么想法吗?
由于到目前为止您甚至没有显示代码的起点或存根,因此这里有一个不同的提示:您可以在本地 LAN/WLAN 中模拟有效的、正在运行的 AirPrint 服务公告,这将允许您的 iOS 客户端成功打印到现有打印机(AirPrint 或非 AirPrint)。
要求:一台装有 OS X 的 Mac。
完成此操作后,您现在可以使用 Wireshark 或
tcpdump
等工具来捕获网络上或空中的数据包并保存和分析它们。
然后开始编写您自己的应用程序并使其发出与模拟相同的包。
已知以下内容适用于 OS X Yosemite (10.10.x)。
假设...
mymac
,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
.local.
Airprint-abcd
192.168.111.111
到达。使用打印队列名称 631
printers/abcd
。有关更多背景信息,请参阅dns-sd.org 和 这些其他答案。