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/
方案三:
正确地公布您的服务
_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 上的打印请求。
我正在尝试将我的 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/
方案三:
正确地公布您的服务_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 上的打印请求。