Ir para conteúdo
  • Cadastre-se

dev botao

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

Recommended Posts

Postado

Boa ! 

Estou desenvolvendo a impressão da NFC-e via impressão direta, sem utilizar os componentes do ACBr (Android). 

Estou com dificuldade de passar para a impressora os comandos para geração do QRCODE e a documentação não é lá muito boa. 

Alguém poderia dar um help ?

O problema está na configuração do tamanho

Não importa o valor que eu configure, somente imprime o qrcode até 127 caracteres , acima disso o qrcode não é impresso.

Via manual o n1 é o nivel de corre~ção de erro. n2 tamanho do módulo n3 versão do qrcode e n4 encoding...

Impressora Bematech MP4200TH

 

PRINT_QRCODE = ""
                            + (char)27 + (char)97 + (char)1
                            + (char)29 + (char)107 + (char)81
                            + (char)1 + (char)12 + (char)5 + (char)1        // Aqui é a configuração do tamanho
                            + (char)127
                            + (char)0;

                            + {cadeia de caracteres para impressão}

 

Valeu !                    

 

  • Consultores
Postado
23 horas atrás, Sergio Tucano Clemente Da Silva Filho disse:

Alguém poderia dar um help ?

O problema está na configuração do tamanho

Não importa o valor que eu configure, somente imprime o qrcode até 127 caracteres , acima disso o qrcode não é impresso.

A quantidade de dados que o QR code suporta depende também da versão. Esse site abaixo tem uma tabela para saber quantos caracteres são possíveis em cada versão:

https://www.qrcode.com/en/about/version.html

Além disso, no manual da impressora você deve encontrar algumas situações em que o QR code não é impresso. Por exemplo, isso pode ter relação com o espaço disponível no papel para o código ocupar. Ou talvez com uma configuração não permitida para a impressora.

 

  • Curtir 1

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

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

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Postado (editado)
32 minutos atrás, EMBarbosa disse:

A quantidade de dados que o QR code suporta depende também da versão. Esse site abaixo tem uma tabela para saber quantos caracteres são possíveis em cada versão:

https://www.qrcode.com/en/about/version.html

Além disso, no manual da impressora você deve encontrar algumas situações em que o QR code não é impresso. Por exemplo, isso pode ter relação com o espaço disponível no papel para o código ocupar. Ou talvez com uma configuração não permitida para a impressora.

 

Então... 

O mesmo valor que configuro no ACBr para gerar o QRCode é o que estou colocando para o comando direto. 

Mas, passou de 127 caracteres o QRCode não é gerado, já o ACBr gera corretamente o QRCode. 

OPS ! Cheguei a debugar os fontes do ACBr para verificar os cálculos e aparentemente não tem nada de muito diferente. Mas não consegui visualizar o comando final que é enviado para a impressora para comparar com o meu

Editado por Sergio Tucano Clemente Da Silva Filho
adicionar informações
  • Consultores
Postado
1 minuto atrás, Sergio Tucano Clemente Da Silva Filho disse:

Então... 

O mesmo valor que configuro no ACBr para gerar o QRCode é o que estou colocando para o comando direto. 

Mas, passou de 127 caracteres o QRCode não é gerado, já o ACBr gera corretamente o QRCode. 

 

Você há de concordar comigo que alguma coisa está sendo transmitida de forma diferente.

Sugiro você considerar possíveis diferenças nos dados transmitidos quando comparados em formato binário.

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

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

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Postado
3 minutos atrás, EMBarbosa disse:

Você há de concordar comigo que alguma coisa está sendo transmitida de forma diferente.

Sugiro você considerar possíveis diferenças nos dados transmitidos quando comparados em formato binário.

Por isso gostaria de saber se estou configurando de forma incorreta. 

 

PRINT_QRCODE = ""
                            + (char)27 + (char)97 + (char)1
                            + (char)29 + (char)107 + (char)81
                            + (char)0 + (char)45 + (char)7 + (char)1        // error lvl = 0 (L)  | Module SIZE = 45  | QR Version 7 | Alphanumeric
                            + (char)150                                                          // serão transmitidos 150 caracteres
                            + (char)0;

                            + {cadeia de caracteres para impressão}

 

