Discuta este tópico no fórum

Se este conteúdo te ajudou, deixe um presente!

quarta-feira, 14 de maio de 2014

OpenWRT: Compartilhando um Scanner na rede

No último artigo, mostrei como configurar uma impressora de rede no OpenWRT. É grande a comodidade de uma impressora na rede. Fazê-lo com uma impressora simples e sem custos (considerando que o roteador você já tem) é melhor ainda.

OK, impressora já está configurada e imprimindo pela rede. Mas o scanner?

Atualmente são raras as impressoras puras. Em geral elas agregam outras funções, principalmente um scanner. Neste post vamos configurar o SANE para permitir que máquinas remotas possam digitalizar documentos pela multifuncional na rede.

Instalação

Vou considerar que partimos do ponto onde já existe uma impressora USB configurada no roteador. Se não for o caso, talvez algum passo da impressora fique pendente (talvez a parte do USB). Se alguém estiver nesta situação (quer somente o scanner pela rede e não a impressão) e tiver problemas, comente ai que tentaremos diagnosticar o que falta. O mesmo vale para conectar um scanner (não impressora). Se ele funciona em um Linux (pelo SANE), deve funcionar.

Antes de começar, você vai precisar de alguns mega de espaço em disco. Se não estiver usando uma unidade USB para estender o disco, esta é a sua oportunidade.

Você vai precisar instalar os seguintes pacotes do OpenWRT:
  • sane-backends
  • sane-frontends
Ele vai baixar mais alguns por dependência. Se tudo der certo, o comando "scanimage -L" deverá mostrar sua impressora. Se for uma HP, você vai precisar do pacote hplip. Infelizmente ele traz consigo dependências não desejadas, como o cups (eu avisei que precisaria de espaço...). Após a instalação, o scanimage vai funcionar para scanners HP:
root@router:~# scanimage -L
device `hpaio:/usb/Officejet_J4660_series?serial=BR145GXXXXXXXX' is a Hewlett-Packard Officejet_J4660_series all-in-one
Agora basta colocar o SANE para escutar na rede. Você precisa colocar os endereços (cliente ou de rede) autorizados a usar seu scanner em /etc/sane.d/saned.conf. Se quiser liberar acesso para qualquer cliente da rede, basta adicionar um +:
root@router:~# echo + >>  /etc/sane.d/saned.conf
Podemos testar já neste ponto se os clientes podem alcançar o serviço. Rode o saned manualmente:
root@router:~# /usr/sbin/saned -d
Ele vai funcionar para um único comando, mas é suficiente para testar. Possivelmente ocorrerá um erro:
check_host: getaddrinfo for local hostname failed: Name or service not known
Isto ocorre porque o saned não conseguiu achar o endereço IP pelo nome do roteador. Você precisará adicionar este nome manualmente no /etc/hosts. O nome adicionado deve ser o mesmo que aparece no prompt do shell (após o "@" e antes do ":"):
root@router:~#
No meu caso, basta colocar "router" depois de localhost em /etc/hosts. Ficou assim:
127.0.0.1 localhost router
Pule para a configuração de um cliente e, se funcionar, volte para este ponto e complete a configuração do servidor.

Configuração do servidor

O sane depende de um superserver, um processo que espera por conexões e as repassa aos respectivos servidores. Isto simplifica o desenvolvimento do servidor e pode economizar memória (por poder disparar o serviço apenas quando alguém irá usá-lo).

Neste caso, a sugestão é instalar o xinetd. Instale o pacote xinetd do OpenWRT.

Atualização: para impressoras multifuncionais, o uso do SANE faz com que o módulo usblp remova a entrada /dev/usb/lp0, que é usada para impressão. Desta forma, a impressão não funciona mais após o uso do scanner (até que a impressora ou o roteador sejam reiniciados ou o cabo reconectado). Para contornar o problema, sugiro a criação deste script /usr/sbin/saned.reload_usblp:
#!/bin/sh
#
# When a SANE scanning occurs, /dev/usb/lp0 is lost.
# Reload usblp after the scanjob is finished in order to
# recreate /dev/usb/lp0 
#
/usr/sbin/saned "$@"
rmmod usblp
insmod /lib/modules/$(uname -r)/usblp.ko


Ele precisa ter permissão de execução.
Atualização 3: a nova versão do OpenWRT (14.07) não apresenta este problema. 

Você precisa criar o arquivo de configuração do SANE para o xinetd em /etc/xinetd.d/sane com este conteúdo:
service sane-port
{        
  socket_type = stream
  server = /usr/sbin/saned
  protocol = tcp
  user = root
  group = root
  wait = no  
  disable = no
}      
Basta disparar o xinetd e habilitá-lo para ligar com o roteador:
/etc/init.d/xinetd enable
/etc/init.d/xinetd start
Seu scanner deve estar funcionando!

Clientes

Vou mostrar a configuração de um cliente em Linux. Quando estiver rodando em Windows, eu completo a parte do Windows e atualizo este artigo.

Linux

Em geral, as distribuições Linux já pré-instalam o SANE. Se for seu caso, basta editar /etc/sane.d/net.conf para configurar o SANE a buscar um scanner na rede. Só colocar uma linha que aponte para seu roteador. No meu caso, eu consigo alcançá-lo por router.lan. Pode ser também o IPv4 ou IPv6 dele. Para os mais acomodados, rode como root:
echo router.lan >> /etc/sane.d/net.conf
Lembre-se de ajustar o router.lan apropriadamente. Na sequência, o scanimage vai listar o scanner da rede.
cliente-linux $ scanimage -L
device `net:router.lan:hpaio:/usb/Officejet_J4660_series?serial=BR145GXXXXXXXX' is a Hewlett-Packard Officejet_J4660_series all-in-one
Note que diferentemente do scanimage no roteador, neste existe referência de que ele está na rede e no servidor router.lan. Se isto não funcionar, existe algum problema com seu saned. Para diagnosticar o problema, se estiver rodando manualmente o "saned -d", observe as mensagens na tela. Caso já esteja rodando ele no xinetd, olhe os logs do roteador (logread).

