Erro de acesso negado ao conectar a impressora por USB
Como resolver o erro Acesso negado (Permission denied) ao conectar a impressora térmica por USB. No Windows, trocando o driver da porta pra WinUSB com o Zadig. No Linux, ajustando a permissão do dispositivo com uma regra de udev.
O erro acontece porque o sistema operacional já reivindicou a porta USB da impressora para o driver de impressão padrão, e o navegador não consegue reivindicar a mesma interface para falar diretamente com o dispositivo via WebUSB. A causa exata e a solução mudam entre Windows e Linux, então esse tutorial tem uma seção pra cada sistema.

Windows
No Windows, a solução é trocar o driver dessa porta USB por um chamado WinUSB, usando um programa gratuito chamado Zadig.
Antes de começar
Depois de trocar o driver para WinUSB, essa impressora normalmente some da lista de impressoras do Windows e para de funcionar em outros programas que imprimem nela como impressora comum, como o Word ou um leitor de PDF. Não é um defeito, é uma troca deliberada de como o Windows enxerga o dispositivo. Se isso for um problema pra sua loja, existe uma alternativa que não exige trocar driver nenhum: o agente local do FidMenu, disponível como opção Agente local no assistente de cadastro de impressora.
O que você vai precisar
- Um computador com Windows.
- Acesso de administrador nesse computador.
- A impressora ligada e conectada por USB.
Passo a passo
- Feche o FidMenu e qualquer outro programa que esteja tentando imprimir antes de mexer no driver.
- Baixe o Zadig no site oficial, zadig.akeo.ie. Nunca baixe por espelhos ou links de terceiros.
- Clique com o botão direito no arquivo baixado e escolha Executar como administrador.
- No menu Options do Zadig, marque List All Devices. Sem essa opção marcada, a impressora não aparece, porque ela já tem um driver instalado.

- No menu principal, selecione o dispositivo certo pelo nome da impressora ou pelo par de números entre colchetes, chamado VID:PID. Se a impressora tiver mais de uma interface, use as setas ao lado do nome para navegar entre elas até achar a interface de impressão.
- No campo de driver à direita, use as setas verdes até aparecer WinUSB.

- Clique no botão de instalar (o texto muda conforme o estado do dispositivo: Install Driver, Replace Driver, Upgrade Driver ou Reinstall WCID Driver) e aguarde a barra de progresso terminar.

- Desconecte e reconecte o cabo USB da impressora, para garantir que o Windows carregue o driver novo.
- Volte ao FidMenu, no assistente de cadastro de impressora escolha USB e tente conectar de novo. O navegador deve pedir permissão e listar o dispositivo normalmente.
Se ainda não funcionar
Abra o Gerenciador de Dispositivos do Windows e procure pela impressora. Se a troca de driver funcionou, ela aparece em Controladores USB (barramento serial universal), chamado de Universal Serial Bus devices no Windows em inglês, e não mais em Filas de impressão.

Se a impressora continuar aparecendo em Impressoras, repita o passo 5 conferindo se a interface selecionada é mesmo a de impressão, e não uma interface auxiliar do mesmo dispositivo.
Linux (Fedora e outras distribuições)
No Linux não existe driver pra trocar. O problema quase sempre é de permissão: por padrão, o arquivo de dispositivo da impressora no /dev pertence ao usuário root, e o navegador roda com o seu usuário comum, sem permissão pra abrir esse dispositivo diretamente. A solução é criar uma regra de udev liberando o acesso pra essa impressora específica.
O que você vai precisar
- Um terminal com acesso a
sudo. - A impressora ligada e conectada por USB.
Passo a passo
- Conecte a impressora e abra um terminal.
- Rode o comando
lsusb. Se o comando não existir, instale o pacote comsudo dnf install usbutilsno Fedora, ousudo apt install usbutilsno Ubuntu e Debian. - Procure a linha da sua impressora na lista e anote o par de números depois de ID, no formato vendor:product. No exemplo abaixo, a impressora é a linha Philips (or NXP) USB Printer, com o par
0471:0055.

- Crie um arquivo de regra em
/etc/udev/rules.d/, por exemplo comsudo nano /etc/udev/rules.d/99-fidmenu-impressora.rules, e cole a linha abaixo trocando os números pelos que você anotou:
SUBSYSTEM=="usb", ATTRS{idVendor}=="0471", ATTRS{idProduct}=="0055", MODE="0666"

