Comandos AT, SMS, Serial e Java o.O

7 respostas
M

Amigos,

Eu estou criando uma rotina que conecta na porta serial virtual COM40 que é uma conexão bluetooth com meu celular.

Estou tentando enviar uma mensagem de SMS via java, mas não estou conseguindo.

Faço os testes via hyperterminal e rola numa boa, mas qdo tento no java, não dá exceção nenhuma mas tb não envia.

Alguém poderia me ajudar?

Ps.: Estou usando a lib RXTX

package cc.marcio.serial.util;

import gnu.io.CommPort;
import gnu.io.CommPortIdentifier;
import gnu.io.NoSuchPortException;
import gnu.io.PortInUseException;
import gnu.io.SerialPort;
import gnu.io.UnsupportedCommOperationException;

import java.io.IOException;
import java.io.OutputStream;

/**
 * <b>Description:</b> TODO: Add here the class description
 * 
 * @author <a href="mailto:[email removido]">Márcio Alves Barroso</a>
 * @since 03/10/2008 15:50:53
 * @version 0.1
 */
public class SerialUtil {

	private Integer bitsPorSegundos;
	
	public SerialUtil() {
		this.bitsPorSegundos = 19200;
	}
	
	public void sendSMS(String port, String mensagem, Integer numero) {
		StringBuilder command = new StringBuilder();
		command.append("AT\n");
		command.append("AT+CMGF=1\n");
		command.append("AT+CMGS=\"+"+numero+"\"\n");
		command.append("Teste de envio de mensagem"+(char)26);
		SerialPort sp = this.open(port);
		this.sendMessage(sp, command.toString());
		this.close(sp);
	}
	
	public void sendMessage(SerialPort port, String message) {
		OutputStream os;
		try {
			os = port.getOutputStream();
			os.write(message.getBytes());
			Thread.sleep(100);
			os.flush();
		} catch (IOException e) {
			throw new SerialException("A porta " + port.getName() + " não está acessível para escrita.", e);
		} catch (InterruptedException e) {
			throw new SerialException("A porta " + port.getName() + " não foi encontrada.", e);
		}
	}
	
	public void close(SerialPort port) {
		port.close();
	}

	public SerialPort open(String port) {

		try {
			CommPortIdentifier portIdentifier = CommPortIdentifier
					.getPortIdentifier(port);
			if (portIdentifier.isCurrentlyOwned()) {
				System.out.println("Error: Port is currently in use");
			} else {
				CommPort commPort = portIdentifier.open(this.getClass().getName(), 2000);

				if (commPort instanceof SerialPort) {
					SerialPort serialPort = (SerialPort) commPort;
					serialPort.setSerialPortParams(	this.bitsPorSegundos,
													SerialPort.DATABITS_8, 
													SerialPort.STOPBITS_1,
													SerialPort.PARITY_NONE);
					serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);

					return serialPort;
					
				} else {
					throw new SerialException("Esta implementação suporta somente conexão com portas serial");
				}
			}

		} catch (NoSuchPortException e) {
			throw new SerialException("A porta " + port + " não foi encontrada.", e);
		} catch (PortInUseException e) {
			throw new SerialException("A porta " + port + " já está em uso.", e);
		} catch (UnsupportedCommOperationException e) {
			throw new SerialException("A porta " + port + " não suporta esta operação", e);
		} 
		return null;
	}

	public static void main(String[] args) {
		new SerialUtil().sendSMS("COM40", "teste de envio de mensagem", 86742075);
	}
}

7 Respostas

P

Qual Modelo do SIM que voce está usando ?

M

É um Tim de 128kb
Tem um monte de números nele.

8955
0311
9086
3939
B211

Isso ajuda de alguma forma?

A

retorna algum erro? já tentou fazer uma leitura dos dados recebidos pelo modem? tipo um inputstream ???

C

Marcio, você conseguiu obter resposta do seu dispositivo?

J

Marcio,

o seu método sendSms está enviando uma string de uma vez para o modem. Não é assim que funciona com comandos AT.
por exemplo vc envia um comando AT vc tem que esperar a resposta, isso as vezes demora um pouco, como vc esta enviando tudo de
uma vez acredito que o modem não esta entendendo.
para debug faz o seguinte: envia um comando AT de cada vez. então dá um delay de 1 segundo e envia o outro comando.
se não funcionar verifica a sua rotina serial. mas vc tem que tratar a resposta que vc recebe quando envia o comando AT.

boa sorte.

sds

j.silvestre

C

Eu envio o comando AT para o serial mas ele não me retorna nada, o que pode ser?

D

Bom dia,

Primeiro faça um teste de comunicação com o modem enviando o comando AT+(CR+LF) e aguarde a resposta
de OK do MODEM. Caso o modem não responda podemos pensar nas seguintes causas:

1 ) O Modem está com um bountrate diferente do configurado na classe java serial
2 ) O Modem pode estar configurado para não ter fluxo de controle por hardware/software
3 ) Verifique se o cabo serial está funcionando OK fechando o circuito do RXTX e verificando se a string enviada é a mesma da resposta.

Caso nenhum destes testes tenha resultado positivo, pode ser um problema com o MODEM, mas é claro que
podem haver diversas causas, mas tente explorar todas as alternativas possíveis, ai sim poste os resultados.

Abs

Criado 3 de outubro de 2008
Ultima resposta 8 de nov. de 2014
Respostas 7
Participantes 6