Erro de retorno 0 na classe de manipulação da bematech MP 4000 TH [RESOLVIDO]

Olá pessoal, peço desculpas se já existe tópicos relacionados, mas estou pedindo ajuda na seguinte situação:
Instalei a impressora não fiscal MP 4000 TH da bematech, funciona normalmente no windows, imprime página de teste, até mandei imprimir textos do NotePad ela imprimiu, mas quando peço para ela iniciar ela abre a porta “LPT1” mas retorna sempre erro 0 = desligada ou desconectada, mas está normal no windows.
Não sei mas oq fazer, peço ajuda de quem puder me oferecer ae soluçoes, ok?

DLL = “mp2032”
Imp. = MP 4000 TH não fiscal

Classes JAVA

Interface: com os métodos contidos na DLL, visto na documentação da DLL
Classe Controle: onde instancio a Native para cerregar a dll, que já coloquei no System32.

Desde já aguardo retorno, obrigado!

Para imprmir nesta impressora fiz os seguintes passos:
Baixei a biblioteca em java que permiti acessar metódos da DLL em java:

https://jna.dev.java.net/servlets/ProjectDocumentList

Adicionada a biblioteca no projeto, criei um na interface com as metodos com as funções de
que constam no arquivo .chm que vem com a DLL:

[code]
public interface Impressora extends StdCallLibrary {

Integer ConfiguraModeloImpressora(Integer indiceModelo);
Integer IniciaPorta(String nome);

}[/code]
Instalei a DLL de impressão no windows e criei uma classe utilitária para impressão:

[code]
public class BematechJNA {

public static String PORTA_LPT1 = "LPT1";
static Impressora lib = (Impressora) Native.loadLibrary("mp2032",Impressora.class);

}[/code]
Note que eu instancio a implementação da minha interface chamando a DLL, e a partir da variável lib posso acessar todos os metódos de impressão.

Olá a Daniel, obrigado pela resposta e desculpe a demora, seguinte, no meu projeto está adicionado a JNA.jar, entre outras, a DLL coloquei no System32, reajustei conforme teu exemplo, mas ainda assim minha impressora segue ligada, imprimindo teste no windows, mas quando mando rodar o java, ele diz q minha impressora está desligada ou desconectada, segue meus códigos, e mais uma vez obrigado por me ajudar, aguardo contato!

Está é minha interface.

public interface MySharedLibrary extends /*Library*/StdCallLibrary {

    void ConfiguraTaxaSerial(int i);

        int IniciaPorta(String PORTA);

        int BematechTX(String texto);

        int ConfiguraModeloImpressora(int i);

        int FormataTX(String texto, int i, int j, int k, int l, int m);

        int FechaPorta();

        int PrinterReset();

        int AjustaLarguraPapel(int i);

        int HabilitaEsperaImpressao(int i);

        int Le_Status();


}

Aqui, é para gerar relatório na bematech, mas antes verifica status da impressora.

public class RelatorioAtendentes {

    private StatusImpressora si = new StatusImpressora();

    public RelatorioAtendentes(){} 

    public int iniciarImpressao() {

        int i = 0;

        if(si.verificarStatus() == 1){

            i = imprimirAtendentes();

            
            StatusImpressoraGrafico st = new StatusImpressoraGrafico();
            st.setVisible(true);

        }
        else
            JOptionPane.showMessageDialog(null, "Impressão de Dados das Atendentes cancelada!" , "Erro de Impressão", JOptionPane.ERROR_MESSAGE);

        return(i);

    }

    private int imprimirAtendentes() {
        
        char t[] = null;
        int tam_texto = 0;
        int i;

        MySharedLibrary lib = (MySharedLibrary) Native.loadLibrary("mp2032", MySharedLibrary.class);

        lib.IniciaPorta("LPT1");
    
        lib.BematechTX("\n*************************************");
        lib.BematechTX("\n---   @LTERNATIVA INFORMÁTICA    ----");
        lib.BematechTX("\n CNPJ: xxxxxxxxxxxx || Tel:1212121212");
        lib.BematechTX("\n---   End: xxxxxx, Aparecida     ----");
        lib.BematechTX("\n*************************************");
        lib.BematechTX("\n\nData: " + new Date());
        lib.BematechTX("\t\tHora: " + new Date().getTime() + "\n");
        lib.BematechTX("\nTestando a IMPRESSORA nao fiscal:");
        lib.BematechTX("\nProduto:         Descrição:");

        tam_texto = "Roteador".length();

                if(tam_texto > 8) // CODIGO DA ATENDENTE
                    lib.BematechTX("Roteador");
                else{

                    tam_texto = 8 - tam_texto;

                    if(tam_texto == 0)
                        tam_texto = 1;

                    t = new char[tam_texto];

                    for(i=0;i<tam_texto;i++)
                        t[i] = ' ';

                    lib.BematechTX("\n" + "Roteador");

                }

                tam_texto = "Wireless 150 MBPs".length();

                if(tam_texto > 30) // NOME DA ATENDENTE
                    lib.BematechTX("  " + "Wireless 150 MBPs");
                else{

                    tam_texto = 30 - tam_texto;

                    if(tam_texto == 0)
                        tam_texto = 1;

                    t = new char[tam_texto];

                    for(i=0;i<tam_texto;i++)
                        t[i] = ' ';

                    lib.BematechTX("  " + "Wireless 150 MBPs");
                }
               lib.BematechTX("\n\n\n\n\n\n\n\n\n\n\n");

        

        lib.FechaPorta();

        return 0;
   
    }
}

