因此,我弄清楚了要将NS作为打印机发布(宣布服务)到iOS设备的方法,我使用NSNetService并将类型设置为_ipp._tcp
。
但是为了被公认为AirPrint打印机,要求包括:
_universal
公告中包含_ipp
子类型,然后才考虑列出打印机。 Source
因此,我试图找出如何在NSNetService下发布子类型和发布TXT记录的方法,但我做不到。有人有主意吗?
最佳答案
由于到目前为止您甚至都没有显示代码的起点或存根,因此有一个不同的提示:您可以在本地LAN / WLAN中模拟有效的AirPrint服务公告,这将使您的iOS客户端成功打印到现有打印机(是否有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作业,该脚本或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
。 192.168.111.111
和端口631
进行访问。 printers/abcd
的打印队列名称进行打印。 有关此实用程序的详细信息,请参见
man dns-sd
。有关更多背景信息,请参见dns-sd.org和these other answers。