HP LaserJet 1000 — отличная рабочая лошадка, быстрый и безотказный принтер с USB интерфейсом с низкой стоимостью отпечатка. В статье я опишу сложности и тонкости настройки софт-принтеров HP для работы через роутер по сети на примере своего LJ1000. Велкам под кат!

Статей по подключению принтеров через роутеры в сети много, суть большинства сводится к общему алгоритму — установить на роутер альтенативную прошивку (например OpenWrt), установить поддержку USB, принтеров и демон p910nd, после чего прописать конфиги демона и дополнительные настройки.

Особенность софт-принтеров HP моделей 1000, 1005, 1006, 1007, 1007, 1018, 1020, 1505 в том, что на «борту» у них нет полноценной управляющей микропрограммы, она загружается драйвером при каждом включении принтера. Данная статья должна подойти для любого из перечисленных принтеров, однако проверена только на HP LJ1000.

Основная сложность при подключении такого принтера через роутер — загрузить в него «прошивку», чего не умеет делать практически ни один роутер с поддержкой принтеров «из коробки», а также специализированные «принтсерверы», хотя допускаю что существуют модели, которые это умеют, однако мне не удалось их найти вживую.

Усиленное изучение вопроса дало два метода решения задачи загрузки прошивки в роутер — на стороне клиента, либо на стороне роутера. В первом варианте роутер настраивается как для обычного принтера, «прошивку» нужно засылать на печать перед первым использованием принтера с компьютера:

1. Пуск-Выполнить-CMD
2. В окне консоли COPY ДИСК:\Путь_к_файлу\ИмяФайла.prn \\dnsXXXX\lp
(пример: COPY c:\tmp\sihp1020.prn \\dns323\lp)

Считаю этот способ несостоятельным, ибо неудобно. Принтер должен работать без дополнительных телодвижений.

Второй метод решения задачи — заливка прошивки самим роутером. Причем, желательно чтобы прошивка загружалась не только по включению роутера, но и по хотплагу принтера.

Теперь опишу процесс настройки на имеющемся у меня железе. В моем случае используется роутер D-Link DIR-620 Rev A1. С этим роутером я уже пробовал множество прошивок, очень удобной оказалась Zyxel Keenetic v1, однако именно HP LJ1000 с Keenetic не работает, танцы с бубнами не помогли. Что подтверждается техподдержкой Zyxel: http://forum.zyxmon.org/topic160-keenetic-i-hp-lj-1000.html

Я использовал последнюю доступную версию OpenWrt: 14.07.

В качестве основы для настройки я использовал статью в вики OpenWrt. Скрипт переделан для нормального хотплага и устойчивого старта демона p910nd.

После перепрошивки роутера меняем дефолтный пароль, активируем работу по SSH, настраиваем сетевые интерфейсы. Все дальнейшие настройки удобнее всего делать через терминальный клиент, я использовал Putty. Настройки предполагают, что роутер имеет доступ в Интернет.