Esse Valor não é impresso o QRCode

  • Consultores
Postado
6 horas atrás, Sergio Tucano Clemente Da Silva Filho disse:

Por isso gostaria de saber se estou configurando de forma incorreta. 

E foi por isso que eu disse pra você comparar os valores...

7 horas atrás, Sergio Tucano Clemente Da Silva Filho disse:

Cheguei a debugar os fontes do ACBr para verificar os cálculos e aparentemente não tem nada de muito diferente. Mas não consegui visualizar o comando final que é enviado para a impressora para comparar com o meu

Mas qualquer coisa diferente nesse caso é muita coisa. Você pode usar o log gerado pelo ACBrESCPOS para analisar o que ele está enviando a impressora e comparar com o seu aplicativo.

A propósito, no seu código:

6 horas atrás, Sergio Tucano Clemente Da Silva Filho disse:

                            + (char)150                                                          // serão transmitidos 150 caracteres
                            + (char)0;

                            + {cadeia de caracteres para impressão}

Em Java, char 0 não é final de string?

  • Curtir 1

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

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

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
  • Fundadores
Postado
1 hora atrás, Sergio Tucano Clemente Da Silva Filho disse:

No Delphi ou Lazarus, certo?

No caso a aplicação Android é em Java

Ok... agora compreendi... Veja a Unit: ACBrEscBematech.pas

function TACBrEscBematech.ComandoQrCode(const ACodigo: AnsiString): AnsiString;
begin
  with fpPosPrinter.ConfigQRCode do
  begin
    Result := GS  + 'kQ' + // Codigo QRCode
              AnsiChr(ErrorLevel) +         // N1 Error correction level 0 - L, 1 - M, 2 - Q, 3 - H
              AnsiChr(LarguraModulo * 2) +  // N2 - MSB; 0 = default = 4
              AnsiChr(0) +                  // N3 - Precisa computar Version QRCode ???
              AnsiChr(1) +                  // N4, Encoding modes: 0 – Numeric only, 1 – Alphanumeric, 2 – Binary (8 bits), 3 – Kanji,
              IntToLEStr( Length(ACodigo) ) +  // N5 e N6
              ACodigo;
  end;
end;  

Veja ainda o método: IntToLEStr, da Unit ACBrUtil.pas

{-----------------------------------------------------------------------------
  Converte um "AInteger" em uma String binria codificada como Little Endian,
  no tamanho mximo de "BytesStr"
  Exemplos: IntToLEStr( 106 ) = chr(106) + chr(0)
 ---------------------------------------------------------------------------- }
function IntToLEStr(AInteger: Integer; BytesStr: Integer): AnsiString;
var
   AHexStr: String;
   LenHex, P, DecVal: Integer;
begin
  LenHex  := BytesStr * 2 ;
  AHexStr := IntToHex(AInteger,LenHex);
  Result  := '' ;

  P := 1;
  while P < LenHex do
  begin
    DecVal := StrToInt('$'+copy(AHexStr,P,2)) ;
    Result := AnsiChar( DecVal ) + Result;
    P := P + 2 ;
  end ;
end;

 

  • Obrigado 1
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.

Postado
18 horas atrás, EMBarbosa disse:

A propósito, no seu código:

Em Java, char 0 não é final de string?

Em C sim, em JAVA não. 

 

 

18 horas atrás, Daniel Simoes disse:

Ok... agora compreendi... Veja a Unit: ACBrEscBematech.pas


function TACBrEscBematech.ComandoQrCode(const ACodigo: AnsiString): AnsiString;
begin
  with fpPosPrinter.ConfigQRCode do
  begin
    Result := GS  + 'kQ' + // Codigo QRCode
              AnsiChr(ErrorLevel) +         // N1 Error correction level 0 - L, 1 - M, 2 - Q, 3 - H
              AnsiChr(LarguraModulo * 2) +  // N2 - MSB; 0 = default = 4
              AnsiChr(0) +                  // N3 - Precisa computar Version QRCode ???
              AnsiChr(1) +                  // N4, Encoding modes: 0 – Numeric only, 1 – Alphanumeric, 2 – Binary (8 bits), 3 – Kanji,
              IntToLEStr( Length(ACodigo) ) +  // N5 e N6
              ACodigo;
  end;
