Site Tools


hardware:printer:gdi

This is an old revision of the document!


GDI printer and net print server

По форумам и на сайтах производителей пишут что GDI win принтеры, например HP LaserJet 1018, 1005 и им подобные, не работают через сетевые принт сервера такие как D-Link DP-301U, DPR-1020, TL-PS110U и им подобные.

Это не так!!!
Работают!
Но с не большим костылём.

Как это работает После включения принтера нужно залить в него прошивку. Под виндой этим занимается драйвер принтера: скорее всего он ловит событие от юзби порта сразу после включения и первоначальной инициализации принтера, и сливает в него основную прошивку которая идёт с драйвером - обычный .img файл, который можно найти в архиве с драйвером, например для 1018 это hp1018.img. Драйвер добавляет в начало служебную команду/заголовок, чтобы принтер отличил прошивку от очередного документа на печать. Принт серверу совершенно безразлично что отправлять через себя на принтер, его волнует только обработка протоколов печати, чтобы извлечь от туда данные для отправки на принтер.

На самом деле существует масса способов сделать это, есть даже варианты полностью автоматические.

1. Залив прошивки по SMB Самое простое что можно сделать под виндой стандартными средствами и совершенно без особых прав в системе, это:

copy c:\sihp1018.dl \\172.16.0.10\LP1

где: sihp1018.dl - образ прошивки с добавленным служебным заголовком/командой, без него принтер просто проигнорирует свою родную прошивку, можно либо найти в инете готовый, я нашёл тут: http://www.dd-wrt.com/phpBB2/viewtopic.php?p=423330 , http://oleg.wl500g.info/hplj/ либо сделать самостоятельно утилитой arm2hpdl из состава foo2zjs \\172.16.0.10 - адрес принт сервера, можно использовать и имя: \\hwprintserver - какое в настройках задано в разделе SMB \LP1 - имя принтера, оно настраивается в принтсервере в разделе SMB, можно просто посмотреть если зайти проводником.

Те в примитивном и ужасном случае добавляем юзеру ярлык в автозагрузку и на рабочий стол, пусть запускает после каждого включения принтера :)

2. Залив прошивки через LPR В состав windows и др операционных систем входит утилита lpr предназначенная для отправки файлов на печать по одноимённому протоколу. Для windows коммандная строка будет выглядеть так:

lpr -S 172.16.0.10 -P lp1 -o l c:\sihp1018.dl

где все значения аналогичны значениям в предыдущем пункте. подробнее о параметрах коммандной строки: http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/lpr.mspx?mfr=true или просто запустить lpr без аргументов. Как и в предыдущем варианте, прошивка должна уже содержать заголовок/команду.

3. Залив прошивки по TCP RAW На принтсервере обычно открыт TCP порт 9100 для входящих подключений, всё что на него принимается пересылается прямиком на принтер. Без специальных утилит тут не обойтись. Во время тестирования я набросал простенькую программу FWUploader на си, порядка 10 строк, которая открывала файл, читала в буфер, подключалась на указанный адрес и отправляла содержимое буфера. Я использовал прошивку с уже добавленный служебным заголовком во время первых тестов, позднее программа научилась сама добавлять всё что нужно.

4. Печать прошивки Ещё один способ залить прошивку в принтер - отправить её на печать :) Я опять же написал небольшую программу FWUploader, скорее даже скопипастил большую часть - функция RawDataToPrinter http://msdn.microsoft.com/en-us/library/dd162959%28VS.85%29.aspx , а открытие файла с прошивкой и чтение в буфер было как в варианте с отправкой. Возможно есть способы заставить систему отправить файл на принтер без всяких обработок, или есть какая то системная утилита или утилита сторонних разработчиков которая делает тоже самое - мне было проще сделать это из программы, потому как найти в справке MSDN это дело нескольких минут, все возвращаемые ошибки можно посмотреть - когда делаешь впервые очень помогает, как луч света в тёмной комнате, и уж точно никаких тебе вирусов, инсталяторов и бесплатно.

Это не единственные способы, их гораздо больше - столько сколько протоколов печати поддерживает принт сервер. Мою программу FWUploader.zip для п3 и п4 можно взять здесь, описание прилагается: http://www.netlab.linkpc.net/forum/index.php?topic=182.0

Автоматизация Чтобы лишний раз не заливать прошивку в принтер и тем самым не переинициализировать его, но не не оставлять в не рабочем состоянии можно воспользоваться SNMP трапами. В принтсервере настраиваем адрес компьютера куда отправлять SNMP трапы. На компьютере должны быть запущена служба, которая эти трапы принимает и в зависимости от их содержимого либо ничего не делает либо заливает прошивку в принтер. TL-PS110U шлёт трапы после перезагрузки, после включения принтера (не документировано), отключения сети (весьма остроумно), подключения сетевого интерфейса, неудачная аутентификация, я предполагаю что на события связанные с печатью могут быть трапы, сейчас проверять уже не охота.

Опробовано на: HP LaserJet 1018 + TL-PS110U / DP-301U / DPR-1020 Драйвера для принтера брал самые последние с сайта, не смотря на то, что некоторые советовали брать как можно старее.

В инструкции есть описание работы с программой PSAdmin - возможно с её помощью и удастся добиться работы GDI принтеров, но copy от майкрософта я доверяю больше, работает она понятнее и уж точно не придётся искать новую версию при обновлении виндовс, смене архитектуры (х32 → х64) или вообще отказе от виндовс. А свои программы я просто пересоберу/портирую. Полагаю что после залива прошивки в принтер он будет работать и в других ОС, с базовыми драйверами от HP, не смотря на заверения производителя - см foo2zjs.

PS: позже появятся утилиты для добавления служебного заголовка к прошивке под винду, а также для заливки по TCP RAW. SNMP автозаливалку прошивки под винду врядли буду писать, хотя и писать мало, скорее всего под фряху попробую реализовать её стандартными средствами.

hardware/printer/gdi.1431832296.txt.gz · Last modified: 2015/05/17 03:11 by root