android - Bonjour(IPP) 与 Jetdirect socket 打印机

标签 android serversocket bonjour printers ipp-protocol

我正在尝试将我的 Android 手机用作打印机。我正在使用 ServerSocket 接收要打印的文档。如果我通过提供 IP 地址和端口将手机添加为 IP 打印机并选择通用 Postscript 打印机,我就能够正确接收 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 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,并且在我的计算机上我收到消息“正在打印:已连接到打印机”,但如果这样做 关闭(); 关闭套接字的输出流时,我在计算机上收到消息“无法获取打印机状态”。 请帮我。有什么方法可以让我只收到文档而不是这个帖子请求,或者有什么方法可以发送正确的回复并获取文档?我已经被这个问题困扰了很长一段时间了。非常感谢任何帮助。

最佳答案

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

解决方案 1:

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

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

选择取决于您已实现或计划在应用程序中支持的协议(protocol)。 IPP 不适合您,除非...

解决方案 2:

在您的“打印服务器应用程序”中实现 IPP。这将是艰难的!

还有很多事情需要实现......请参阅 https://www.pwg.org/ipp/

解决方案 3:

通过 Bonjour Printing 1.2 正确宣布您的服务

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

关于android - Bonjour(IPP) 与 Jetdirect socket 打印机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37673894/

相关文章:

android - 将 2 个视频与 FFmpeg 混合(一个在另一个之上)

java - 将 arraylist 添加到 Jlist

iphone - 如何创建一个小型 Mac 应用程序,通过 WiFi 网络从 iOS 应用程序接收数据?

iphone - 有没有办法模拟多个 iOS 设备运行 Bonjour 网络应用程序?

android - Xamarin.Forms 自定义控件中抛出的序列异常

java - 通过 Intent 将值传递给新 Activity 时遇到问题

java - 如何保持套接字连接直到服务器处理它?

java - BluetoothServerSocket 不从 accept() 返回

tcp - NAT 端口转发的最佳选择是什么?

java - 如何从android中的文本中提取所有URL