Discuta este tópico no fórum

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

Mostrando postagens com marcador scanner. Mostrar todas as postagens
Mostrando postagens com marcador scanner. Mostrar todas as postagens

quinta-feira, 29 de outubro de 2015

OpenWRT: nova versão do sane-backends e hplip para OpenWRT

Mais um artigo da série sobre o OpenWRT.

Uma das mudanças da nova versão do OpenWRT é que a política de gerenciamento dos pacotes foi renovada. Agora todos tem um mantenedor. Os pacotes que não ganharam um pai não foram compilados na nova versão. Então, não estranhe se ao atualizar o seu roteador e tentar reinstalar um pacote, um ou outro pacote estiver faltando.


E o que fazer se você queria aquele pacote? Que tal adotá-lo você mesmo? Fui o que fiz para o sane-backends. Este artigo é sobre as melhorias feitas neste pacote que fornece a infraestrutura para acesso a scanners. A configuração para transformar um scanner normal em um scanner de rede já foi tema anterior deste blog.

Um dos grandes problemas que o pacote anterior tinha era a exigência de espaço para instalá-lo. Além de conter todos os drivers, ele dependia do CUPS, que não é lá muito pequeno. O ideal para quem for portar algo para o OpenWRT é tentar isolar os recursos em pequenos pacotes para que o usuário possa instalar somente o que ele vai usar. Não era a situação anterior deste pacote.

O sane-backends era dividido em:
  • sane-backends: continha todos os executáveis (incluindo o daemon) e configurações;
  • sane-libs: tudo que era uma biblioteca, includindo os drivers e a biblioteca base;
  • sane-frontends: clientes simples do sane;
O problema desta estrutura é que ela separa tipo de arquivo (configuração e executáveis, bibliotecas) e não funcionalidades. O sane-libs não vivia sem o sane-backends e todos os backends (drivers) estavam juntos. Para quem fosse usar o hplip (para scanners HP), nenhum backend era usado. Fora este desperdício, ainda temos a dependência ao CUPS (que é relacionado a impressoras e não diretamente a scanners). Então, para usar o scanner no OpenWRT, era quase requisito aumentar o disco com uma unidade externa. Simplesmente não cabia em uma flash de 8MB.

O primeiro passo foi juntar o sane-libs e o sane-backends e dividí-los por funcionalidade. No caso, temos a biblioteca básica (libsane), que todos os clientes e backends usam, o daemon usado para acesso de clientes remotos e os diversos backends, que são compostos de um módulo (implementado como uma biblioteca - extensão .so) e um arquivo de configuração.

Na nova modelagem, o pacote ficou dividido em:
  • libsane: apenas a biblioteca básica do sane, usada por todos os drivers (inclusive o hplip);
  • sane-daemon: inclui apenas o daemon do sane e suas configurações, depende da libsane; 
  • sane-<xxx>: onde <xxx> é um backend. Possui dependência particular de cada pacote;
  • sane-backends-all: metapacote que instala todos os backends;
  • sane-frontends: clientes simples do sane (igual a versão anterior).
Foram feitos alguns patches de melhorias para retirar a dependência do CUPS (era usado somente para localizar um tipo de scanner), reduzir a dependência entre bibliotecas e mais um bom tanto de ajustes relacionados a compilação em arquiteturas diferentes usando uma libc diferente (uclibc e musl). Algumas das correções foram enviadas ao projeto do SANE e já integram atualmente a versão estável do sane!

Resultado? O básico do sane pode ser instalado com algo em torno de 70 Kbytes (fora a dependência da libusb). Esta nova versão proposta estará na nova versão do OpenWRT (DD) ainda em desenvolvimento neste momento. Se quiser usá-la imediatamente em versões anteriores, tenho um repositório próprio com uma seleta de pacotes para algumas arquiteturas em http://luizluca.github.io/openwrt/.

E se eu tenho uma multifuncional HP, como faço com a hplip? Também temos uma nova versão proposta da hplip no repositório que mencionei acima. Este, além de atualizar a versão, o que antes era apenas um pacote foi dividido em:
  • hplip-common: bibliotecas usadas por ambos os próximos pacotes;
  • hplip-sane: backend sane. Se for usar apenas a impressora e não o CUPS no roteador, só vai precisar deste. A impressora ainda pode ser usada sem o driver pelo p910nd;
  • hplip-cups: o driver para o cups. Somente este pacote depende do CUPS.
Mesmo o hplip-sane precisava do CUPS para localizar scanners de rede. Assim como no sane-backends, esta funcionalidade foi removida por um patch para não deixar a dependência. Isto retira uma funcionalidade de buscar scanners em impressoras na rede. Porém, não fazia muito sentido o roteador buscar um scanner que já está na rede para, novamente, disponibilizá-lo na rede. Neste caso, o cliente deve conversar diretamente com a impressora e não utilizar o roteador. O foco do uso do OpenWRT é justamente transformar uma impressora/scanner local em um equipamento de rede.

Todavia, existe ainda uma questão a ser resolvida para as versões CC e DD: ninguém adotou o CUPS. Desta forma, ele não está disponível. Ainda vou ver o que eu posso fazer quanto a isto, se tento eliminar o hplip-cups, adotar o pacote do cups ou esperar que alguém o adote. Provavelmente vou disponibilizar os pacotes do hplip-sane para as novas versões no meu repositório.

Se pintar um problema, tem sempre o fórum deste blog. Até a próxima.

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!