Ir para conteúdo
  • Cadastre-se

dev botao

  • Este tópico foi criado há 1931 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...
The popup will be closed in 10 segundos...