2016-06-07 2 views
1

Я пытаюсь использовать свой телефон для Android в качестве принтера. Я использую ServerSocket для получения документа для печати. Если я добавлю свой телефон в качестве IP-принтера, указав IP-адрес и порт и выбрав «Общий почтовый принтер», я могу правильно получить файл в формате ps. Я не хочу добавлять свой телефон в качестве принтера в качестве IP-принтера. Итак, теперь я использую NsdManager для регистрации своего устройства в качестве принтера. Он автоматически распознается как принтер Bonjour, и я могу успешно добавить его в качестве принтера. Но теперь каждый раз, когда я печатаю документ с компьютера, я получаю эти данные во входном потоке сокета.Bonjour (IPP) vs Jetdirect-Socket Printer

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 Продолжить в ответ и весь необходимый PARAMS как этот

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, и на моем компьютере я получаю сообщение «Печать: подключен к принтеру», но если do out.close(); in, чтобы закрыть выходной поток для сокета, я получаю сообщение «неспособное получить статус принтера» на моем компьютере. Пожалуйста, помогите мне. Есть ли способ, которым я просто получаю документ, а не этот почтовый запрос или способ отправить правильный ответ и получить документ? Я застрял с этим довольно долгое время. Любая помощь высоко ценится.

+0

Какая у вас просьба? Чего вы пытаетесь достичь? Что произойдет с припиской после вашего приложения? –

+0

@PeterKandinsky Я пытаюсь использовать мой андроид, чтобы хранить все документы, которые я печатаю в течение дня. Я объявляю свое устройство с помощью NSDManager, используя тип сервиса «_ipp._tcp.». , Я ищу понимание IPP. Я посмотрел официальную документацию, это мало помогло. Если бы вы могли помочь мне понять связь между принтером и моим компьютером, это было бы здорово. – Zartha

+0

предложение для вашего использования «сохранить документы на телефоне»: просто скопируйте на свой телефон документы (например, в формате pdf или любой формат поддержки мобильных приложений). Вы можете использовать облачный диск, такой как dropbox или приложение, которое поддерживает совместное использование файлов через FTP, SMB или WEBDAV, если вам не нравится копировать через USB. –

ответ

1

Я, наконец, смог его реализовать. Вот отличная реализация для сетевого принтера с использованием Node.js. Это объясняет деталь IPP https://github.com/watson/ipp-printer

Также это видео хорошей демонстрация https://www.youtube.com/watch?v=58Ti8w1yX2w

И я использую https://github.com/NanoHttpd/nanohttpd для обработки запросов печати на моем телефоне андроид.

+1

***/Part1: *** Я подтвердил ваш (собственный) ответ на вопрос - хотя IMHO вы используете «неправильный инструмент для работы». IPP обеспечивает двунаправленную связь между принт-клиентом и службой печати (начиная с запроса конкретных возможностей службы, относящихся к цветной или дуплексной печати, или заканчивая стерированием/штампованием в процессе контроля за выполнением работ во время печати или запросов истории заданий или задач администрирования принтера, таких как запуск/остановка/приостановка/возобновление/создание/удаление определенных очередей). –

+0

***/Part2: *** Но ваш прецедент не требует даже отдаленных требований таких возможностей. Для чего вы хотите, тип обслуживания '_pdl-datastream._tcp' был бы достаточно хорошим: *« стрелять (данные в порт 9100) и забыть «*. Гораздо проще, гораздо проще в разработке и обслуживании. –

+0

@KurtPfeifle Спасибо – Zartha

1

Ваш компьютер/CUPS (Mac с El Capitain, я думаю) пытается печатать через IPP, но ваш телефон-принтер не использует IPP. Очевидно, что это не сработает.

Решение 1:

добавить принтер в CUPS с правильной установкой. для сетевых принтеров CUPS предлагает:

  • IPP - HTTP
  • IPP - протокол HTTPS
  • IPP - IPP
  • IPP - НЭП
  • LPD/LPR-Host
  • принтер Windows, с помощью spoolss
  • AppSocket/HP JetDirect

выбор зависит от прокотола, который вы внедрили или планируете поддерживать в своем приложении. IPP это не вариант для вас, кроме ...

Решение 2:

Реализация IPP в вашем "Принт-сервер-App". Это будет сложно!

Там очень много, чтобы реализовать ... см https://www.pwg.org/ipp/

Решение 3:

Правильно сообщите ваш сервис должен быть правильный тип услуги через Bonjour Printing 1.2

_pdl-datastream._tcp. (см. Также глава 7.6, Flagship Naming)