end;  

Veja ainda o método: IntToLEStr, da Unit ACBrUtil.pas


{-----------------------------------------------------------------------------
  Converte um "AInteger" em uma String binria codificada como Little Endian,
  no tamanho mximo de "BytesStr"
  Exemplos: IntToLEStr( 106 ) = chr(106) + chr(0)
 ---------------------------------------------------------------------------- }
function IntToLEStr(AInteger: Integer; BytesStr: Integer): AnsiString;
var
   AHexStr: String;
   LenHex, P, DecVal: Integer;
begin
  LenHex  := BytesStr * 2 ;
  AHexStr := IntToHex(AInteger,LenHex);
  Result  := '' ;

  P := 1;
  while P < LenHex do
  begin
    DecVal := StrToInt('$'+copy(AHexStr,P,2)) ;
    Result := AnsiChar( DecVal ) + Result;
    P := P + 2 ;
  end ;
end;

 

Interessante, o n5 e n6 vocês calculam juntos. 

No manual diz que o n5 seria o módulo do tamanho do texto por 256.

Como , em qualquer configuração do QRCOde acontece o erro de não gerar o Código acima de 127 caracteres, pode ser ai o erro. 

Vou dar uma revisada aqui. 

 

Valeu!

 

 

  • Fundadores
Postado
Em 06/09/2019 at 12:22, Sergio Tucano Clemente Da Silva Filho disse:

Interessante, o n5 e n6 vocês calculam juntos. 

Na verdade o que você precisa é informar o tamanho do Cod.Barras usando  "Little Endian"

https://gist.github.com/paulononaka/908246

  • Curtir 1
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.

  • 5 meses depois ...
Postado

Boa!

Voltando aqui para fechar o tópico.

Para quem um dia precisar se comunicar via tcp com a bema 4200 em comando esc/pos e imprimir um qrcode o código é o seguinte:

Geração do qrcode:

try {


                int qrLen = SALES_QRCODE.length()+3;

                char ph = (char)(qrLen / 256);
                int pl = (char)(qrLen - (ph * 256));



                String qrCode = ""+
                        //Selecionar modelo: GS ( k pL pH cn fn n1 n2
                        (char)29 + (char)40 + (char)107 + (char)4+ (char)0+ (char)49+ (char)65+ (char)50+ (char)0+

                        // Selecionar tamanho do modulo: GS ( k pL pH cn fn n
                        (char)29+ (char)40+ (char)107+ (char)3+ (char)0+ (char)49+ (char)67+ (char)4+

                        //Selecionar nível de correção de erro: GS ( k pL pH cn fn n
                        (char)29+ (char)40+ (char)107+ (char)3+ (char)0+ (char)49+ (char)69+ (char)49+

                        //Armazenar texto em memória: GS ( k pL pH cn fn m d1...dk
                        (char)29+ (char)40+ (char)107+ (char)pl + ph + (char)49+ (char)80+ (char)48+SALES_QRCODE+

                        //Imprimir QRCode:
                        (char)29+ (char)40+ (char)107+ (char)3+ (char)0+ (char)49+ (char)81+ (char)48;


                PRINT_QRCODE = qrCode;
            } catch (Exception ex) {
                System.out.println(ex);
            }

E para enviar por socket :

 

try {

                                Socket sock = new Socket(IP, PORTA);
                                DataOutputStream out = new DataOutputStream(sock.getOutputStream());

                                out.writeShort(PRINT_QRCODE.length());
                                out.writeBytes(PRINT_QRCODE);

                                out.flush();
                                out.close();

                            } catch (Exception e) {
                                e.printStackTrace();
                            }

 

  • Curtir 4
  • Administradores
Postado

Obrigado por reportar.

Fechando. Para novas dúvidas, criar um novo tópico.

Consultora SAC ACBr

Juliana Tamizou

Gerente de Projetos ACBr / Diretora de Marketing AFRAC
Ajude o Projeto ACBr crescer - Seja Pro

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

Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil


Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

  • Este tópico foi criado há 1735 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.
Visitante
Este tópico está agora fechado para novas respostas
×
×
  • 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.