Envio de mensagem para celular

6 respostas
hpsjr

Caros,
estou tentando desenvolver um sistema em java que permita que eu envia uma mensagem para um celula.
Estou conectando um celular na porta USB(com7) que servirá de ponte para que as mensagens sejam encaminhadas a outros celulares.
Quando envio o primeiro comando para a porta o programa trava no local.
Aparentemente dá impressão a porta está sendo utilizada por outro programa e por isto que não responde ao comando enviado.
Segue o código desenvolvido para teste, para ver se alguém consegue resolver o meu problema.

public class SerialUtil {   
  
    private Integer bitsPorSegundos; 
    private CommConnection comm;
       
    public SerialUtil() {   
        //this.bitsPorSegundos = 19200;
    	this.bitsPorSegundos = 460800;
    }   
       
    public void sendSMS(String port, String mensagem, Integer numero) throws SerialException { 
        StringBuilder command = new StringBuilder();
        SerialPort sp = this.open(port);
        this.close(sp);
        sp = this.open(port);
        try{
        	command= new StringBuilder("AT\n");
	        this.sendMessage(sp, command.toString());
	        Thread.sleep(1000);
	        command=new StringBuilder("AT+CMGF=1\n");
	        this.sendMessage(sp, command.toString());
	        Thread.sleep(1000);
	        command=new StringBuilder("AT+CMGS=\"+"+numero+"\"\n");
	        this.sendMessage(sp, command.toString());
	        Thread.sleep(1000);
	        command=new StringBuilder("Teste de envio de mensagem"+(char)26);   
	        this.sendMessage(sp, command.toString());   
        }catch (Exception e) {
			// TODO: handle exception
		}   
        this.close(sp);   
    }   
       
    public void sendMessage(SerialPort port, String message) throws SerialException {   
        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.getMessage());   
        } catch (InterruptedException e) {   
            throw new SerialException("A porta " + port.getName() + " não foi encontrada. " + e.getMessage());   
        }   
    }   
       
    public void close(SerialPort port) {   
        port.close();   
    }   
  
    public SerialPort open(String port) throws SerialException {   
  
        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.getMessage());   
        } catch (PortInUseException e) {   
            throw new SerialException("A porta " + port + " já está em uso. " + e.getMessage());   
        } catch (UnsupportedCommOperationException e) {   
            throw new SerialException("A porta " + port + " não suporta esta operação " + e.getMessage());   
        }   
        return null;   
    }   

    
    public static void main(String[] args) throws SerialException {  
    	String ports = "COM7";
    	new SerialUtil().sendSMS(ports, "teste de envio de mensagem", 99963369);
    }   
}

6 Respostas

Carlos_ds_jar
hpsjr:
Caros, estou tentando desenvolver um sistema em java que permita que eu envia uma mensagem para um celula. Estou conectando um celular na porta USB(com7) que servirá de ponte para que as mensagens sejam encaminhadas a outros celulares. Quando envio o primeiro comando para a porta o programa trava no local. Aparentemente dá impressão a porta está sendo utilizada por outro programa e por isto que não responde ao comando enviado. Segue o código desenvolvido para teste, para ver se alguém consegue resolver o meu problema.
public class SerialUtil {   
  
    private Integer bitsPorSegundos; 
    private CommConnection comm;
       
    public SerialUtil() {   
        //this.bitsPorSegundos = 19200;
    	this.bitsPorSegundos = 460800;
    }   
       
    public void sendSMS(String port, String mensagem, Integer numero) throws SerialException { 
        StringBuilder command = new StringBuilder();
        SerialPort sp = this.open(port);
        this.close(sp);
        sp = this.open(port);
        try{
        	command= new StringBuilder("AT\n");
	        this.sendMessage(sp, command.toString());
	        Thread.sleep(1000);
	        command=new StringBuilder("AT+CMGF=1\n");
	        this.sendMessage(sp, command.toString());
	        Thread.sleep(1000);
	        command=new StringBuilder("AT+CMGS=\"+"+numero+"\"\n");
	        this.sendMessage(sp, command.toString());
	        Thread.sleep(1000);
	        command=new StringBuilder("Teste de envio de mensagem"+(char)26);   
	        this.sendMessage(sp, command.toString());   
        }catch (Exception e) {
			// TODO: handle exception
		}   
        this.close(sp);   
    }   
       
