Bonjour(IPP) 与 Jetdirect 套接字打印机

Bonjour(IPP) vs Jetdirect-Socket Printer

我正在尝试将我的 android phone 用作打印机。我正在使用 ServerSocket 接收要打印的文档。如果我通过提供 IP 地址和端口以及 select 通用 Postscript 打印机将我的 phone 添加为 IP 打印机,我能够正确接收 ps 格式的文件。我不想将我的 phone 作为打印机添加为 IP 打印机。所以现在我正在使用 NsdManager 将我的设备注册为打印机。它自动被识别为 Bonjour 打印机,我可以成功添加为打印机。但是现在每次我通过计算机打印文档时,我都会在套接字的输入流中获取这些数据。

POST / HTTP/1.1 Content-Length: 673 Content-Type: application/ipp Host:   
Android-2.local:9200 User-Agent: CUPS/2.1.0 (Darwin 15.2.0; x86_64)   
IPP/2.0 Expect: 100-continue Gattributes-charsetutf-8Hattributes-
natural-languageen-usEprinter-uriipp://Android- 
2.local.:9200/Drequested-attributescompression-supportedDcopies-
supportedDcups-versionDdocument-format-supportedD marker-colorsDmarker-
high-levelsD marker-levelsDmarker-low-levelsDmarker-messageDmarker-
namesDmarker-typesDmedia-col-supportedD$multiple-document-handling-
supportedDoperations-supportedDprint-color-mode-supportedD printer-
alertDprinter-alert-descriptionDprinter-is-accepting-jobsD printer-
mandatory-job-attributesD printer-stateDprinter-state-messageDprinter-  
state-reasons

我阅读了 IPP 文档,并在响应中发送了 100 Continue 和所有必需的参数,如下所示

clientSocket.setTcpNoDelay(true);
BufferedOutputStream out = new BufferedOutputStream(clientSocket.getOutputStream());
out.write("HTTP/1.1 100\r\n".getBytes("UTF-8"));
out.write("\r\n".getBytes("UTF-8"));
out.write("compression-supported: \"none\"\r\n".getBytes("UTF-8"));
out.write("printer-is-accepting-jobs: \"true\"\r\n".getBytes("UTF-8"));
.....
....
out.flush();

之后,如果我尝试读取文档的输入流,它会返回 null 并且在我的计算机上我会收到消息 "Printing: Connected to Printer" 但如果这样做 out.close(); 在关闭套接字的输出流时,我在计算机上收到消息 "unable to get printer status"。 请帮我。有什么方法我只收到文件而不是这个 post 请求或发送正确响应并获取文件的方法吗?我已经坚持了很长时间了。非常感谢任何帮助。

您的 computer/CUPS(我猜是 El Capitain 的 Mac)正在尝试通过 IPP 进行打印,但是您的 phone-print-device 没有实现 IPP。显然,这是行不通的。

解决方案一:

使用正确的设置在 CUPS 中添加打印机。 对于网络打印机,CUPS 提供:

  • IPP-http
  • IPP-https
  • IPP - ipp
  • IPP - ipps
  • LPD/LPR-Host
  • Windows 通过 spoolss 的打印机
  • AppSocket/HP JetDirect

选择取决于您已实施或计划在您的应用中支持的协议。 IPP 不是您的选择,除非...

方案二:

在您的 "Print-Server-App" 中实施 IPP。这将是艰难的!

有很多东西要实现...请参阅https://www.pwg.org/ipp/

方案三:

通过Bonjour Printing 1.2

正确地公布您的服务

_pdl-datastream._tcp 应该是正确的服务类型。 (另见第 7.6 章,旗舰命名)

终于实现了。这是使用 Node.js 的网络打印机的出色实现。它解释了 IPP 的详细信息 https://github.com/watson/ipp-printer

这个视频也是很好的示范 https://www.youtube.com/watch?v=58Ti8w1yX2w

我正在使用 https://github.com/NanoHttpd/nanohttpd 来处理 android phone 上的打印请求。