Итак, поехали:

  1. Установить нужные для работы принтера пакеты, плюс простой редактор:
    opkg update
    opkg install kmod-usb-printer usbutils p910nd nano
    

  2. Записать в файловую систему роутера прошивку для нужного принтера. Проще всего скачать прошивку у Олега:http://oleg.wl500g.info/hplj. В моем случае нужна прошивка для HP LJ1000 — ее и загружаем:
    cd /usr/lib/
    wget http://oleg.wl500g.info/hplj/sihp1000.dl
    

  3. Создаем скрипт обработки события hotplug, чтобы прошивка в принтер отправлялась при каждом его подключении:
    nano /etc/hotplug.d/usb/20-printer
    

    Код скрипта:

    #!/bin/sh
    FIRMWARE="/usr/lib/sihp1000.dl"
    DEVICE=/dev/usb/lp0
    
    if [ "$PRODUCT" = "3f0/517/120" ]
    then
    case "$ACTION" in
            add)
            /etc/init.d/p910nd stop
            echo "`date`: Sending firmware to printer." >> /tmp/hl1000
    	cat $FIRMWARE > $DEVICE
    	sleep 15
            echo "`date`: hl1000 added" >> /tmp/hl1000
            /etc/init.d/p910nd start 
            echo "Done." >> /tmp/hl1000
            ;;
            remove)
            echo "`date`: hl1000 removed" >> /tmp/hl1000
            /etc/init.d/p910nd stop
            echo "Done." >> /tmp/hl1000
            ;;
    esac
    fi
    

    Немного о настройке скрипта: для начала нужно убедиться что ваш принтер находится именно по пути /dev/usb/lp0: команда ls /dev/usb должна дать список устройств, среди которых будет lp0. Некоторые прошивки могут создавать дексриптор принтера по адресу /dev/lp0.

    Далее нужно прописать путь к файлу «прошивки», и указать VID/PID принтера. Смотрим что есть на USB:

    lsusb -v | grep "ID\|bcdUSB"
    


    Ответ:

    Bus 001 Device 004: ID 03а0:0517 Hewlett-Packard LaserJet 1000
      bcdUSB               1.20
    

    3f0/517 — это VID и PID принтера HP LJ 1000 (Первые нули удаляются 03f0). 120 — это BCD версия без точки.
  4. Открываем файл конфигурации p910nd:

    nano /etc/config/p910nd
    

    Если запись для принтера уже есть, то нужно убедиться что путь к дескриптору принтера верен. Если нет, то копируем этот текст:

    
    config p910nd
          option device        /dev/usb/lp0
          option port          0   
          option bidirectional 0
          option enabled       1
    

    Если с роутером используется только один принтер, то оставляем этот текст как есть, но можно исопльзовать несколько принтеров. Тогда для каждого из них нужно будет указать свой порт (по умолчанию 9100).
  5. В моем случае демон печати стартуется скриптом после загрузки прошивки в принтер, поэтому убедимся что он не стартует сам при включении роутера:

    /etc/init.d/p910nd disable
    

    Иначе запущенный слишком рано демон падал со следующей ошибкой:

    Tue Feb 4 02:29:43 2014 lpr.err p9100d[1207]: bind: Cannot assign requested address
    Tue Feb 4 02:29:43 2014 lpr.err p9100d[1207]: accept: Bad file descriptor
    


Перезагружаем роутер. Если все настроено правильно, то с загрузкой роутера переинициализируется принтер (слышно как он перезапускается). На всякий случай убеждаемся что в System Log нет ошибок, связанных с p9100, подключаемся по SSH, проверяем работу скрипта hotplug:

nano /tmp/hl1000

Должен быть такой лог:

Sending firmware to printer.
hl1000 added
Done.

Проверяем что демон стартовал:

ps | grep p910nd

В списке процессов по команде должен быть p910nd:

root@OpenWrt:~# ps | grep p910nd
 1597 root       780 S    {p910nd} /usr/sbin/p9100d -b -f /dev/usb/lp0 0
 1849 root      1492 S    grep p910nd

На этом настройку на стороне роутера можно считать законченной.

Дальше настраиваем подключение со стороны клиентов. В моем случае это были компьютеры с Windows XP, где уже были установлены драйвера нужного принтера.

Открываем свойства принтера:



Добавляем новый порт -> Standard TCP/IP Port -> Новый порт -> Далее -> вводим IP адрес роутера -> generic Network Card-> Готово.

Обязательно нужно снять галочку «двунаправленный обмен». Об этом мало где пишут. Другие модели принтеров кроме 1000 нормально работают с установленной, но именно с моим 1000 печать не работала, пока я не снял галку и не перезагрузился (важно, без перезагрузки не будет работать).

Точно также настраивается печать из Windows 7, тоже обязательно нужно снять галочку «двунаправленный обмен». На более новых не проверял, но не вижу препятствий, чтобы не заработало.

PS: Настройка двунаправленного обмена в p910nd (bidirectional) на работу не влияет, в отличии от настройки двунаправленного обмена на стороне клиента. Я пробовал и с включенным и с выключенным флагом, поведение принтера не менялось. Поэтому важно соблюдать отключенность только на стороне клиента.

