#printing #cups #ipp-protocol
#печать #cups #ipp-протокол
Вопрос:
Я общаюсь с CUPS, используя протокол IPP. У меня все драйверы для моих принтеров установлены в CUPS (с использованием файла .ppd), и принтеры получили последнюю версию прошивки.
Когда я запрашиваю задание, которое принтер печатает прямо сейчас, он сообщает, что состояние задания «завершено» еще до того, как принтер завершит печать. Кажется, что CUPS помечает задание как «завершенное», когда оно завершает «загрузку» файла.
Я бы не ожидал такого поведения, и мне в основном нужно знать, когда именно принтер напечатал последнюю бумагу для задания. Код выглядит следующим образом. Это self.printer().ippPrinter()
экземпляр node-ipp
и он указывает на принтер. Чтобы прочитать состояние задания, я использую атрибут 'job-state'
.
var msg = {
"operation-attributes-tag": {
'job-id': id
}
};
self.printer().ippPrinter().execute("Get-Job-Attributes", msg, function(err, res){
var attributes = res['job-attributes-tag'];
self.setAttributes = attributes;
callback.call(self, attributes);
});
Кто-нибудь знает, почему у меня возникла эта проблема или.. как заставить его работать?
Спасибо!
Ответ №1:
CUPS может пересылать только состояния заданий, полученные с принтера. Многие драйверы и протоколы принтера работают как «запустить и забыть».
Обычно IPP-принтеры позволяют CUPS и другим клиентам отслеживать текущее состояние задания до его завершения / печати. Некоторые производители неправильно внедряют IPP и классифицируют отправленные задания как распечатанные — даже если в принтере замятие бумаги!
Заключение:
Если ваш принтер не полностью поддерживает IPP, вы, вероятно, не сможете проверить наличие «успешно напечатан».
Если реализация является шлюзом к системе печати, которая никогда не предоставляет подробный статус задания печати, реализация МОЖЕТ установить состояние задания IPP на «завершено» при условии, что она также устанавливает значение «поставлено в очередь на устройстве» в атрибуте задания «причины состояния задания»
Комментарии:
1. Питер, я заканчиваю с завершенными заданиями, когда принтер не напечатал ни одной страницы (но он получил все входные данные, и позже я могу попросить принтер продолжить выполнение задания вручную).). Я предполагаю, что серверная часть, которая использует протокол принтера (т. Е. AppSocket для HP), может выполнять только «запустить и забыть», о котором вы упомянули, и CUPS может только пометить это задание как выполненное. Для протоколов lpd и сокетов есть вероятность, что изменение драйвера может улучшить эту ситуацию? Другой драйвер может установить лучший сервер? Спасибо.
2. Я не знаю, что протоколы lpd или сокетов предлагают лучшие способы мониторинга заданий. В любом случае принтер также должен поддерживать этот мониторинг. По моему опыту, ipp предлагает больше вариантов, но это может быть предвзятым мнением 🙂
Ответ №2:
@Jakub, возможно, вы общаетесь с CUPS с помощью IPP… Но вы уверены, что CUPS взаимодействует с устройством печати через IPP?
Вы можете проверить это, выполнив
lpstat -h cupsservername -v
Это должно вернуть URI устройства, назначенный каждой очереди печати, который CUPS использует для обращения к фактическому устройству печати:
-
Если этот URI содержит
ipp://
,ipps://
,http://
илиhttps://
CUPS действительно передает IPP на устройство печати, и вы сможете получать действительно правильные сообщения о состоянии. -
Но если вы видите
socket://
, что CUPS настроен на использование метода AppSocket (иногда также называемого «HP Jet Direct» или «Прямая печать по IP») для пересылки заданий. Это протокол «запустить и забыть». По сути, это то же самое, как если бы вы запускалиnetcat print-device 9100 < myprintfile
перелопачивание данных для печати на порт 9100 принтера. Серверная часть CUPSsocket
, обрабатывающая эту буферизацию на принтер, не получит от принтера никакого другого подтверждения, кроме того, что предоставляет TCP / IP, подтверждающий, что последний пакет был передан. Следовательно, он должен закрыть свой процесс и сообщить об этом демону CUPSsuccessful-ok
, даже если принтер все еще занят, выплевывая много бумаги, и, возможно, никогда не завершит всю работу, потому что она сталкивается с замятием бумаги… -
Если вы видите
lpd://
, что ситуация аналогична (но использует порт 515).
Вы можете добиться успеха с полным отчетом о состоянии, переключив путь CUPS-to-printdevice с AppSocket или LPD на IPP следующим образом:
sudo lpadmin -p printername ipp://ipaddress-of-printer
или
sudo lpadmin -p printername http://ipaddress-of-printer:631
Комментарии:
1. Что, если URI содержит
usb://
?2. @JoeVanDyk: … тогда наверняка CUPS НЕ обменивается данными с устройством печати через IPP.