Aqui faço a chamada para verificar status da impressora.

public class StatusImpressora {

    public StatusImpressora() {

    }
    public int verificarStatus() {

        boolean status = true;
        //File f = new File("/");
        //System.setProperty("jna.library.path",f.getAbsolutePath());
        MySharedLibrary lib = (MySharedLibrary) Native.loadLibrary("mp2032", MySharedLibrary.class);
        System.out.println("Caminho da DLL: "+lib.toString());
        /* PORTA PARALELA

        + Códigos do Status da Impressora: ON-LINE                        : 144
                                           OFF-LINE                       : 79
                                           Fim de Papel                   : 40
                                           Desligado ou Cabo Desconectado : 0
        
////////////////////////////////////////////////////////////////////////////////

        int HabilitaEsperaImpressao(int i)
        + RETORNO:   1 (um)         : OK
                    -2 (menos dois) : Parâmetro Inválido

             Esta função habilita ou desabilita o envio do caracter ETX (03h),
         que mantém a impressora ocupada até o término da impressão de todo o
         texto (string).

        + Parâmetro do tipo INTEIRO:
        0 (zero)   : Desabilitado
        1 (um)     : Habilitado
        */

        lib.HabilitaEsperaImpressao(1);

////////////////////////////////////////////////////////////////////////////////

        lib.IniciaPorta("LPT1");

        if(lib.Le_Status() == 79){

            JOptionPane.showMessageDialog(null, "A impressora está OFF-LINE!" , "Status da Impressora", JOptionPane.ERROR_MESSAGE);

            status = false;

        }
        else if(lib.Le_Status() == 40){

            JOptionPane.showMessageDialog(null, "O PAPEL da impressora está no FIM!" , "Status da Impressora", JOptionPane.ERROR_MESSAGE);

            status = false;

        }
        else if(lib.Le_Status() == 0){

            JOptionPane.showMessageDialog(null, "A impressora está DESLIGADA ou o cabo está DESCONECTADO!" , "Status da Impressora", JOptionPane.ERROR_MESSAGE);

            status = false;

        }

        lib.FechaPorta();

        if(status == true)
            return(1);
        else
            return(-1);

    }

}

Tanto para imprmir é necessário abrir e configurar impressora, ou seja, é obrigatŕio chamar os seguintes metódos para executar estas ações:

lib.IniciaPorta("LPT1")
lib.ConfiguraModeloImpressora(5)

Se não funcionar pode postar.

Bom pessoal. gostaria de agradecer a atenção do Daniel na ajuda prestada a mim nesse problema.
Hoje durante a terde consegui resolver o problema, abaixo segue como cheguei na solução e também o código com os arquivos necessários para download caso alguém precise futuramente, ok?
Vamos lá:
[b]Para o Windows NT, Windows 2000 ou Windows XP proceda como mostra abaixo:

    a) Copiar o aquivo BEMAIO.SYS para o diretório WINNT(WINDOWS)\SYSTEM32\DRIVERS. 
    b) Executar o arquivo BEMAIO.REG, dando um duplo-clique sobre ele. Aparecerá uma mensagem, confirme-a em OK. 
    c) Copiar o arquivo MP2032.DLL para o diretório WINNT(WINDOWS)\SYSTEM32 ou para o diretório da Aplicação. 
    d) Reiniciar o computador.[/b]

