Comandos AT

15 respostas
S

Galera possuo um modem ligado na porta com1, gostaria de saber como posso enviar comandos AT para este modem, alguem já fez algo parecido? Obrigado!

15 Respostas

E

Basicamente, você precisa usar algo que se comunique com o modem via porta serial, como o JavaComm ou o RXTX, e simplesmente mande os comandos. Por exemplo: envie os bytes “ATDT196\r” para discar o número 196.

E

Shakall, se vc conseguir fazer isso, por favor me diga como que faz, porque estou quebrando a cabeça nisso há dias.

até mais

S

Consegui fazer usando o RXTX, no desktop, agora vou tentar fazer rodar no meu pocket pc, usando a RXTX para Win CE.

S

Consegui rodar comandos At no Desktop e no meu pocket pelo windows mobile, segue abaixo o codigo:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package comandosat;

/**
 *
 * @author Shakall
 */
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {

        serialcom leitura = new serialcom("COM1:", 9600, 500);
        if (leitura.existePorta()) {
            leitura.ObterIdDaPorta();
            leitura.AbrirPorta();
            leitura.enviarComando("AT+GMM\r");
            leitura.FecharCom();
        } else {
            System.out.println("Porta não existe");
        }
    }
}
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package comandosat;

import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import javax.comm.CommPortIdentifier;
import javax.comm.SerialPort;
import javax.comm.SerialPortEvent;
import javax.comm.SerialPortEventListener;

/**
 *
 * @author Shakall
 */
public class serialcom implements SerialPortEventListener {

    String porta;
    int timeout;
    int bad;
    private CommPortIdentifier cp;
    private SerialPort serial;
    private InputStream entrada;
    private OutputStream saida;
    private String peso;
    private Enumeration list;
    private String comand;

    serialcom(String string, int i, int i0) {
        porta = string;//porta
        timeout = i0;//tempo
        bad = i;//velocidade da conexao
        list = CommPortIdentifier.getPortIdentifiers();//lista de portas disponiveis
    }

    void listarPortas() {
        while (list.hasMoreElements()) {
            System.out.println(((CommPortIdentifier) list.nextElement()).getName());//exibe lista de portas disponiveis
        }
    }

    boolean existePorta(String porta) {//verifica se a porta especificada por parametro esta disponivel
        while (list.hasMoreElements()) {
            if (((CommPortIdentifier) list.nextElement()).getName().equalsIgnoreCase(porta)) {
                return true;
            }
        }
        return false;
    }

    boolean existePorta() {//verifica se a porta passada no construtor está disponivel
        return existePorta(porta);
    }

    String AbrirPorta() {//abre a porta disponivel ou não
        if (cp != null) {
            try {
                serial = (SerialPort) cp.open(porta, timeout);
                serial.setSerialPortParams(bad, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
                serial.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);
                return "OK";
            } catch (Exception ex) {
            }
        }
        return "Erro ao criar porta";
    }

    void FecharCom() {//fechar porta
        try {
            if (entrada != null) {
                entrada.close();
            }
            if (saida != null) {
                saida.close();
            }
            if (serial != null) {
                serial.close();
            }
        } catch (Exception ex) {
        }
    }

    String LerResposta() {//le a resposta na porta serial
        if (serial != null) {
            try {
                entrada = serial.getInputStream();
                serial.addEventListener(this);
                serial.notifyOnDataAvailable(true);
                return "OK";
            } catch (Exception ex) {
            }
        }
        return "Porta Nao aberta";
    }

    String enviarComando(String comando) {//envia um comando para a porta
        comand = comando;
        if (serial != null) {
            try {
                LerResposta();
                saida = serial.getOutputStream();
                saida.write(comando.getBytes());
                Thread.sleep(100);
                saida.flush();
                Thread.sleep(100);
                return "Envio ok";
            } catch (Exception ex) {
            }
        }
        return "Não enviado, verifique a porta";
    }

    String ObterIdDaPorta() {//pega a porta especificada no construtor
        try {
            cp = CommPortIdentifier.getPortIdentifier(porta);
            if (cp == null) {
                return "erro ao obter porta";
            }
        } catch (Exception ex) {
        }
        return "ok";
    }

    public void serialEvent(SerialPortEvent ev) {//evento de quando existir uma resposta da porta
        StringBuffer buff = new StringBuffer();
        int novo = 0;
        switch (ev.getEventType()) {
            case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
                break;
            case SerialPortEvent.DATA_AVAILABLE: {
                try {
                    while ((novo = entrada.read()) > 0) {
                        buff.append((char) novo);
                    }
                    //if (buff.length() <= (comand.length() - 1) && !buff.substring(0, comand.length() - 1).equalsIgnoreCase(comand.substring(0, comand.length() - 1))) {
                        System.out.println("Retorno: " + buff.toString());
                    //}
                    break;
                } catch (Exception ex) {
                }
            }
            default:
        }
    }
}

O codigo para Desktop e Windows Mobile é identico, mudando apenas a biblioteca utilizada, para Desktop utilize a RXTX com as dll win32, em seus respectivos lugares, já para Windows mobile pegue a biblioteca RXTX WINCE, e instale ela no aparelho assim como sua dll no respectivo lugar.

Os imports serão alterados de acordo com qual biblioteca se for trabalhar, mas o codigo fica inalterado!

E

