随着 Android 4.4 Kit 的问世,Google 现在原生支持某种形式的内置打印功能。
这意味着很多打印机现在都支持 Mopria。
就像 IOS 上的 Airprint 一样,Mopria 只不过是用于检测打印机的多播 DNS 和用于实际打印的 IPP 2.0。当然,只有当手机或平板电脑与打印机位于同一子网时,MDNS 才会起作用。
但是,在 Airprint 上我们可以创建指向打印机的 DNS-SD 记录,从而让 IOS 设备列出不同子网中的设备。
Mopria 也有办法实现这个功能吗?
答案1
发布适用于 Android 的打印机Mopria 打印服务通过 Bonjour 使用:
- bonjour 服务类型:_ipp._tcp
- txt-record pdl:这些 pdl 中的一个或多个
- 图像/pwg-光栅
- 应用程序/PCLm
- 应用程序/pdf
- txt-record ty:必须存在,例如
CUPS
- txt-record rp:适当的 IPP-URI 路径(cups-printer-name)
(代码极客可能会研究mopria/wfds java 源代码)
概念证明:
使用dns-sd
(Mac OS X)宣传远程打印服务(在 rasperry pi / cups 上):
dns-sd -P "mopria" _ipp._tcp local 631 pi 192.168.2.118 \
rp=printers/colorlaser \
pdl=application/pdf \
ty=CUPS
我的 Android 设备现在可以将 PDF 打印到我的 CUPS 打印机,该打印机通过 USB 连接到我的树莓派。
问题 1:
Mopria-Discovery 无法处理每个主机上的两台或更多台打印机。就“硬件打印机”而言,合理的做法是假设每个 IP/主机有一个“队列”。就 CUPS 等打印后台处理程序而言,您将面临严重问题。
Mac OS X:仅限一共享打印机可以被 Mopria-Print-Service 发现和使用
问题 2:
由于某种原因,我无法使用 avahi 来使 cups-ipp-service 对 Android 的 Mopria-Print-Service 可见。
这应该但是不是为我工作:
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
<name>mopria</name>
<service>
<type>_ipp._tcp</type>
<port>631</port>
<txt-record>txtvers=1</txt-record>
<txt-record>qtotal=1</txt-record>
<txt-record>rp=printers/colorlaser</txt-record>
<txt-record>pdl=application/pdf</txt-record>
<txt-record>ty=CUPS</txt-record>
</service>
</service-group>
问题 3:
当 mDNS 响应器过多时,Mopria 会感到困惑。对于 Avahi 测试,您应该禁用 CUPS 的 bonjour 广告。
文件:/etc/cupsd.conf
Browsing Off
#BrowseOrder allow,deny
#BrowseAllow all
#BrowseLocalProtocols CUPS dnssd