Se estiver rodando manualmente o "saned -d", depois do scanimage, ele irá encerrar. Para utilizar o scanner, você deve completar a configuração do servidor.

Windows

No Windows temos duas alternativas. A que recomendo é o wiasane. Ele cria um scanner virtual que acessa (via SANE) o scanner remoto. As versões atuais funcionam sem problemas em todos os meus testes.

Outra é o SaneTwainPode ser o zip ou o instalador windows. Ele é composto de um driver Twain e um aplicativo independente. Infelizmente, o driver só está preparado para ambientes 32-bit. Contudo, o aplicativo funciona perfeitamente. Depois de instalado ou descompactado, você terá acesso ao programa ScanImage.exe. Ele pode ser usado diretamente como um cliente do scanner. Na primeira execução ele irá permitir a confiuguração do servidor SANE (seu roteador). Ele deve ser suficiente para quem quer digitalizar para um arquivo de imagem. Porém, não consegui fazer o driver TWAIN funcionar possivelmente por estar em um sistema 64-bit (li comentários que funcionou mesmo o desenvolvedor avisando que não iria).



É isso pessoal. Mais um ótimo uso para seu OpenWRT. Até a próxima.

PS: Ainda está na fila a divulgação automática da impressora na rede por ZeroConf.

Atualização: adicionado workaround para problema de impressão após o uso do scanner. Obrigado Felipe por ter avisado da existência do problema.

Atualização 2: driver wiasane está funcioando na versão wiasane-v0.0.0.5-16-gfab7d78-dbg. Logo deve sair uma versão oficial com o problema resolvido. Versões atuais do driver não devem apresentar o problema.

Atualização 3: versão nova do OpenWRT funciona sem o workaround!

sábado, 3 de maio de 2014

OpenWRT: Compartilhando sua impressora na rede

Novamente digo: A porta USB no roteador o torna muito versátil. Em mais um dos usos da USB, vou configurar uma impressora compartilhada na rede. Em resumo, isto vai transformar sua impressora USB comum em uma impressora de rede.

Um servidor de impressão deve receber os pedidos de impressão e repassá-los a uma impressora. Um dos mais avançados que existe no mercado é o CUPS, que faz tudo e mais um pouco: gerencia filas, aplica filtros, usuários, etc. Tenho um servidor de impressão com CUPS sendo utilizado para imprimir milhares de folhas ao dia sem qualquer problema faz anos.

Voltemos a realidade do roteador. Como sabemos, o roteador é um dispositivo com recursos limitados. E, dos recursos mais limitados, temos o espaço em disco. Desta forma, não vai aguentar armazenar trabalhos na fila para impressão. Além disto, não é muito saudável escrever dados temporários no disco pois vai reduzir a vida útil da flash. Ao invés de instalar um CUPS com seus gerenciamentos avançados, a sugestão é instalar um servidor de impressão que apenas repassa os trabalhos para a impressora.

