Ir para conteúdo
  • Cadastre-se

dev botao

  • Este tópico foi criado há 1830 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

  • Fundadores
Postado

usb GIF

O ACBr suporta impressoras USB ?

Durante muito tempo, a resposta a essa pergunta foi:  NÃO, você precisa usar a Porta COM, Spool do Windows (RAW), Compartilhamento de Rede ou algum outro método...

Porém agora isso mudou... Agora componentes que usam o ACBrDevice, como por exemplo o ACBrPosPrinter (para Impressoras Não Fiscais) e o ACBrETQ (para Impressoras de Etiquetas), possuem suporte a portas USB de maneira nativo do Windows... Ou seja, sem a necessidade de DLLs externas...

Isso significa que caso o seu equipamento esteja conectado ao PC, por uma Porta USB... Você poderá conectar os componentes do ACBr, simplesmente definindo na Propriedade Porta algo como "USB"

 

Exemplos de uso:

  • ACBrPosPrinter1.Porta := 'USB'                               -   Tenta descobrir qual é a Primeira Impressora de Bobinas plugada na USB e faz uso dela, se encontrar..
  • ACBrPosPrinter1.Porta := 'USB:Elgin'                      -   Tenta conexão em alguma Impressora USB, listada como sendo do Fabricante 'Elgin'
  • ACBrPosPrinter1.Porta := 'USB:Sweda, SI-300S'   -   Tenta conexão na Impressora USB, do Fabricante "Sweda" e do Modelo "SI-300S".
  • ACBrETQ1.Porta := 'USB'                                           -   Tenta descobrir qual é a Primeira Impressora de Etiquetas plugada na USB e faz uso dela, se encontrar..
  • ACBrETQ1.Porta := 'USB:Zebra, GC420t'                -    Tenta conexão com a Impressora USB do Fabricante "Zebra", e modelo "GC420t"

Observe que essa nova implementação é totalmente diferente do método de Hook, onde usávamos a DLL do Fabricante, como túnel USB...
Nesse novo cenário a comunicação USB é feita diretamente usando a API do Windows, ou seja, sem necessidade de DLLs externas. Para compreender um pouco mais, sobre esse método veja esse artigo

O método de Hook ainda está disponível, usando o prefixo de porta, 'DLL:'

 

Como os Equipamentos são identificados ?

Todo Equipamento USB, possui um código de identificação do Fabricante, chamado de Vendor ID (VID), e também do Produto chamado de Product ID (PID). Essa numeração é controlada pela USB.ORG, e você pode encontras uma lista de Todos os "Vendors ID", nesse link

A classe TACBrUSBIDDataBase, mantêm um Banco de Dados interno, chamado ACBrUSBID.ini, com o mapeamento dos principais Equipamentos do Mercado Brasileiro.. Esse Banco de Dados é um simples Arquivo do tipo INI, que é compilado como resource e adicionado ao componente... Clique aqui para ver o layout do Banco de Dados no Formato INI, observe os comentários no inicio do arquivo, com algumas instruções de como inserir novos equipamentos nele.

Se você distribuir o arquivo ACBrUSBID.ini, na mesma pasta do Executável da sua aplicação, a classe TACBrUSBIDDataBase fará uso desse arquivo, ao invéz de usar o resource interno...  Isso pode ser muito útil para atualizar a lista de Dispositivos conhecidos, sem necessitar compilar uma nova versão do programa, apenas atualizando o ACBrUSBID.ini

 

Como posso listar os equipamentos identificados pelo ACBr ?

Use a Força, leia os fontes... Vamos ver trechos de código, do Demo PosPrinterTeste

  {$IfDef MSWINDOWS}  // Os métodos abaixo, somente estão disponíveis para compilação em Windows
   // Carrega a lista de Impressoras detectadas em: ACBrPosPrinter1.Device.WinUSB.DeviceList 
   ACBrPosPrinter1.Device.WinUSB.FindUSBPrinters();   

   // Varre a lista de Impressoras USB detectadas, e adiciona as mesmas, nas opções de Porta
   for K := 0 to ACBrPosPrinter1.Device.WinUSB.DeviceList.Count-1 do
     cbxPorta.Items.Add('USB:'+ACBrPosPrinter1.Device.WinUSB.DeviceList.Items[K].DeviceName);
  {$EndIf}          

 