Reiniciando o computador, sua aplicação java estará pronta para impressão na MP 4000 TH.
Segue código em uso e funcionando:

   1. public interface MySharedLibrary extends Library{  
   2.   
   3.         void ConfiguraTaxaSerial(int i);  
   4.   
   5.         int IniciaPorta(String PORTA);  
   6.   
   7.         int BematechTX(String texto);  
   8.   
   9.         int ConfiguraModeloImpressora(int i);  
  10.   
  11.         int FormataTX(String texto, int i, int j, int k, int l, int m);  
  12.   
  13.         int FechaPorta();  
  14.   
  15.         int PrinterReset();  
  16.   
  17.         int AjustaLarguraPapel(int i);  
  18.   
  19.         int HabilitaEsperaImpressao(int i);  
  20.   
  21.         int Le_Status();  
  22.        
  23.         int AcionaGuilhotina(int i);
  24. }  
     1. public class RelatorioAtendentes {  
   2.   
   3.     private StatusImpressora si = new StatusImpressora();  
   4.   
   5.     public RelatorioAtendentes(){}   
   6.   
   7.     public int iniciarImpressao() {  
   8.   
   9.         int i = 0;  
  10.   
  11.         if(si.verificarStatus() == 1){  
  12.   
  13.             i = imprimirAtendentes();  
  14.   
  15.               
  16.             
  17.             
  18.   
  19.         }  
  20.         else  
  21.             JOptionPane.showMessageDialog(null, "Impressão de Dados das Atendentes cancelada!" , "Erro de Impressão", JOptionPane.ERROR_MESSAGE);  
  22.   
  23.         return(i);  
  24.   
  25.     }  
  26.   
  27.     private int imprimirAtendentes() {  
  28.           
  29.         char t[] = null;  
  30.         int tam_texto = 0;  
  31.         int i;  
  32.   
  33.         MySharedLibrary lib = (MySharedLibrary) Native.loadLibrary("mp2032", MySharedLibrary.class);  
  34.         lib.ConfiguraModeloImpressora(5);//Bematech MP 4000 TH não-fiscal     
  35.         lib.IniciaPorta("LPT1");  
  36.       
  37.         lib.BematechTX("\n*************************************");  
  38.         lib.BematechTX("\n---   @LTERNATIVA INFORMÁTICA    ----");  
  39.         lib.BematechTX("\n CNPJ: xxxxxxxxxxxx || Tel:1212121212");  
  40.         lib.BematechTX("\n---   End: xxxxxx, Aparecida     ----");  
  41.         lib.BematechTX("\n*************************************");  
  42.         lib.BematechTX("\n\nData: " + new Date());  
  43.         lib.BematechTX("\t\tHora: " + new Date().getTime() + "\n");  
  44.         
  45.         lib.BematechTX("\nProduto:         Descrição:");  
  46.   
  47.         tam_texto = "Roteador".length();  
  48.   
  49.                 if(tam_texto > 8) 
  50.                     lib.BematechTX("Roteador");  
  51.                 else{  
  52.   
  53.                     tam_texto = 8 - tam_texto;  
  54.   
  55.                     if(tam_texto == 0)  
  56.                         tam_texto = 1;  
  57.   
  58.                     t = new char[tam_texto];  
  59.   
  60.                     for(i=0;i<tam_texto;i++)  
  61.                         t[i] = ' ';  
  62.   
  63.                     lib.BematechTX("\n" + "Roteador");  
  64.   
  65.                 }  
  66.   
  67.                 tam_texto = "Wireless 150 MBPs".length();  
  68.   
  69.                 if(tam_texto > 30)
  70.                     lib.BematechTX("  " + "Wireless 150 MBPs");  
  71.                 else{  
  72.   
  73.                     tam_texto = 30 - tam_texto;  
  74.   
  75.                     if(tam_texto == 0)  
  76.                         tam_texto = 1;  
  77.   
  78.                     t = new char[tam_texto];  
  79.   
  80.                     for(i=0;i<tam_texto;i++)  
  81.                         t[i] = ' ';  
  82.   
  83.                     lib.BematechTX("  " + "Wireless 150 MBPs");  
  84.                 }  
  85.                lib.BematechTX("\n\n\n\n\n\n\n\n\n\n\n");  
  86.   
  87.           
  88.         lib.AcionaGuilhotina(1)//0 corta parcialmente, 1 corta o papel completamente
  89.         lib.FechaPorta();  
  90.   
  91.         return 0;  
  92.      
  93.     }  
  94. }  
    1. public class StatusImpressora {  
   2.   
   3.     public StatusImpressora() {  
   4.   
   5.     }  
   6.     public int verificarStatus() {  
   7.   
   8.         boolean status = true;  
   9.         
  10.        
  11.         MySharedLibrary lib = (MySharedLibrary) Native.loadLibrary("mp2032", MySharedLibrary.class);  
  12.         
  13.         /* PORTA PARALELA 
  14.  
  15.         + Códigos do Status da Impressora: ON-LINE                        : 144 
  16.                                            OFF-LINE                       : 79 
  17.                                            Fim de Papel                   : 40 
  18.                                            Desligado ou Cabo Desconectado : 0 
  19.          
  20. //////////////////////////////////////////////////////////////////////////////// 
  21.  
  22.         int HabilitaEsperaImpressao(int i) 
  23.         + RETORNO:   1 (um)         : OK 
  24.                     -2 (menos dois) : Parâmetro Inválido 
  25.  
  26.              Esta função habilita ou desabilita o envio do caracter ETX (03h), 
  27.          que mantém a impressora ocupada até o término da impressão de todo o 
  28.          texto (string). 
  29.  
  30.         + Parâmetro do tipo INTEIRO: 
  31.         0 (zero)   : Desabilitado 
  32.         1 (um)     : Habilitado 
  33.         */  
  34.   
  35.         lib.HabilitaEsperaImpressao(1);  
  36.   
  37. ////////////////////////////////////////////////////////////////////////////////  
  38.         lib.ConfiguraModeloImpressora(5);//Bematech MP 4000 TH nao-fiscal
  39.         lib.IniciaPorta("LPT1");  
  40.   
  41.         if(lib.Le_Status() == 79){  
  42.   
  43.             JOptionPane.showMessageDialog(null, "A impressora está OFF-LINE!" , "Status da Impressora", JOptionPane.ERROR_MESSAGE);  
  44.   
  45.             status = false;  
  46.   
  47.         }  
  48.         else if(lib.Le_Status() == 40){  
  49.   
  50.             JOptionPane.showMessageDialog(null, "O PAPEL da impressora está no FIM!" , "Status da Impressora", JOptionPane.ERROR_MESSAGE);  
  51.   
  52.             status = false;  
  53.   
  54.         }  
  55.         else if(lib.Le_Status() == 0){  
  56.   
  57.             JOptionPane.showMessageDialog(null, "A impressora está DESLIGADA ou o cabo está DESCONECTADO!" , "Status da Impressora", JOptionPane.ERROR_MESSAGE);  
  58.   
  59.             status = false;  
  60.   
  61.         }  
  62.   
  63.         lib.FechaPorta();  
  64.   
  65.         if(status == true)  
  66.             return(1);  
  67.         else  
  68.             return(-1);  
  69.   
  70.     }  
  71.   
  72. }  