Комментарии (33)


  1. la0
    17.09.2015 10:23
    +1

    Спасибо за статью!
    Чтобы исключить возможные разночтения прокомментируйте пожалуйста вот что:
    вы приводите строчку option bidirectional 1
    но говорите про необходимость отключения этого режима на клиентских машинах. Насколько мне известно, p9100d это всего лишь что-то типа транспорта для задачи вывода на печать.
    Если не сложно, проверьте что будет если выставить «option bidirectional 0»


  1. Sergey_datex
    17.09.2015 10:28

    Спасибо, дополню сейчас статью.


  1. alexpp
    17.09.2015 11:34

    Хабр — торт! Спасибо за статью.


  1. Rumlin
    17.09.2015 12:48
    -1

    1000, 1005, 1006, 1007, 1007, 1018, 1020, 1505

    Есть еще HP LJ P1005. Он отличается от этих — прикрутить нормально к openSuSe несколько лет назад не удалось.


  1. artemlight
    17.09.2015 13:01

    А ещё есть HP LJ 1010, который работает в p910nd, но иногда пишет unsupported personality: pcl и вырубается.
    Рассказал бы кто, как побороть на openwrt.


  1. Pulse
    17.09.2015 13:34

    Вот бы такую статейку про софтовые Сanon-ы, например LBP6020


    1. krezalis
      17.09.2015 19:58

      Плюс LBP2900 )
      Не рабодал даже з принтсерверот tp-link 310


      1. lovecraft
        18.09.2015 09:14

        Гиблое дело. Одно время товарищи с LOR пытались писать CAPT-драйвер, уж не знаю, заработал ли. Проприетарные драйверы от Canon собраны только для x86 и на MIPS не поднимутся. Вариант с установкой на MIPS-роутер QEMU в usermode и установку туда CUPS и проприетарных драйверов считаю слишком медленным для реального использования и имеющим чисто академический интерес.


      1. lovecraft
        18.09.2015 10:08

        И не заработает (. Дело тут вот в чем — все принтеры, кроме LBP, доступны ОС в виде двунапрвленного порта. В linux это /dev/usb/lp0, в в Windows — USB001 на вкладке «Порты» в свойствах принтера. Эти порты работают так: драйвер принтера принимает задание в формате EMF/PDF, переводит его в картинку (растеризует) и тупо записывает в порт. Это делает возможным «мостик» в виде TCP <---> USB, а также не требует наличия драйвера принтера на удаленном хосте, достаточно, чтобы хост просто определял принтер как /dev/usb/lp0.

        CAPT работает по-другому: запись информации в порт происходит не сразу, а частями, при этом драйвер должен контролировать, что принтер уже напечатал текущий кусок и хочет еще. Это приводит к тому, что на удаленном хосте должен работать демон, который будет «вручную» контролировать процесс обмена данными с принтером. С демоном проблемы — Canon не хочет открывать протокол и поэтому создание демона силами сообщества затруднительно, а сам Canon пишет работающее через раз проприетарное УГ.


        1. krezalis
          22.09.2015 16:16

          Попробую установить foo2capt, єсть надежда что заработаєт. Таргет боард MR3020.


          1. lovecraft
            23.09.2015 11:46

            Интересно, хватит ли мощности CPU, чтобы CUPS мог быстро растеризовать postscript в capt? У меня даже 2-х ядерный Atom при растеризации postscript в zjs тормозит.


  1. lightman
    17.09.2015 13:45

    Долго маялся с подключением 1020 к ASUS RT-N16, пробуя как стандартную прошивку, так и Tomato. Проблема: то печатает, то нет (при отправке документа принтер просто молчит), проявлялась и исчезала сама собой, логику понять не сумел.

    В итоге плюнул и просто подключил к компьютеру с Win7, расшарив по сети, так работает безотказно.

    Но любопытство осталось: почему не работает с роутером?


    1. Sergey_datex
      17.09.2015 13:58

      Нужно анализировать логи и понять несколько вещей: доходит ли до роутера задание на печать, принимает ли его демон p910nd, отправляется ли задание демоном в принтер. Так будет яснее что происходит.
      Ваш принтер запросто мог уходить в сон, после чего его нужно было пробуждать отдельной командой либо повторной загрузкой прошивки. Это предположение.


    1. vorphalack
      17.09.2015 15:29

      1020 — самый глючный из всей линейки, что под виндой, что без нее.


  1. Ivan_83
    17.09.2015 20:40
    +5

    Тема не раскрыта!

    1. Сами вливать прошивку в принтер умееют роутеры зюхель, как минимум на первой версии прошивок можно было прямо через гуй загрузить прошивку в роутер и он сам её вливает каждый раз при подключении принтера.
    На второй версии это вроде как то можно сделать через ком строку.
    С моим 1018 работает.

    2. Способов заливки прошивки с винды больше: печать, «копирование» и когда принтсервер сам вливает.
    В своё время я написал специально утилиту: http://www.netlab.linkpc.net/wiki/ru:software:win:print:fw_uploader

    3. Перед заливкой прошивки к ней нужно добавлять ELF заголовок иначе принтер её не понимает.
    Моя утилита умеет и вливать прошивку и дописывать к ней ELF заголовок — это чтобы не искать у Олега готовые, а взять прямо из дров и сконвертировать самостоятельно.

    4. На FreeBSD всё выглядит элегантнее:
    (модуль ulpt должен быть загружен или вкомпилен в ядро, как и поддержка юзби)
    в devd.conf добавляем (в 10+ правильнее будет отдельный файл создать в: /usr/local/etc/devd/ )
    attach 10 {
    device-name «ulpt[0-9]+»;
    match «vendor» «0x03f0»;
    match «product» «0x4117»;
    action «cat /etc/20051028_hp1018.dl > /dev/$device-name && /root/dprint/dprint -d -b 9100 -p /var/run/dprint.pid -t /dev/$device-name»;
    };

    detach 10 {
    device-name «ulpt[0-9]+»;
    action «kill `cat /var/run/dprint.pid`»;
    };

    Для принт сервера ещё может быть полезным синкать время когда линк поднимается:
    notify 10 {
    match «system» «IFNET»;
    match «type» «LINK_UP»;
    media-type «ethernet»;
    action «ntpdate -b -u pool.ntp.org time.nist.gov time-b.nist.gov time-nw.nist.gov»;
    };

    5. p910nd под фрю я или не нашёл или он мне не понравился, поэтому я по быстрому слабал свой, который данные гоняет только из сети в принтер.
    http://netlab.linkpc.net/download/software/dprint/dprint.tar.gz
    Одновременно он обслуживает одного клиента, остальные висят в очереди на подключение.

    6. Перезагружать венду не обязательно, достаточно перезапустить службу: «Диспетчер печати».

    В своё время я тоже маялся со своим 1018.
    Первое решение было в том, что я написал свою утилиту и сделал ярлык на рабочем столе для вливания прошивки. Печатаю я крайне мало и редко, так что не напрягало. При этом был обычный принтсервер от тплинка.
    Потом я увлёкся засовыванием FreeBSD в Agestar LB2. В итоге используя то что у меня в п4 и п5 оно работало само.
    Позднее я купил кинетик гигу со скидкой после сц и теперь он раздаёт вайфай и заодно вливает прошивку.
    С последним переездом я потерял оба Agestar LB2 вместе с кое какой обвязкой :(
    На TR3020 сходу не получилось забутить фрю, проклятый u-boot от тплинка не хотел никак жрать то что я ему даю, а я так и не осилил особым образом запаковать в формат тплинка, те осилил но он не признал :)

    Кстати, в первой ревизии TL-PS110U стоял какой то мусор на 150 мгц.
    Недавно взял TL-PS110U ревизии 2, там уже был такой же проц как в Agestar LB2 (CNS21XX он же в девичестве STR81XX) — а в нём сразу два USB порта встроено. Те можно немного допаять и сменить прошивку и получить принтсервер на два принтера или просто залить другую прошивку и получить поддержку юзби хабов и возможность автоматом вливать прошивку, хоть с флешек воткнутых в тот же хаб.

    А для старых D-Link DP-301U есть более современная прошивка с оранжевым интерфейсом, превращающая его в DPR-1020, как на современных моделях, но длинк их выложил только для некоторых стран, для россии не выкладывал.
    Брать здесь: http://www.netlab.linkpc.net/wiki/ru:hardware:dlink:ps_dp301u_to_dpr1020

    2 vorphalack:
    1020 — не хуже 1018, а с ним у меня проблем не было.
    Ровно как и с 1020 и обычным принтсервером от длинка, ему даже прошивку вливать не требуется.


    1. Sergey_datex
      17.09.2015 23:16

      Вам явно стоит написать по этому поводу статью, FreeBSD на роутерах я еще не встречал.
      Я не спец в *nix, поэтому варианты «написать свое» у меня работают только под win. Насчет кинетика я в статье указал, что первая версия прошивки именно с 1000 принтером не работает, с другими — нормально. С чем связано — не знаю, но есть подтверждение что это так.


    1. lovecraft
      18.09.2015 09:22

      3. Перед заливкой прошивки к ней нужно добавлять ELF заголовок иначе принтер её не понимает.
      Я всегда брал немодифицированные из hplip — проблем вроде не было.


    1. vorphalack
      19.09.2015 09:18

      с 1018 и у меня небыло. а с 1020 в эпоху его актуальности выли все. ну то есть да, воткнуть его хвост в *nix было чуть ли не единственным осмысленным способом заставить его печатать всё и всегда, а не как захочется родным драйверам на винде, которые вдобавок еще и диспетчер печати выносили периодически.


      1. Ivan_83
        22.09.2015 15:45

        У меня есть очень серьёзные подозрения что МС распространяет кривые дрова к 1018 под вин7 через свои апдейты: печать из ворд 2007 не пашет, выходит пустая страница, и так вроде из всех х32 прог или почти всех.
        Помогает:
        — печать на виртуальный XPS и потом из его вьювера печать уже работает
        — откат на старые дрова с сайта HP
        Возможно с 1020 как то так же, ведь платформа у них если не общая то очень близкая.

        2 lovecraft:
        Впервые вижу этот сайт.
        В начале брал у Олега, потом почитал немного, сравнил и сделал чтобы моя утилита могла образы из дров модифицировать.

        2 juffinhalli:
        Это дикий оверхэд.

        1. У меня уже есть роутер с FreeBSD на х86.
        2. Я не хочу держать принтер там же где и роутер.
        3. Мне не нравится тянуть USB, а вот с эзернетом проще и дешевле.

        -> было бы оптимально переделать TR3020 в принтсервер, чтобы подключать принтер и проводом и по вафле к сети.
        Заодно его и внутрь принтера впихнуть не сложно.

        2 artsnz:
        Современные принтера такое говно, что может оказаться не только дешевле но и менее проблемно держать линукс/фрю хоть в виртуалке только для того, чтобы она работала диспетчером печати для этого самого 1000.
        Старенькие 1320, 2050 вполне себе ходят без проблем по 10 лет и мало чего боятся, в отличии от их современных заменителей.
        Говнодел начался примерно когда 1018 заменили на p1005: HP решило что лучше грести бабло чем делать хорошие принтеры. И потом с низовых оно докатилось до малого бизнеса и те же 2050 заменить не на что.


        1. vorphalack
          22.09.2015 16:34

          я там не зря написал — «в эпоху актуальности», тобишь ХР/2003, откуда там винапдейтные драйверы?

          у меня самый основной косяк был в завешивании спулера где получится — то на клиенте, то на сервере…



          а может стоит уйти с хп на ту же киосеру с бразерами? хпшные аппараты и правда чем дальше тем больше производят впечатление что людей с головой там уже не осталось.


        1. lovecraft
          23.09.2015 11:54

          Впервые вижу этот сайт.
          Ну что вы, это же официальные драйвера HP для Linux :) Поддерживается все, даже такая экзотика, как сканирующая «голова» от HP LJ 1200 или сканирование по сети с МФУ.

          Говнодел начался примерно когда 1018 заменили на p1005: HP решило что лучше грести бабло чем делать хорошие принтеры. И потом с низовых оно докатилось до малого бизнеса и те же 2050 заменить не на что.
          Мы на Kyocera перешли и горя не знаем. Прямой аналог 2050 — Kyocera 1320DN — большая туба с тонером вместо картриджа, дуплесный модуль, сеть, PostScript/PCL.


  1. juffinhalli
    17.09.2015 21:05

    Для богатых хабровчан рекомендую x86 роутер lxbox3+ ath9k wifi адаптер + толковый дистрибутив Linux. Большинство задач, вроде озвученной в этой теме, будет решаться в пол-тычка + 100500 возможностей при наличии прямых рук.


    1. Sergey_datex
      17.09.2015 23:19
      +1

      Мне кажется богатый хабровчанин просто купит принтер с сетью на борту :) Роутер дороже принтера


  1. artsnz
    18.09.2015 09:38

    Насколько мне помнится, LJ1000 не умеет дружить с системами W7 x64 и последующими, те на W7 х32 драйвер от XP встает, а на x64 уже такой фокус не прокатывает. Вопрос как подружить современные ос и этот чудо агрегат.


    1. Sykoku
      18.09.2015 10:16

      1. artsnz
        18.09.2015 10:26

        а почитать что там написано перед тем как постить ссылки из выдачи?

        > Картинки не печатаются, если из ворда печатать текст на странице альбомной ориентации — то принтер все равно упорно выводит обрезанную страницу на книжной А4, работает только для принтеров раздаваемых по сети, подключенных к x32 <= 7


        1. Sykoku
          18.09.2015 11:13

          Штатный телепат в отпуске. Какой вопрос — такой ответ. А прозвучало оно так: «не нашел дрова для Вин х64».


          1. artsnz
            18.09.2015 18:48

            написано четко, «LJ1000 не умеет дружить с системами W7 x64 и последующими», нет ни слова про то что не нашел дрова. И кстати их действительно не найти, тк их в природе не существует. Единственный выход дружить этот принтер с линем и ему подобными (чем и является ддврт) и на самом лине делать какую-то эмуляцию стандартного принтера, который будет принимать на печать и через штатный драйвер засылать полученные данные на этот принтер, но гемор имхо, да и не встречал нигде такого, проще выкинуть и поставить что-то из более современных аналогов.


            1. Sykoku
              21.09.2015 10:10

              For installation of the LaserJet 1000 in a W7 64 bit system, using XP Mode, please see the following link. It also contains information about how to install XP Mode in W7 Home.

              h30434.www3.hp.com/t5/Printer-All-in-One-Software/Windows-7-and-HP-Laserjet-1000/td-p/129513… (post of 04-17-2012)

              «Не умеет» и «у меня не получается» — разные вещи.


              1. artsnz
                21.09.2015 10:49

                те вы считаете что нормально на рабочем компе держать виртуалку с windows xp ради принтера? особенно на офисных c2d с 2гб? Про вариант с виртуалкой я давно в курсе, не открыли вселенную, форумы hp давно все излазил на этот предмет. Тогда уж реально проще поставить вин7 x32, в общем тема исчерпана, не умеет он дружить с 7-кой х64.


                1. Sykoku
                  22.09.2015 11:41

                  Чтобы закрыть тему:

                  Windows 2003 Server x64, драйвера от LJ 1018 x64
                  всё, печатает без проблем. Расшариваем принтер.
                  Подключаемся с 7-ки (х64), находим принтер, ставим дрова.
                  Меняем порт напрямую.


                  1. artsnz
                    22.09.2015 12:53

                    да я все понимаю. если предлагаете w2003, вместо нее можно поставить w7 х32 и родные дрова встанут и машину можно будет как-то худо-бедно использовать, но вам не кажется что держать отдельную машину или виртуальную машину для принтера, мягко говоря, не целесообразно, в парке более 1000 таких принтеров, тк винду xp перестали поддерживать, задание перейти на W7 x64.


                    1. Sykoku
                      22.09.2015 16:26

                      Вы не поняли. 2003-я нужна только на время. Потом — напрямую.