Bonjour(IPP)与Jetdirect-Socket打印机

时间:2016-06-07 08:11:13

标签: android serversocket bonjour printers ipp-protocol

我正在尝试将我的Android手机用作打印机。我正在使用ServerSocket接收要打印的文档。如果我通过提供IP地址和端口并选择Generic Postscript Printer将我的手机添加为IP打印机,我能够正确地以ps格式接收文件。我不想将手机作为打印机添加到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个继续以及所有必需的参数这样

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并在我的计算机上收到消息“打印:连接到打印机”,但如果     out.close(); 为了关闭套接字的输出流我在计算机上收到消息“无法获取打印机状态”。 请帮我。有没有办法我收到文件而不是这个帖子请求或方式发送正确的答案并获得文件?我现在已经坚持很久了。任何帮助都非常感谢。

2 个答案:

答案 0 :(得分:1)

您的计算机/ CUPS(我估计带有El Capitain的Mac)正在尝试通过IPP进行打印,但您的手机打印设备未实施IPP。显然,这不起作用。

解决方案1:

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

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

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

解决方案2:

在“Print-Server-App”中实施IPP。那将是艰难的!

要实施很多......请参阅https://www.pwg.org/ipp/

解决方案3:

通过Bonjour Printing 1.2

正确宣布您的服务

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

答案 1 :(得分:1)

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

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

我使用https://github.com/NanoHttpd/nanohttpd来处理Android手机上的打印请求。