Com essas classes agora vc faz qualquer coisa, quem deseja imprimir logo do estabelecimento, pode usar o método: ImprimeBitmap(“C:\IMAGENS\CARRO.BMP”, 0) ;
Bom espero ter ajudo, segue abaixo para download arquivos para instalação dos drivers e DLL no System32.[b]

Olá Pessoal,
estou com problemas no uso da impressora não fiscal MP4200 TH E MP400TH no windows 7 64 bits.

Preciso acessar via java, pelo visto, já instalei os drivers e nada, usei o exemplo abaixo e nada funcionou,
alguém tem como enviar um exemplo de funcionamento? Parece que está faltando algo.

Obrigado.

Fala jfquest, seguinte, vi esse erro também, talvez pelo caminho diferente que no windows 7 as DLL´s estejam, tipo, System32…mas vou dar uma olhada e retorno caso tenha sucesso, ok? At+.

Pessoal , estou exatamente com o mesmo problema utilizando o windows 7 (64). A dll que tenho foi enviada pelo suporte da bematech. A diferença pelo que percebi é que minha impressora é usb. O erro que esta ocorrendo é o seguinte

Exception in thread “main” java.lang.UnsatisfiedLinkError: Unable to load library ‘mp2032.dll’
at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:107)
at com.sun.jna.NativeLibrary.getInstance(NativeLibrary.java:146)
at com.sun.jna.Library$Handler.(Library.java:106)
at com.sun.jna.Native.loadLibrary(Native.java:225)
at com.sun.jna.Native.loadLibrary(Native.java:211)
at dll.Teste.main(Teste.java:20)

Alguem tem alguma ideia.

Obrigado

[quote=ambrosio]Pessoal , estou exatamente com o mesmo problema utilizando o windows 7 (64). A dll que tenho foi enviada pelo suporte da bematech. A diferença pelo que percebi é que minha impressora é usb. O erro que esta ocorrendo é o seguinte

