До недавних пор нам хватало обычного USB подключенного принтера Samsung SCX 3400 для всех наших нужд. Но с ростом количества компьютеров, ноутбуков и даже смартфонов, которые им пользуются, было принято решение сделать из обычного USB принтера беспроводной, а на помощь нам как раз подоcпела одна из моих любимых коробочек TP-Link MR3020 с OpenWRT на борту. Тем самым отпала необходимость держать свой ноутбук, к которому был подключен принтер ранее, постоянно включенным, дабы другие участники сети имели к нему доступ. Ну и, конечно, освободил USB порт на ноутбуке для других задач.
opkg update
opkg install kmod-usb-printer
Пакет kmod-usb-printer собственно обеспечивает нам поддержку самого USB принтера в OpenWRT.
opkg install p910nd
А пакет p910nd представляет собой небольшой демон сервера печати, который копирует любую информацию, которая поступает через указанный порт на принтер, работая в фоновом режиме.
Если будите настраивать все используя веб-интерфейс LuCI, то нужно еще установить:
opkg install luci-app-p910nd
Ну а если еще ваша душа желает, чтобы все было в настройках по-русски:
opkg install luci-i18n-p910nd-ru
Если ваш OpenWRT роутер жалуется, что у вас не хватает дисковой памяти, то можете ее расширить имея под рукой флешку и немного времени.
Настроить все можно из под встроенной командной оболочки BusyBox – Ash Shell. Актуально для тех, кто борется за размер прошивки и уже давно вырезал LuCI и настраивает все при помощи команд UCI. Сначала заходим по сетевому протоколу SSH на наш роутер при помощи, например, программы PuTTY. Вводим IP роутера, протокол SSH и жмем соединиться. Вводим логин root, пароль и получаем доступ к оболочке. Для начала втыкаем наш принтер в USB порт роутера и смотрим, определился ли он:
dmesg | grep printer
Если все хорошо, в ответ получаем что-нибудь типа этого:
usblp 1-1:1.1: usblp0: USB Bidirectional printer dev 4 if 1 alt proto 2 vid 0x04E8 pid 0x344F
Таким образом OpenWRT видит наш USB принтер и назначило ему устройство usblp0. Далее
uci show p910nd
Получим список конфигов нашего демона принт-сервера, что-то типа такого:
p910nd.@p910nd[0]=p910nd
p910nd.@p910nd[0].device=’/dev/usb/lp0′
p910nd.@p910nd[0].port=’0′
p910nd.@p910nd[0].bidirectional=’1′
p910nd.@p910nd[0].enabled=’0′
Вторая строка гласит, что устройство определил он верно usb/lp0. Третья строка с параметром port=’0’ устанавливает на какой порт нашего роутера нужно будет отсылать команду на печать. IP адрес моего роутера 192.168.0.1, если параметр port установлен в 0 то доступен принт-сервер будет по адресу http://192.168.1.1:9100. Если установите в 1, то по адресу http://192.168.1.1:9101 и так далее.
4й параметр bidirectional указывает на то, что принтер может обмениваться информацией с инициатором печати, а 5й параметр enabled собственно и включает всю нашу сборную солянку в работу. Таким образом, нам надо было только изменить последний параметр, а сделать это можно следующей командой:
uci set p910nd.@p910nd[0].enabled=1
и подтвердить изменение в конфигах
uci commit
после чего запустить наш принт-сервер:
/etc/init.d/p910nd start
Ну и добавить его в автозагрузку:
/etc/init.d/p910nd enable
Дальше открываем любой браузер, в адресной строке вводим 192.168.1.1:9100 и наблюдаем как Samsung SCX – 3400 моргает нам зеленым глазком состояния. Перегружаем роутер чтобы закрепить результат:
reboot
uci add firewall rule
uci show firewall
Смотрим порядковый номер правила, которое только что создалось:
У меня допустим это 10. Далее задаем собственно само правило, начнем с названия:
uci set firewall.@rule[10].name=’PrintServer’
Потом указываем зз каких интерфейсов чтобы был доступен принтер, * — из любых, lan — только локальная сеть, wwan — только wifi и т.д.uci set firewall.@rule[10].src=’*’
Какой порт открыть для доступа
uci set firewall.@rule[10].dest_port=’9100′
uci set firewall.@rule[10].target=’ACCEPT’
Внести изменения в конфиги
uci commit
Перезагрузить конфиги в фаерволл
/etc/init.d/firewall reload
/etc/init.d/firewall restart
После установки необходимых пакетов, указанных в начале статьи, у нас появится пункт меню Сервисы – p910nd сервер печати. Открываем его и переходим к настройке:
Если бывает, что вас принт-сервер не отвечает после одной печати, можно отключить двунаправленный режим, бывает спасает от забитого порта. Ну и конечно, можно выбрать интерфейс с какого можно будет отправлять вам на печать документы, у меня например он не определен — документы на печать прилетают и из локальной сети, так же от устройств подключенных к Wi-Fi сети. Но для этого нужно открыть порт принтера в межсетевом экране OpenWRT.
Переходим в меню Сеть -> Межсетевой экран, вкладка Правила траффика и создаем правило:
Таким вот макаром отроем порт 9100 принтера всем из любой сети, кто захочет им воспользоваться. Незабываем сохраняться и применять правила межсетевого экрана.
Заходим в панель управления — > Оборудование и звук — > Устройства и принтеры — > Добавление принтера. Windows поищет-поищет но не найдет, после чего нужно нажать пункт «Необходимый принтер отсутствует в списке». Далее в списке выбрать «Добавить принтер по его TCP/IP-адресу или имени узла». Тип устройства — Устройство TCP/IP. Имя или IP-адрес — здесь указываем адрес нашего роутера в сети. у меня это 192.168.0.104. Имя порта он пишет автоматически не нужно его править. Затем начинается новый поиск порта нашего принтера. Опять выйдет сообщение что устройство не найдено. Далее ждем далее ничего не меняя, в следующем окне находим производителя и модель своего принтера или устанавливаем дрова с диска, далее использовать уже установленный драйвер, потом задаете имя принтера какое вашей душе угодно и пробуете печать пробной страницы.
openwrt.su
Основная сложность при подключении такого принтера через роутер — загрузить в него «прошивку», чего не умеет делать практически ни один роутер с поддержкой принтеров «из коробки», а также специализированные «принтсерверы», хотя допускаю что существуют модели, которые это умеют, однако мне не удалось их найти вживую.
Усиленное изучение вопроса дало два метода решения задачи загрузки прошивки в роутер — на стороне клиента, либо на стороне роутера. В первом варианте роутер настраивается как для обычного принтера, «прошивку» нужно засылать на печать перед первым использованием принтера с компьютера:
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. Настройки предполагают, что роутер имеет доступ в Интернет.
Итак, поехали:
opkg update
opkg install kmod-usb-printer usbutils p910nd nano
cd /usr/lib/
wget http://oleg.wl500g.info/hplj/sihp1000.dl
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
lsusb -v | grep "ID\|bcdUSB"
Ответ:
Bus 001 Device 004: ID 03а0:0517 Hewlett-Packard LaserJet 1000
bcdUSB 1.20
nano /etc/config/p910nd
config p910nd
option device /dev/usb/lp0
option port 0
option bidirectional 0
option enabled 1
/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
nano /tmp/hl1000
Sending firmware to printer.
hl1000 added
Done.
ps | grep 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) на работу не влияет, в отличии от настройки двунаправленного обмена на стороне клиента. Я пробовал и с включенным и с выключенным флагом, поведение принтера не менялось. Поэтому важно соблюдать отключенность только на стороне клиента.
habr.com
Решил настроить свой TP-LINK в качестве принт-сервера для HP 1018. Напомню, что роутер работает под OpenWRT.
Установим необходимые пакеты:
root@OpenWrt:~# opkg update
root@OpenWrt:~# opkg install kmod-usb-printer kmod-usb2 p910nd usbutils
Подключаем принтер в USB:
Bus 001 Device 003: ID 03f0:4117 Hewlett-Packard LaserJet 1018
Редактируем конфиг сервера печати, указываем местонахождение устройства, у меня это /dev/usb/lp0, у Вас может быть /dev/lp0:
root@OpenWrt:/etc/config# cat /etc/config/p910nd
config p910nd
option device /dev/usb/lp0
option port 0
option bidirectional 1
option enabled
Для начальной инициализации и первоначальной заливки прошивки создаем скрипт 20-printer, файл прошивки кладем тут /usr/lib/sihp1018.dl:
root@OpenWrt:/etc/hotplug.d/usb# cat /etc/hotplug.d/usb/20-printer
#!/bin/sh if ls -la /dev/usb/lp0 | grep 129143
then
echo «`date` : shit script — deleting file /dev/usb/lp0» >> /tmp/hp1018.log
rm /dev/usb/lp0
echo «`date` : shit script — replug the printer to use it» >> /tmp/hp1018.log
fi
fi
fi
root@OpenWrt:/etc/config# cat /etc/config/firewall
#network printer open port
config ‘rule’
option ‘src’ ‘any’
option ‘proto’ ‘tcp’
option ‘dest_port’ ‘9100’
option ‘target’ ‘ACCEPT’
и перезагружаемся:
Настройка клиента под WINDOWS XP:
Принтеры и факсы > Установка принтера > Локальный принтер > Создать новый порт (Standard TCP/IP Port) > IP адрес: 192,168,1,20 , порт: 9100 > Установка драйверов для вашего принтера.
Настройка клиента под UNIX:
У Вас уже должен быть установлен сервер печати CUPS и драйвер принтера HP 1018 (устанавливаем пакет foo2zjs.tar.gz).
Заходим в браузер: http://127.0.0.1:631/
Администрирование > Принтеры (Добавить принтер) > Другие сетевые принтеры: ( AppSocket/HP JetDirect ) > Подключение: socket://:9100 > Драйвер: HP LaserJet 1018 Foomatic/foo2zjs-z1 (recommended) (черно-белый, дуплексная печать) .
Выбор плитки на любой вкус: Плитка CoEm (Италия)
Прикрепленный файл | Размер |
---|---|
sihp1018.dl_.png | 126.12 кб |
foo2zjs.tar_.gz | 1.63 Мб |
unix.ck.ua
Не успел я установить и протестировать OpenWRT принт-сервер p910nd на своем МФУ Samsung SCX-3400, как захотелось научить его также сканированию документов и изображений по сети. Для решения данной задачи вам не хватит дисковой памяти, если у вас на роутере всего 4 мб из которых после установки OpenWRT всего 300кб свободно, поэтому сначала расширьте ее путем подключения внешней overlay флешки. После чего можно приниматься за дело. Запускать беспроводной сканер будем на базе роутера TP-LINK MR3020 с Chaos Calmer 15.05.1 OpenWRT.
Кроме дисковой памяти вам, конечно, не хватит usb порта. Лучше всего взять usb-хаб с внешним питанием, так как кто знает, какие еще энергопотребляющие устройства вы будете подключать к своему роутеру в будущем. Я взял себе 4-х портовый usb-хаб с внешним питанием GiNZZU GR-384UAB и пока полностью им доволен.
opkg update
Возможность сканирования в Linux, да и в OpenWRT в частности осуществляется при помощи универсального интерфейса сканирования Sane. На его базе, скорее всего есть программы под любую ОС, которые в случае поддержки железа сканера в Sane, помогут вам его запустить. Для начала смотрим на странице Sane поддерживается ли наш сканер и к какому типу железа и встроенного в него ПО он относится. Мой МФУ Samsung SCX-3400 оказался в числе поддерживаемых устройств и был классифицирован как типовое мфу от Xerox.
Значит сначала ставим пакет поддержки МФУ нашего типа
opkg install sane-xerox_mfp
Он потянет за собой зависммости, это нормально
Installing libsane (1.0.25-1) to root…
nstalling libusb-compat (0.1.4-1) to root…
Installing libusb-1.0 (1.0.19-1) to root…
Installing libpthread (0.9.33.2-1) to root…
Installing librt (0.9.33.2-1) to root…
Далее ставим пакет самого sane, он потянет за собой поддержку библиотек изображений
opkg install sane-frontends
Installing libjpeg (9a-1) to root…
Installing libpng (1.2.56-1) to root…
Installing zlib (1.2.8-1) to root…
Ну и заодно поставим демона sane
opkg install sane-daemon
И перезагрузим наш роутер
reboot
Попробуем найти наш сканер
sane-find-scanner
Если OpenWRT видит наш сканер, то мы увидим сообщение типа
found USB scanner (vendor=0x04e8, product=0x344f [SCX-3400 Series]) at libusb:00 1:003
Далее посмотрим виден ли наш драйвер в Sane
scanimage -L
Мое мфу было проснулось, но в ответ была получена фига
No scanners were identified…
Как оказалось, что именно моего уникального номера оборудования Vendor и Product в конфигах sane-xerox.mfp не оказалось. Тут я уже решил подправить ручками:
vi /etc/sane.d/xerox_mfp.conf
Переходим в режим редактировать при помощи клавиши
i
Самой первой свободной незакомментированной строкой пишем usb и и vendor и product номера нашего принтера из ответа чуть выше
usb 0x04e8 0x344f
Выходим из режима редактирования при помощи клавиши Esc, cимволом двоеточия указываем редактору что нужно сохранить изменения w и выйти q
:wq
Пробуем опять найти сканер в Sane
scanimage -L
И удовлетворяющий меня ответ на этот раз был
device `xerox_mfp:libusb:001:003′ is a Samsung SCX-3400 Series multi-function peripheral
Уже веселее. Раз Sane увидел, можно попробовать посканировать пока без сети
scanimage —format=png —resolution=150 > scan.png
В результате в текущей папке у вас должен появиться отсканированный файл с разрешением 150 точек в формате png.
Далее немного оптимизируем загрузку Sane. Для начала отключим поддержку тех драйверов принтеров, которых у нас и так нет. Для этого открываем файл /etc/sane.d/dll.conf и комментируем все строчки кроме net и драйверов вашего мфу, у меня остались только net и мой xerox_mpf. Таким образом при запуске Sane не будет перебирать список, а сразу подцепит только нужные там файлы и начнет сканирование.
На этом считаем оболочку рабочей. Далее нужно разобраться со сканированием по сети. В данном случае роутер будет своеобразным сервером, к которому будут подцепляться клиенты. Причем последние могут быть под управлением разных ОС.
Во всех официальных руководствах и man страницах пакетов все в один голос трубят, что нужно организовывать раздачу через пакет xinetd, который позволяет подгружать демон sane при обращении к сканеру, и так же успешно его выгружать когда клиент заканчивает пользоваться сетевым сканером. Xinetd вместо Saned слушает порт 6566. Я честно не люблю посредников, какими бы они были полезными. Поэтому я в первую очередь настроил сетевое сканирование при помощи одного только демона saned.
Указываем IP адреса клиентов, которые будут иметь доступ к демону saned через сеть:
vi /etc/sane.d/saned.conf
В виду того, что всем домашним устройствам в моей сети присвоены постоянные ip адреса, я просто их перечислил
192.168.0.101
192.168.0.102
192.168.0.103
192.168.0.104
Можете указать сразу всю свою подсеть чтобы не парится
192.168.0.1/24
Примеры использования есть в самом файле.
Далее нужно открыть порт 6566 в firewall. Но Sane также нужен еще диапазон портов для обмена информацией с клиентом. Если вы откроете только один порт 6566, то на начале сканирования постоянно будите терять связь с «сервером». Сначала укажем sane какие порты ему по доброте душевной мы выдаем для его дел, для этого в этом же конфиг файле saned.d задаем диапазон из 100 портов:
data_portrange = 30000 — 30100
Сохраняем конфиг и выходим.
Открывать сто портов абы кому не очень хорошая идея, поэтому надо позаботиться, чтобы в межсетевом экране доступ к ним имели только клиенты-члены нашей подсети. У меня доступ к моему роутеру к определенным портам имею все айпи из диапазона 192.168.0.1-192.168.0.255
Далее проверяем обозначенность порта 6566 как порта для saned.
cat /etc/services | grep sane
sane-port 6566/udp
sane-port 6566/tcp sane saned
Если какой то из строк нет — добавляем вручную через редактор нужную строчку в /etc/services
Так как разработчики изначально подточили демона saned под xinetd у него нет своей отдельной службы запуска, как например, у принт-свервера p910nd. Запустим его вручную в фоновом режиме
saned -a
Далее проверяем случает ли порт наш помощник
netstat -l | grep sane
tcp 0 0 :::sane-port :::* LISTEN
Это значит, что порт на прослушке и ждет команду. Таким образом можно попробовать с клиентской машины из сети произвести сканирования. Разнообразие клиентов зашкаливает, выбрать тут так-то есть из чего из списка на официальном сайте Sane.
Я же решил попробовать посканировать прямо на Android смартфон при помощи приложения для сканирования по сети SANEDroid, о том как это работает можно глянуть ниже:
Под Windows достаточно неплохо справляется SaneTwain, хотя и давно не обновлялся. Каждый найдет себе приложение по душе, есть даже порт XSane под Windows. В любом случае обзор клиентов — это тема отдельной статьи.
Так как своей службы у него нет — запихаем его в пользовательский раздел автозагрузки. Для этого в файл /etc/rc.local перед exit 0 добавляем строчку
saned -a
Либо в LuCI в меню Система — Загрузка, листаем вниз, в форму Локальная загрузка набиваем ту же команду
Что собственно одно и то же. Это запустит демона сетевой службы сканирования в фоновом режиме. Теперь сканируйте в свое удовольствие откуда хотите. Если остались вопросы — задаем их в комментариях.
openwrt.su