    public void sendMessage(SerialPort port, String message) throws SerialException {   
        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.getMessage());   
        } catch (InterruptedException e) {   
            throw new SerialException("A porta " + port.getName() + " não foi encontrada. " + e.getMessage());   
        }   
    }   
       
    public void close(SerialPort port) {   
        port.close();   
    }   
  
    public SerialPort open(String port) throws SerialException {   
  
        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.getMessage());   
        } catch (PortInUseException e) {   
            throw new SerialException("A porta " + port + " já está em uso. " + e.getMessage());   
        } catch (UnsupportedCommOperationException e) {   
            throw new SerialException("A porta " + port + " não suporta esta operação " + e.getMessage());   
        }   
        return null;   
    }   

    
    public static void main(String[] args) throws SerialException {  
    	String ports = "COM7";
    	new SerialUtil().sendSMS(ports, "teste de envio de mensagem", 99963369);
    }   
}
Ola chapa!

Numa primeira observação creio que o seu código está correto, com relação ao seu problema eu penso o seguinte: Se vc está usando um cabo serial conectado com o Nokia vc provavelmente deve ter instalado no mínimo dois softwares o nokia conecting cable driver e o nokia pc suite, nesse cenário que vc se encontra talvez o nokia pc suite deve estar ocupando a porta serial e por isso a sua aplicação não esteja conseguindo se comunicar, por isso desinstale o nokia pc suite e deixe somente o cable driver.

Qualquer coisa dá um grito aí! 8)

hpsjr

Olá Carlos_ds_jar,
eu já tinha desinstalado o nokia pc suite e mesmo assim não consigo enviar a mensagem.
Quando vou enviar a mensagem através do HyperTerminal do windows, estou conseguindo.

Carlos_ds_jar

hpsjr:
Olá Carlos_ds_jar,
eu já tinha desinstalado o nokia pc suite e mesmo assim não consigo enviar a mensagem.
Quando vou enviar a mensagem através do HyperTerminal do windows, estou conseguindo.

Caro HP, sinceramente não estou conseguindo observar problema nenhum que impossibilite o envio da mensagem na situação que vc está me passando, de qualquer maneira eu passei por um problema semelhante quando estava desenvolvendo a minha aplicação que utiliza esse recurso de maneira que somente consegui enviar a mensagem quando passei o número de telefone completo por exemplo: em vez de “99963369” usei “0418899963369” e acabou dando certo.

Além disso algumas questões ainda merecem ser lentadas:

  • Tem certeza que o cabo está ligado nessa porta?

  • Qual é o modelo de cabo serial que está usando?

  • O seu celular tem créditos?

  • Tem certeza que não há nenhum serviço do software da nokia que ainda esteja rodando?

  • O hyperterminal do windows está fechado no momento que tenta executar essa aplicação?

Qualquer coisa dá outro grito aí! 8)

ricoldi

Se esta funcionando com o hiperterminal ele deve estar conectando no lugar certo. (MAS O QUE ESTOU NO HIPERTERMINAL?)

Ele disse no inicio que esta usando USB.

Isso nao travaria a execucao do programa.

No HiperTerminal funciona, entao o problema esta no codigo dele.

Se ele disse que funciona, “fechar” nao faz parte de um “conseguindo”.

So pode ser no seu codigo mesmo, ja fiz funcionar e posso ver isso para voce amanha. Abracos e vai brincando ai que serve pra ficar esperto…

Desculpem a falta de acento mas ainda nao consegui configurar esse teclado maldito… (Nao acho a classe certa dele, rs…)

Abracos,
Ricoldi

hpsjr

Caros,
desde já gradeço o apoio que vocês estão me dando.
Com relação ao questionamento feito antes:

  • O cabo está conectado sim.
  • A porta que esto usando é a USB
  • O celular tem crédito sim
  • Como verifiquei nenhum outro software está utilizando a porta, a não ser o própio driver do celular.
  • Antes de executar o programa eu fecho sempre o hyperterminal.

Não sei se realmente é algum outro programa que está travando a execução ou se o código está errado. Não sei nem se realmente é possivel enviar a mensagem desta forma.
Ricoldi se você conseguir identificar algo de errado me avisa.

Valeu!

ricoldi

Me desculpe. fiquei com preguiça de testar seu código mas só de bater o olho vi que esta dando somente um "\n" e até onde eu saiba é "\r\n" para validar um "enter" talvez esteja travando por isso, ele ainda esta esperando você terminar de digitar o comando. Teste definindo que no fim dos comandos envie um "\r\n", confira suas sintaxes de comandos pois me parece irregular.

Peguei a minha classe de comunicação com o modem para servir de base.

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

import banco.centralsms.objetos.ModemsTbl;