Olá Shakall.

entrei no site http://users.frii.com/jarvi/rxtx/index.html e não consegui achar a DLL para WinCE ou Windows Mobile.
Só achei as bibliotecas para MacOS, Linux e Win32.

Obrigada

S

Você já conseguiu rodar a versão desktop? Se não primeiro faz isso, é até um treinamento pra vc, não tenta direto no PDA que vai ser mais complicado!

Olha só, pesquisando no google com o termo “RXTX Windows Mobile” no segundo site que aparece, ta lá explicando detalhadinho como usar o RXTX no Windows mobile e o link para download da Biblioteca, era só dar uma procurada!

http://www.google.com.br/search?hl=pt-BR&source=hp&q=RXTX+windows+mobile&meta=&aq=f&oq=
http://prt.fernuni-hagen.de/~bischoff/wince/Andreas_WINCE_Jornada_stuff.html
http://mho.republika.pl/java/comm/RXTX_iPAQ_0211.zip

Simples.

E

Olá!

Shakall:
Você já conseguiu rodar a versão desktop? Se não primeiro faz isso, é até um treinamento pra vc, não tenta direto no PDA que vai ser mais complicado!

Olha só, pesquisando no google com o termo “RXTX Windows Mobile” no segundo site que aparece, ta lá explicando detalhadinho como usar o RXTX no Windows mobile e o link para download da Biblioteca, era só dar uma procurada!

http://www.google.com.br/search?hl=pt-BR&source=hp&q=RXTX+windows+mobile&meta=&aq=f&oq=
http://prt.fernuni-hagen.de/~bischoff/wince/Andreas_WINCE_Jornada_stuff.html
http://mho.republika.pl/java/comm/RXTX_iPAQ_0211.zip

Simples.

Procurar eu procurei… estou tentando fazer isso desde o mês de Julho :frowning: . E, infelizmente não está funcionando no pocket, por isso deixei essa parte para depois e parti para outras coisas no projeto.

Obrigada por postar o código e os links aqui. Vou ver se consigo fazer e qualquer coisa eu posto o meu código aqui.

Até mais

S

Já fez funcionar no Desktop?

E

Ainda não funcionou :shock: :frowning: :cry:

E

Olá!!
Funcionou no Windows, mas no pocket não está funcionando, acredito que seja porque a minha máquina virtual Java não esteja conseguindo ler o arquivo javax.comm.properties.
Deu esse erro:

Error loading SolarisSerial: java.lang.UnsatisfiedLinkError: Native library 'SolarisSerialParallel' not found (as file 'SolarisSerialParallel') in gnu.classpath.boot.library and java.library.path Caught java.lang./unsatisfiedLinkError: com/sun/comm/SolarisDriver.readRegistrySerial while loading driver com.sun.comm.SolarisDriver JVM Exit

Eu fiz tudo certinho do jeito que mandava o arquivo INSTALL.TXT do site http://prt.fernuni-hagen.de/~bischoff/wince/Andreas_WINCE_Jornada_stuff.html:
Coloquei os arquivos comm.jar e jcl.jar no classpath da minha aplicação; coloquei o arquivo rxtxSerial.dll no diretório /Windows/; e coloquei o arquivo javax.comm.properties no diretório \Program Files\Mysaifu JVM\jre\lib.

Estou usando a Mysaifu JVM.
Obrigada

S

Onde vc colocou as dll no windows mobile e o seu javax.comm.properties?

E

sim…
coloquei a DLL no diretório /Windows e o javax.comm.properties foi colocado no diretório jre da Mysaifu JVM.
Pelo que eu andei vendo nos sites, esse RXTX não vai funcionar com a JVM Mysaifu… somente com Jeode JVM.

Vou ver se consigo usar seu código e suas dicas usando o javax.comm do site Mysaifu JVM http://sourceforge.jp/projects/mysaifujvm/releases/34835.
Qualquer coisa eu posto aqui o resultado!

Obrigada

E

Shakall, vc é muito gente fina!
Obrigada mesmo!

Consegui alguns progressos aqui: achei a porta serial (COM3: que é infravermelho) e consegui enviar alguns dados. Consegui fazer a discagem usando o seu código como base.

Eu fiz assim: baixei o Java Communications API para Mysaifu JVM http://sourceforge.jp/projects/mysaifujvm/releases/34835. Descompactei o arquivo e coloquei a DLL (javaxcomm.dll) na pasta jre/bin e o arquivo javaxcomm.jar na pasta jre/lib/ext.
Coloquei tbem o JAR no classpath do meu projeto.

Não sei porque funcionou agora, depois de tantas tentativas :? … acho que deve ser porque o código que eu estava fazendo antes estava com algum erro :\

Obrigada mesmo, shakall pela ajuda e pela paciência.
A discagem ainda não saiu completamente, mas vou postar o código aqui quando sair.

Até mais

S

OK eu estou utilizando a J9 da IBM, vc tem que colocar o dll e o properties dentro do bin da sua jvm

E

Realmente… era a JVM o problema! coloquei a J9 e funcionou…
Mas como estou usando a Mysaifu JVM, eu tive que baixar a JavaCommunications API da própria Mysaifu.

Obrigada Shakall, problema resolvido!

Criado 25 de novembro de 2009
Ultima resposta 1 de dez. de 2009
Respostas 15
Participantes 3