Como o ACBr nomeia os dispositivos ?

O "DeviceName" será calculado, de acordo com as informações disponíveis no banco de Dados...

  1. Primeiro o ACBr usa a API do Windows para captura informações do VID (Vendor ID ou Fabricante) e o PID (Product ID ou Modelo), dos Equipamentos listados...
    Se o ACBr falhar nessa tarefa, o equipamento será ignorado (não será listado)
  2. Se for capturado com sucesso a descrição em FriendlyName,  então ela será usada.. Caso contrário, o ACBr tentará compor o nome, baseado no VID e PID
  3. Se o VID do Fabricante for encontrado na sessão [Vendors]  de ACBrUSBID.ini, então o VID será substituído pela Descrição do Fabricante...
    Observe que na sessão [Vendors], temos vários fabricantes que não são conhecidos no mercado Brasileiro, mas são de equipamentos OEM, de Empresas nacionais... Nós procuramos manter o nome Original do Fabricante, de acordo com a tabelas de VID da OSB.ORG
    Se o VID não tiver equivalência na relação de [Vendors]  de ACBrUSBID.ini,  então ele será listado com o próprio número VID, que são 4 algarismos em Hexadecimal... Exemplo: "0b1b"
  4. Procuramos pelo PID do Equipamento, na sessão específica do Fabricante.
    Se não houver uma chave com o PID, então o ACBr usará o próprio número PID, para Nomear o Modelo. O PID também é composto do 4 algarismos em Hexadecimal... Exemplo: "0001"
    Se encontrar uma entrada com o PID, dentro da sessão do Fabricante, então o ACBr usará a Descrição do Modelo, e poderá desprezar a descrição do Fabricante, se a Descrição do modelo possuir uma vírgula, Exemplo:
    7008=Elgin, I9;1;1... Nesse caso será desprezada a descrição do Fabricante "20d1-Dascom" e será usada apenas a descrição do Modelo, "Elgin, I9".

 

Detecção automática de Porta e Protocolo

Como agora temos um Banco de Dados, que informa além da Descrição do equipamento, qual é o Tipo do mesmo e qual o protocolo que ele usa, então os componentes ACBrPosPrinter e ACBrETQ, podem fazer uso dessas informações...

Ou seja, se o equipamento for detectado com sucesso, no momento da Ativação da Porta (durante a chamada ao método "Ativar"), será usado o Protocolo Definido no Banco de Dados.

Se for detectado que o equipamento USB é na verdade uma porta COM virtual, então o ACBr irá preferir fazer uso da Porta COM virtual, chaveando para mesma, de forma transparente... Pois dessa forma ele tem um melhor suporte a leitura de informações do equipamento.

Se for detectado que a porta USB possui um equipamento incompatível com o componente em questão, isso também será alertado...
Exemplo, você tentar conectar em uma porta 'USB:Zebra, GC420t' no componente TACBrPosPrinter, então um erro será emitido, pois esse equipamento não é uma impressora de Bobinas

 

Como a mágica funciona ?

Reparem que foi adicionado ao repositório a Unit ACBrWinUSBDevice.pas, essa Unit implementa chamadas a SetupAPI do Windows, para detectar os Dispositivos USB que estão listados em uma determinada Classe de Equipamentos (Class GUID)... O estudo desse artigo, foi fundamental, para a criação dessa Unit.

Uma vez capturada o nome da Interface do Equipamento USB (em TACBrUSBWinDevice.DeviceInterface), podemos acessá-lo usando funções de manipulação Arquivos da API do Windows, como: CreateFile, WriteFile, ReadFile.

Nem todos os dispositivos USB implementam suporte aos métodos ReadFile ou WriteFile... ou seja, pode não funcionar em alguns dispositivos..

Se você souber qual é o nome da Interface USB do equipamento, poderá informar ela diretamente na propriedade "Porta" dos componentes... Exemplo:

ACBrPosPrinter1.Porta := '\\?\usb#vid_1c8a&pid_3002#0000000000022#{28d78fad-5a12-11d1-ae5b-0000f803a8c2}';

 

Para dúvidas, suporte ou correções, por favor crie um novo tópico, clicando aqui

Para testar, baixe uma nova versão do PosPrinterTeste.exe

 

 

 

  • Curtir 23
  • Obrigado 9
Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.

The popup will be closed in 10 segundos...