import gnu.io.SerialPort;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import log.Log;
import xml.Mensagem;

/**
 *
 * @author ricoldi
 */
public class ModemSerial {

    private static final String ENTER = "\r\n";
    private SerialPort porta;
    private ModemsTbl dados;

    public ModemSerial(SerialPort porta) throws Exception {
        this.porta = porta;
        setEco("0");
    }

    public ModemsTbl getDados() {
        return dados;
    }

    public void setDados(ModemsTbl dados) {
        this.dados = dados;
    }

    private void comandoEnviar(String _comando) throws IOException {
        OutputStream saida = porta.getOutputStream();
        saida.write(_comando.getBytes());
        try {
            Thread.sleep(1000);
        } catch (Exception e) {
        }
    }

    private String comandoReceber() throws IOException {
        int timeout = 10;

        InputStream entrada = porta.getInputStream();
        StringBuilder resposta = new StringBuilder();

        byte[] buffer;
        int tamanho = 0;
        while (timeout > 0 || ((tamanho = entrada.available()) > 0)) {

            if (tamanho > 0) {
                buffer = new byte[tamanho];
                entrada.read(buffer);
                resposta.append(new String(buffer).trim());
            } else {
                if (timeout > 0) {
                    timeout--;
                    try {
                        Thread.sleep(10);
                    } catch (Exception e) {
                    }
                } else {
                    throw new IOException("TIMEOUT AO RECEBER COMANDO");
                }
            }
        }

        try {
            Thread.sleep(1000);
        } catch (Exception e) {
        }

        return resposta.toString();
    }

    public boolean setEco(String tipo) throws Exception {
        synchronized (this) {
            comandoEnviar("ATE" + tipo + ENTER);
            return comandoReceber().contains("OK");
            
        }
    }

    public String getImei() throws Exception {
        synchronized (this) {
            comandoEnviar("AT+CGSN" + ENTER);
            String imei = comandoReceber();
            imei = imei.substring(imei.indexOf("\"") + 1, imei.lastIndexOf("\""));
            return imei;
        }
    }

    public String getSinal() {
        synchronized (this) {
            try {
                comandoEnviar("AT+CSQ" + ENTER);
                String resposta = comandoReceber();
                resposta = resposta.substring(resposta.indexOf(": ") + 1, resposta.indexOf("OK")).trim();
                return resposta;
            } catch (Exception e) {
                Log.escreveLog(e);
            }
            return "<Erro>";
        }
    }

    public boolean deletarTodas() {
        synchronized (this) {
            try {

                comandoEnviar("AT+CMGD=1,4" + ENTER);
                return comandoReceber().toUpperCase().contains("OK");
            } catch (Exception e) {
                Log.escreveLog(e);
            }
            return false;
        }
    }

    public boolean modoTexto() {
        synchronized (this) {
            try {
                comandoEnviar("AT+CMGF=1" + ENTER);
                return comandoReceber().toUpperCase().contains("OK");
            } catch (Exception e) {
                e.printStackTrace();
            }
            return false;
        }
    }

    public boolean enviaSMS(String numero, String mensagem) {
        if (numero == null || numero.length() == 0) {
            return false;
        }

        if (mensagem == null || mensagem.length() == 0) {
            return false;
        }

        synchronized (this) {
            try {

                mensagem = retiraAcentos(mensagem);
                mensagem = mensagem.replaceAll("\n", " ");
                mensagem = mensagem.replaceAll("\r", " ");

                ArrayList<String> msgs = split(mensagem, 140);
                String msgShort;
                String contador;
                for (int cont = 0; cont < msgs.size(); cont++) {
                    if (msgs.size() > 1) {
                        contador = " - [" + (cont + 1) + "/" + msgs.size() + "]";
                    } else {
                        contador = "";
                    }
                    msgShort = msgs.get(cont) + contador;

                    comandoEnviar("AT+CMGS=\"" + numero + "\"\r");
                    comandoEnviar(msgShort + "\032\r");
                    Log.escreveLog("Modem: envio para modem: " + numero + "<" + msgShort + ">");

                    try {
                        Thread.sleep(10000);
                    } catch (Exception e) {
                    }
                    msgShort = comandoReceber();
                    Log.escreveLog("Modem: envio do modem: <" + msgShort + ">");

                    if (!msgShort.toUpperCase().contains("OK")) {
                        return false;
                    }
                }

                return true;

            } catch (Exception e) {
                Log.escreveLog(e);
            }
            return false;
        }
    }

