По форумам и на сайтах производителей пишут что GDI win принтеры, например HP LaserJet 1018, 1005 и им подобные, не работают через сетевые принт сервера такие как D-Link DP-301U, DPR-1020, TL-PS110U и им подобные.
Это не так!!!
Работают!
После включения принтера нужно перед печатью загрузить в него прошивку.
Под виндой этим занимается драйвер принтера: скорее всего он ловит событие от USB порта сразу после включения и первоначальной инициализации принтера, и загружает в него основную прошивку которая идёт с драйвером - обычный .img файл, который можно найти в архиве с драйвером, например для 1018 это hp1018.img.
Драйвер добавляет в начало служебную команду/заголовок ELF, чтобы принтер отличил прошивку от очередного документа на печать.
Принт серверу совершенно безразлично что отправлять через себя на принтер, его волнует только обработка протоколов печати, чтобы извлечь от туда данные для отправки на принтер.
Самое простое что можно сделать под виндой стандартными средствами и совершенно без особых прав в системе, это:
copy c:\sihp1018.dl \\172.16.0.10\LP1
sihp1018.dl - образ прошивки с добавленным служебным заголовком ELF/командой, без него принтер просто проигнорирует свою родную прошивку, можно либо найти в инете готовый, я нашёл тут: www.dd-wrt.com , oleg.wl500g.info либо сделать самостоятельно утилитой arm2hpdl из состава foo2zjs
\\172.16.0.10 - адрес принт сервера, можно использовать и имя: \\hwprintserver - какое в настройках задано в разделе SMB
\LP1 - имя принтера, оно настраивается в принтсервере в разделе SMB, можно просто посмотреть если зайти проводником.
Те можно добавить пользователю ярлык в автозагрузку и на рабочий стол, пусть запускает после каждого включения принтера.
В состав windows и др операционных систем входит утилита lpr предназначенная для отправки файлов на печать по одноимённому протоколу.
Для windows командная строка будет выглядеть так:
lpr -S 172.16.0.10 -P lp1 -o l c:\sihp1018.dl
где все значения аналогичны значениям в предыдущем варианте.
подробнее о параметрах командной строки: www.microsoft.com/resources/documentation
или просто запустить lpr без аргументов.
Как и в предыдущем варианте, прошивка должна уже содержать заголовок ELF/команду.
На принтсервере обычно открыт TCP порт 9100 для входящих подключений, всё что на него принимается пересылается прямиком на принтер.
Без специальных утилит тут не обойтись. Во время тестирования я набросал простенькую программу Printer firmware uploder / converter на си, порядка 10 строк, которая открывала файл, читала в буфер, подключалась на указанный адрес и отправляла содержимое буфера. Я использовал прошивку с уже добавленный служебным заголовком во время первых тестов, позднее программа научилась сама добавлять всё что нужно.
Ещё один способ отправить прошивку в принтер - отправить её на печать.
Добавил в Printer firmware uploder / converter, скопировав большую часть - функция RawDataToPrinter msdn.microsoft.com.
Это не единственные способы, их гораздо больше - столько сколько протоколов печати поддерживает принт сервер.
Printer firmware uploder / converter - поддерживает вышеописанные способы, кроме lpr.
Чтобы лишний раз не отправлять прошивку в принтер и тем самым не переинициализировать его, но не не оставлять в не рабочем состоянии можно воспользоваться SNMP трапами.
В принтсервере настраиваем адрес компьютера куда отправлять SNMP трапы.
На компьютере должны быть запущена служба, которая эти трапы принимает и в зависимости от их содержимого либо ничего не делает либо заливает прошивку в принтер.
TL-PS110U шлёт трапы:
Предполагаю что на события связанные с печатью тоже могут быть трапы.
Опробовано на: HP LaserJet 1018 + TL-PS110U / D-Link DP-301U, DPR-1020
Драйвера для принтера брал самые последние с сайта, не смотря на то, что некоторые советовали брать как можно старее.
После загрузки прошивки принтер будет работать в любых ОС, с базовыми драйверами от HP, не смотря на заверения производителя - см foo2zjs.
Можно поискать встроенные в ОС SNMP ловушки/демоны, чтобы принимать трапы от принтсервера и отправлять прошивку автоматически.