Comandos AT

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!

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.

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

até mais

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

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

[code]/*

  • 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”);
      }
      }
      }
      [/code]

[code]/*

  • 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:
    }
    }
    }
    [/code]

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!

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

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.

Olá!

[quote=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.[/quote]

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

Já fez funcionar no Desktop?

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

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

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

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

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

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

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!