    private String retiraAcentos(String _texto) {
        String retirar = "ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜàáâãäåçèéêëìíîïòóôõöùúûüñÑ";
        String substituir = "AAAAAACEEEEIIIIOOOOOUUUUaaaaaaceeeeiiiiooooouuuunN";

        int cont = 0;
        while (cont < retirar.length()) {
            _texto = _texto.replace(retirar.charAt(cont), substituir.charAt(cont));
            cont++;
        }
        return _texto;
    }

    private ArrayList<String> split(String mensagem, int max) {
        ArrayList<String> mensagens = new ArrayList<String>();

        String[] palavras = mensagem.split(" ");
        String subMensagem = "";
        int cont = 0;
        while (cont < palavras.length) {
            if ((subMensagem.length() + palavras[cont].length()) < max) {
                subMensagem += palavras[cont] + " ";
                cont++;
            } else {
                if (subMensagem.length() > 0) {
                    mensagens.add(subMensagem.trim());
                    subMensagem = "";
                }
                if (palavras[cont].length() >= max) {
                    mensagens.add(palavras[cont].substring(0, max));
                    subMensagem = "";
                    palavras[cont] = palavras[cont].substring(max);
                }
            }
        }

        if (subMensagem.length() > 0) {
            mensagens.add(subMensagem.trim());
        }

        return mensagens;
    }

    public ArrayList<Mensagem> recebeSMS() {
        synchronized (this) {
            try {

                ArrayList<Mensagem> mensagens = new ArrayList<Mensagem>();

                comandoEnviar("AT+CMGL=\"REC UNREAD\"" + ENTER);
                try {
                    Thread.sleep(10000);
                } catch (Exception e) {
                }
                String recebido = comandoReceber();

                recebido = recebido.trim();

                if (recebido.length() > 0) {

                    Log.escreveLog("Modem: recebido: <" + recebido + ">");

                    Mensagem mensagem;
                    String[] cmgl = recebido.split("CMGL");
                    String[] virgula;
                    String[] msgarray;
                    String msgtxt;
                    int negativo;
                    for (int cont = 0; cont < cmgl.length; cont++) {
                        cmgl[cont] = cmgl[cont].trim();
                        if (!cmgl[cont].equalsIgnoreCase("ok")) {
                            try {
                                if (cmgl[cont].contains(",")) {
                                    virgula = cmgl[cont].split(",");
                                    if ((virgula[1].equalsIgnoreCase("\"REC UNREAD\"")) && (virgula[2].length() > 5)) {
                                        mensagem = new Mensagem();
                                        mensagem.setDestinatario(String.valueOf(dados.getNumero()));

                                        if (virgula[2].startsWith("55") && virgula[2].length() == 12) {
                                            virgula[2] = virgula[2].substring(2);

                                        }

                                        mensagem.setRemetente(virgula[2].replaceAll("\"", "").substring(1));
                                        mensagem.setData(virgula[4].replaceAll("\"", ""));
                                        msgarray = virgula[5].split("\"");

                                        msgarray[0] = msgarray[0].replaceAll("\"", "");
                                        negativo = msgarray[0].indexOf("-");
                                        if (negativo > 0) {
                                            msgarray[0] = msgarray[0].substring(0, negativo);
                                        }
                                        mensagem.setHora(msgarray[0]);

                                        msgtxt = "";
                                        if (msgarray.length > 1) {
                                            for (int cont3 = 1; cont3 < msgarray.length; cont3++) {
                                                msgtxt += msgarray[cont3].replaceFirst("\r", "");
                                            }
                                        }
                                        if (virgula.length > 6) {
                                            for (int cont4 = 6; cont < virgula.length; cont++) {
                                                msgtxt += msgarray[cont4];
                                            }
                                        }
                                        if (cont + 1 == cmgl.length) {
                                            if (msgtxt.endsWith("OK")) {
                                                msgtxt = msgtxt.substring(0, msgtxt.length() - 2);
                                            }
                                        } else {
                                            if (msgtxt.endsWith("+")) {
                                                msgtxt = msgtxt.substring(0, msgtxt.length() - 1);
                                            }

                                        }
                                        mensagem.setMensagem(msgtxt.trim());
                                        mensagens.add(mensagem);

                                    }
                                }
                            } catch (Exception e) {
                                Log.escreveLog(e);
                            }

                        }
                    }

                }
                return mensagens;
            } catch (Exception e) {
                Log.escreveLog(e);
            }
            return null;
        }

    }
}

Abraços,
Ricoldi

Criado 20 de outubro de 2010
Ultima resposta 25 de out. de 2010
Respostas 6
Participantes 3