Um dos servidores ideias para esta tarefa é o p910nd. Ele escuta em uma porta padrão e aguarda receber os dados. Quando receber um novo trabalho, simplesmente o repassa para a impressora sem qualquer tratamento. Não tem spool local e não escreve no disco. Não tem autenticação de usuário, driver de impressora no servidor, etc. Para clientes residenciais e pequenas empresas, pode ser a solução ideial.
Obs: É provavel que o CUPS rode sem problemas no roteador, desde que você tenha um armazenamento externo e memória suficiente.
A instalação do p910nd é simples. O primeiro passo é instalar o módulo usb-printer do kernel (também possível pela WEB):
opkg update 
opkg install kmod-usb-printer 
Logo ao instalar ele será carregado. Se você conectar a impressora (ou se ela já estiver conectada), vai aparecer esta mensagem no kernel:
[  603.460000] usblp0: USB Bidirectional printer dev 6 if 1 alt 0 proto 2 vid 0x03F0 pid 0x2B12
E também este dispositivo deve aparecer:
router# ls -l /dev/usb/lp0
crw-r--r--    1 root     root      180,   0 May  3 01:36 /dev/usb/lp0
Existe também driver para porta paralela (kmod-lp), mas acho que não se aplica mais nas impressora atuais.

Agora basta instalar o p910nd:
opkg install p910nd
A configuração, como as demais feitas no OpenWRT, é no diretório /etc/config. No meu caso, uma configuração bem simples foi suficiente:
/etc/config/p910nd:
config p910nd
        option device        /dev/usb/lp0
        option port          0
        option bidirectional 1
        option enabled       1

Não esqueça do "enabled 1"! A porta 0 significa porta 9100. A porta 1, 9101 e assim por diante. Na dúvida, para uma impressora, deixe a 0, que é a padrão.


Para quem tem disco sobrando e pouca intimidade com o vi, tem também uma interface WEB para configurá-lo:
opkg install luci-app-p910nd
E, por fim, ative e dispare o serviço (também possível pela WEB):
/etc/init.d/p910nd start/etc/init.d/p910nd enable
A partir deste pronto, a sua impressora está pronta para ser adicionada nos clientes.

Linux 

A configuração da impressora em um Linux é feita no CUPS. Existem algumas interfaces para este fim mas, no geral, vão oferecer estas opções:

Troque o meuroteador por um nome pelo qual você consegue pingar o roteador (ou seu endereço IP). A porta 9100 é a usada para a opção "port 0" do p910nd. Se usar outra, ajuste conforme desejado. Escolha o fabricante e modelo adequado. Pronto!
  1. Selecione a opção para adicionar uma nova impressora.
  2. Escolha o tipo "AppSocket/HP JetDirect".
  3. Na URL da conexão, use:
    1. socket://meuroteador:9100
  4. Troque o meuroteador por um nome pelo qual você consegue pingar o roteador (ou seu endereço IP).
  5. A porta 9100 é a usada para a opção "port 0" do p910nd. Se usar outra, ajuste conforme desejado.
  6. Selecione o fabricante e modelo correto para selecionar o driver correspondente.
  7. Pronto!
Neste ponto, sua impressora será visível como se estivesse conectada pela USB.

Windows

Windows é um pouco mais complicado.
  1. Vá no painel de controle/adicionar uma impressora;
  2. Escolha a opção para impressora de rede.
    1. Ele vai tentar detectar mas não vai funcionar. Pode parar;
  3. Selecionar a opção "A impressora que desejo não está na lista". Avançar;
  4. Adicionar uma impressora usando um endereço TCP/IP...Avançar;
  5. Tipo será "TCP/IP";
  6. No nome do host ou endereço IP, coloque a informação do seu rotador;
  7. Nome da porta, qualquer um (como p910nd);
  8. Não marque para ele consultar a impressora para selecionar o driver. Avançar;
    1. Agora ele vai tentar fazer algo por vários segundos e não vai funcionar. Aguarde;
  9. Na parte de mais informações, selecione Personalizado. Clique em "Configurações";
    1. O protocolo é RAW;
    2. Número da porta será 9100 (padrão) se usada a opção "port 0" do p910nd;
    3. O resto deve estar em branco ou desabilitado;
    4. OK
  10. Avançar
  11. Escolha o driver correto que você usaria caso ela estivesse conectada pela USB. Avançar;
  12. Se o driver já estiver instalado, mantenha-o. Avançar;
  13. Escolha um nome para sua impressora. Avançar. Avançar...


Mais adiante vou tentar montar um artigo de como divulgar a impressora por zeroconf. Neste caso, espero que ele detecte de maneira mais simples e até mesmo selecione automaticamente o driver. Mas isto é detalhe e válido para ambientes com diversos equipamentos ou muita rotatividade.

Até a próxima.