Exception in thread “main” java.lang.UnsatisfiedLinkError: Unable to load library ‘mp2032.dll’
at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:107)
at com.sun.jna.NativeLibrary.getInstance(NativeLibrary.java:146)
at com.sun.jna.Library$Handler.(Library.java:106)
at com.sun.jna.Native.loadLibrary(Native.java:225)
at com.sun.jna.Native.loadLibrary(Native.java:211)
at dll.Teste.main(Teste.java:20)

Alguem tem alguma ideia.

Obrigado[/quote]

Então maninho, seguinte, esse erro ocorre porque não foi possível localizar a DLL para carregamento no sistema, faça assim, além de colocar a DLL no System32 e seguir os procedimentos citados acima, baixe e instale o pacote bematech.exe da impressora que tu usa, consegui corrigir assim, além dos procedimentos, instalei o pacote da bematech referente a impressora que eu estava usando, ok? At+…

Pessoal,

Me perdoem por ressuscitar este topico, mas quase nao vejo mais esperanca.
Preciso gerar um codigo de barra (padrao code39) em uma dessas impressoras.
Li a documentacao um monte de vezes, mas nao consigo fazer ela “entender” os comandos.
Quando emito o comando “GS”, por exemplo, que seria o responsavel por especificar que
se trata de um codigo de barras, ela imprime como uma string.

Sei que existe uma DLL para windows, que eh so chamar a funcao dentro dela e pronto, mas
minha estrutura aqui é Unix (Solaris), ou seja, (acho que) nao tem como utilizar DLL’s…

Alguma ideia mirabolante?

Abraco!

Boa noite Kenneth, não sei se já resolveu o seu problema, no link a seguir existem drivers e “DLL´s” para o linux, pois no ambiente Linux as DLL são chamadas de SO, ou seja no ambiente windows .dll no linux .so.

Downloads de drivers e .SO´s para o linux: http://www.bematech.com.br/suporte/dwn_fisc_unix.asp

Invocar a .SO no linux: http://www.urubatan.com.br/chamando-metodos-nativos-dllso-em-java-sem-jni/

No mais, ocorre como deixei especificado acima com os arquivos para download. Se precisar, estamos ae, at+.

:smiley:

Faaala meu camarada…

Primeiramente, muito obrigado pela ajuda.
Eu ja havia baixado estes drives, inclusive com o arquivo SO que voce comentou…
Fiz os ajustes necessarios (gerei um arquivo especifico e executei o bemafilx.out), porem, ele simplesmente me retorna

“cannot execute”

Lendo um pouco por ai, me parece que o arquivo tenha sido compilado pra alguma versao de Linux, e nao rodaria em Unix (Solaris).

Sera isso ou eu estou executando o negocio de forma errada?

Abraco.

Fala maninho, seguinte, a execução no UNIX ou Linux é a mesma, tem que ter o caminho exato. Mas segue links que podem vir a ajudar:

http://javafree.uol.com.br/artigo/871492/JNI-Interacao-Java-e-Delphi.html

http://under-linux.org/f95/problemas-com-jni-java-native-interface-64037/

http://www.urubatan.com.br/chamando-metodos-nativos-dllso-em-java-sem-jni/

Aguardo.

Fala camarada…

Eu descobri o que estava errado…
Eu estava tentando gerar um arquivo com os comandos, e manda-lo para a impressora.
O problema eh que quando eu salvava o arquivo, ele era gerado com uma tabela ascii diferente do que deveria ser.
Em um determinado, ao inves de gerar uma aspas duplas, ele gerava “ä”.

Decidi entao mudar de tatica, troquei a geracao do arquivo por um socket nativo da linguagem que uso por aqui (Progress)
conectando direto no print server, e escrevendo la os comandos.

Dessa forma, funcionou muito bem.

Agradeco, e muito, a ajuda.

Abraco.

É isso ae maninho, qualquer coisa, só postar ae, at+. :smiley:

Pessoal, alguém ai tem o .JAR pra compartilhar?

No Jar que encontrei aqui, não existe essa classe Library, que você extend… pode compartilha-la?

quando USB, o que passo na porta, onde está LPT1?

wilsontads Boa tarde, seguinte, primeiro explicando, meu usuário antigo é o cara da fotinha em mangá nos primeiros posts aq com username “blackwolf”, depois perdi a senha e refiz meu cadastro e acabei ficando com jether rodrigues, referenciar a “jether rodrigues” ou “blackwolf” é a mesma pessoa.
Respondendo: vc perguntou algo sobre .JAR, qual? Nos primeiros posts tem download para vc fazer de um projeto exemplo feito em java e com as dependencias necessárias e tbm explicação de como instalar esses drivers, ok?
Qlq coisa estamos ae… :lol:

Pow… valeu… consegui aqui…