...

четверг, 17 сентября 2015 г.

[Из песочницы] Делаем из HP LJ1000 сетевой принтер

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://ift.tt/1KiByOW

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

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

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

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

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

  2. Записать в файловую систему роутера прошивку для нужного принтера. Проще всего скачать прошивку у Олега:http://ift.tt/1Lilv7W. В моем случае нужна прошивка для HP LJ1000 — ее и загружаем:
    cd /usr/lib/
    wget http://ift.tt/1KiByOZ
    
    

  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) на работу не влияет, в отличии от настройки двунаправленного обмена на стороне клиента. Я пробовал и с включенным и с выключенным флагом, поведение принтера не менялось. Поэтому важно соблюдать отключенность только на стороне клиента.

This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.

Комментариев нет:

Отправить комментарий