- Salve o arquivo e recarregue as regras do udev:
sudo udevadm control --reload-rules
sudo udevadm trigger
- Desconecte e reconecte o cabo USB da impressora.
- Volte ao FidMenu, no assistente de cadastro de impressora escolha USB e tente conectar de novo.
Se ainda não funcionar
Se depois da regra de udev o erro mudar de Acesso negado para Failed to execute 'claimInterface' on 'USBDevice': Unable to claim interface, o driver usblp do kernel, o driver de impressora genérico do Linux, está segurando a interface antes do navegador conseguir reivindicar o dispositivo. Isso acontece com qualquer impressora que se identifique como classe genérica de impressora no USB. Rode lsusb -t pra confirmar: se aparecer Driver=usblp na linha da sua impressora, é isso.
Não tente resolver isso desautorizando a interface, escrevendo
0em/sys/bus/usb/devices/<endereço>/authorized. Parece a solução mais direta, mas essa chave bloqueia qualquer programa de reivindicar a interface, inclusive o navegador, não só o driver do kernel. O resultado é um erro ainda mais confuso,Dispositivo inexistente(ENODEV, erro 19), e a impressora fica pior do que antes.
O jeito que funciona de verdade é impedir o driver usblp de carregar, no sistema todo:
sudo tee /etc/modprobe.d/blacklist-usblp.conf > /dev/null <<'EOF'
blacklist usblp
EOF
sudo rmmod usblp
Desconecte e reconecte o cabo USB da impressora depois disso, pra forçar o Linux a reconhecer o dispositivo sem o driver. Rode lsusb -t de novo: a linha da impressora deve aparecer sem nenhum driver, ou com Driver=usbfs quando o navegador já estiver com ela aberta. Volte ao FidMenu e tente conectar de novo.
Esse bloqueio é permanente (o arquivo em /etc/modprobe.d/ continua valendo depois de reiniciar) e vale pra qualquer impressora USB que se identifique como classe genérica de impressora nesse computador, não só a impressora térmica do FidMenu. Se esse computador também precisa imprimir documentos comuns numa impressora de verdade pelo CUPS, esse bloqueio vai atrapalhar. O agente local do FidMenu, que evita esse problema inteiro, existe hoje só pra Windows.
Perguntas frequentes
No Windows, depois de usar o Zadig, minha impressora sumiu da lista de impressoras. Isso é normal?
Sim. Trocar o driver para WinUSB muda como o Windows enxerga esse dispositivo: ele deixa de aparecer como uma impressora comum e passa a responder só ao navegador, via WebUSB. Se você ainda precisa imprimir nela por outros programas, use o agente local do FidMenu em vez do Zadig.
Preciso repetir esse processo em todo computador que for usar a impressora?
Sim. A configuração vale para a combinação impressora, computador e porta USB, seja a troca de driver no Windows ou a regra de udev no Linux. Se a loja tem mais de um computador ou tablet conectando na mesma impressora, repita os passos em cada um.
No Windows, o Zadig é seguro?
O Zadig é uma ferramenta open source amplamente usada para instalar drivers WinUSB e libusb no Windows. Baixe sempre pelo site oficial, zadig.akeo.ie, e nunca por espelhos ou links de terceiros.
No Windows, existe outra forma de resolver sem trocar o driver?
Sim. O FidMenu tem um agente local para Windows que imprime pela fila de impressão do próprio sistema, sem precisar trocar driver nenhum. No assistente de cadastro de impressora, escolha a opção Agente local em vez de USB.
No Linux, isso funciona em qualquer distribuição, não só no Fedora?
Sim. O comando lsusb, as regras de udev e o bloqueio do módulo usblp funcionam do mesmo jeito em qualquer distribuição que use udev, como Ubuntu, Debian, Mint e derivados. Só o comando pra instalar o pacote usbutils muda: dnf install usbutils no Fedora, apt install usbutils no Ubuntu e Debian.
No Linux, preciso reiniciar o computador depois de criar a regra de udev?
Não. Depois de rodar sudo udevadm control --reload-rules, sudo udevadm trigger e desconectar e reconectar a impressora, a regra já vale. Reiniciar só ajuda se por algum motivo esses comandos não pegarem o dispositivo.
No Linux, segui a regra de udev mas o Chrome continua dando erro ao reivindicar a interface (claimInterface, Unable to claim interface)?
Rode lsusb -t e veja se a linha da sua impressora mostra Driver=usblp. Se mostrar, o driver de impressora genérico do Linux está segurando a interface antes do navegador. A solução é bloquear esse driver no sistema (seção Se ainda não funcionar do tutorial), não mexer na permissão de novo, que já está certa nesse ponto.
No Linux, tentei desautorizar a interface (authorized=0) pra liberar ela do usblp e piorou. Por quê?
Porque authorized não distingue driver do kernel de programa comum: com ele em 0, nem o navegador consegue reivindicar a interface, e o erro vira Dispositivo inexistente (ENODEV), mais confuso que o original. O jeito certo é deixar authorized em 1 (o padrão) e bloquear especificamente o carregamento do driver usblp, como descrito no tutorial.