Comandos AT, SMS, Serial e Java o.O

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:marciobarroso@gmail.com">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);
	}
}

Qual Modelo do SIM que voce está usando ?

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

8955
0311
9086
3939
B211

Isso ajuda de alguma forma?

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

Marcio, você conseguiu obter resposta do seu dispositivo?

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

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

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