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.
publicclassSerialUtil{privateIntegerbitsPorSegundos;privateCommConnectioncomm;publicSerialUtil(){//this.bitsPorSegundos = 19200;this.bitsPorSegundos=460800;}publicvoidsendSMS(Stringport,Stringmensagem,Integernumero)throwsSerialException{StringBuildercommand=newStringBuilder();SerialPortsp=this.open(port);this.close(sp);sp=this.open(port);try{command=newStringBuilder("AT\n");this.sendMessage(sp,command.toString());Thread.sleep(1000);command=newStringBuilder("AT+CMGF=1\n");this.sendMessage(sp,command.toString());Thread.sleep(1000);command=newStringBuilder("AT+CMGS=\"+"+numero+"\"\n");this.sendMessage(sp,command.toString());Thread.sleep(1000);command=newStringBuilder("Teste de envio de mensagem"+(char)26);this.sendMessage(sp,command.toString());}catch(Exceptione){// TODO: handle exception}this.close(sp);}publicvoidsendMessage(SerialPortport,Stringmessage)throwsSerialException{OutputStreamos;try{os=port.getOutputStream();os.write(message.getBytes());Thread.sleep(100);os.flush();}catch(IOExceptione){thrownewSerialException("A porta "+port.getName()+" não está acessível para escrita. "+e.getMessage());}catch(InterruptedExceptione){thrownewSerialException("A porta "+port.getName()+" não foi encontrada. "+e.getMessage());}}publicvoidclose(SerialPortport){port.close();}publicSerialPortopen(Stringport)throwsSerialException{try{CommPortIdentifierportIdentifier=CommPortIdentifier.getPortIdentifier(port);if(portIdentifier.isCurrentlyOwned()){System.out.println("Error: Port is currently in use");}else{CommPortcommPort=portIdentifier.open(this.getClass().getName(),2000);if(commPortinstanceofSerialPort){SerialPortserialPort=(SerialPort)commPort;serialPort.setSerialPortParams(this.bitsPorSegundos,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);returnserialPort;}else{thrownewSerialException("Esta implementação suporta somente conexão com portas serial");}}}catch(NoSuchPortExceptione){thrownewSerialException("A porta "+port+" não foi encontrada. "+e.getMessage());}catch(PortInUseExceptione){thrownewSerialException("A porta "+port+" já está em uso. "+e.getMessage());}catch(UnsupportedCommOperationExceptione){thrownewSerialException("A porta "+port+" não suporta esta operação "+e.getMessage());}returnnull;}publicstaticvoidmain(String[]args)throwsSerialException{Stringports="COM7";newSerialUtil().sendSMS(ports,"teste de envio de mensagem",99963369);}}
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.
publicclassSerialUtil{privateIntegerbitsPorSegundos;privateCommConnectioncomm;publicSerialUtil(){//this.bitsPorSegundos = 19200;this.bitsPorSegundos=460800;}publicvoidsendSMS(Stringport,Stringmensagem,Integernumero)throwsSerialException{StringBuildercommand=newStringBuilder();SerialPortsp=this.open(port);this.close(sp);sp=this.open(port);try{command=newStringBuilder("AT\n");this.sendMessage(sp,command.toString());Thread.sleep(1000);command=newStringBuilder("AT+CMGF=1\n");this.sendMessage(sp,command.toString());Thread.sleep(1000);command=newStringBuilder("AT+CMGS=\"+"+numero+"\"\n");this.sendMessage(sp,command.toString());Thread.sleep(1000);command=newStringBuilder("Teste de envio de mensagem"+(char)26);this.sendMessage(sp,command.toString());}catch(Exceptione){// TODO: handle exception}this.close(sp);}publicvoidsendMessage(SerialPortport,Stringmessage)throwsSerialException{OutputStreamos;try{os=port.getOutputStream();os.write(message.getBytes());Thread.sleep(100);os.flush();}catch(IOExceptione){thrownewSerialException("A porta "+port.getName()+" não está acessível para escrita. "+e.getMessage());}catch(InterruptedExceptione){thrownewSerialException("A porta "+port.getName()+" não foi encontrada. "+e.getMessage());}}publicvoidclose(SerialPortport){port.close();}publicSerialPortopen(Stringport)throwsSerialException{try{CommPortIdentifierportIdentifier=CommPortIdentifier.getPortIdentifier(port);if(portIdentifier.isCurrentlyOwned()){System.out.println("Error: Port is currently in use");}else{CommPortcommPort=portIdentifier.open(this.getClass().getName(),2000);if(commPortinstanceofSerialPort){SerialPortserialPort=(SerialPort)commPort;serialPort.setSerialPortParams(this.bitsPorSegundos,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);returnserialPort;}else{thrownewSerialException("Esta implementação suporta somente conexão com portas serial");}}}catch(NoSuchPortExceptione){thrownewSerialException("A porta "+port+" não foi encontrada. "+e.getMessage());}catch(PortInUseExceptione){thrownewSerialException("A porta "+port+" já está em uso. "+e.getMessage());}catch(UnsupportedCommOperationExceptione){thrownewSerialException("A porta "+port+" não suporta esta operação "+e.getMessage());}returnnull;}publicstaticvoidmain(String[]args)throwsSerialException{Stringports="COM7";newSerialUtil().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. */packagemodems;importbanco.centralsms.objetos.ModemsTbl;importgnu.io.SerialPort;importjava.io.IOException;importjava.io.InputStream;importjava.io.OutputStream;importjava.util.ArrayList;importlog.Log;importxml.Mensagem;/** * * @author ricoldi */publicclassModemSerial{privatestaticfinalStringENTER="\r\n";privateSerialPortporta;privateModemsTbldados;publicModemSerial(SerialPortporta)throwsException{this.porta=porta;setEco("0");}publicModemsTblgetDados(){returndados;}publicvoidsetDados(ModemsTbldados){this.dados=dados;}privatevoidcomandoEnviar(String_comando)throwsIOException{OutputStreamsaida=porta.getOutputStream();saida.write(_comando.getBytes());try{Thread.sleep(1000);}catch(Exceptione){}}privateStringcomandoReceber()throwsIOException{inttimeout=10;InputStreamentrada=porta.getInputStream();StringBuilderresposta=newStringBuilder();byte[]buffer;inttamanho=0;while(timeout>0||((tamanho=entrada.available())>0)){if(tamanho>0){buffer=newbyte[tamanho];entrada.read(buffer);resposta.append(newString(buffer).trim());}else{if(timeout>0){timeout--;try{Thread.sleep(10);}catch(Exceptione){}}else{thrownewIOException("TIMEOUT AO RECEBER COMANDO");}}}try{Thread.sleep(1000);}catch(Exceptione){}returnresposta.toString();}publicbooleansetEco(Stringtipo)throwsException{synchronized(this){comandoEnviar("ATE"+tipo+ENTER);returncomandoReceber().contains("OK");}}publicStringgetImei()throwsException{synchronized(this){comandoEnviar("AT+CGSN"+ENTER);Stringimei=comandoReceber();imei=imei.substring(imei.indexOf("\"")+1,imei.lastIndexOf("\""));returnimei;}}publicStringgetSinal(){synchronized(this){try{comandoEnviar("AT+CSQ"+ENTER);Stringresposta=comandoReceber();resposta=resposta.substring(resposta.indexOf(": ")+1,resposta.indexOf("OK")).trim();returnresposta;}catch(Exceptione){Log.escreveLog(e);}return"<Erro>";}}publicbooleandeletarTodas(){synchronized(this){try{comandoEnviar("AT+CMGD=1,4"+ENTER);returncomandoReceber().toUpperCase().contains("OK");}catch(Exceptione){Log.escreveLog(e);}returnfalse;}}publicbooleanmodoTexto(){synchronized(this){try{comandoEnviar("AT+CMGF=1"+ENTER);returncomandoReceber().toUpperCase().contains("OK");}catch(Exceptione){e.printStackTrace();}returnfalse;}}publicbooleanenviaSMS(Stringnumero,Stringmensagem){if(numero==null||numero.length()==0){returnfalse;}if(mensagem==null||mensagem.length()==0){returnfalse;}synchronized(this){try{mensagem=retiraAcentos(mensagem);mensagem=mensagem.replaceAll("\n"," ");mensagem=mensagem.replaceAll("\r"," ");ArrayList<String>msgs=split(mensagem,140);StringmsgShort;Stringcontador;for(intcont=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(Exceptione){}msgShort=comandoReceber();Log.escreveLog("Modem: envio do modem: <"+msgShort+">");if(!msgShort.toUpperCase().contains("OK")){returnfalse;}}returntrue;}catch(Exceptione){Log.escreveLog(e);}returnfalse;}}privateStringretiraAcentos(String_texto){Stringretirar="ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜàáâãäåçèéêëìíîïòóôõöùúûüñÑ";Stringsubstituir="AAAAAACEEEEIIIIOOOOOUUUUaaaaaaceeeeiiiiooooouuuunN";intcont=0;while(cont<retirar.length()){_texto=_texto.replace(retirar.charAt(cont),substituir.charAt(cont));cont++;}return_texto;}privateArrayList<String>split(Stringmensagem,intmax){ArrayList<String>mensagens=newArrayList<String>();String[]palavras=mensagem.split(" ");StringsubMensagem="";intcont=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());}returnmensagens;}publicArrayList<Mensagem>recebeSMS(){synchronized(this){try{ArrayList<Mensagem>mensagens=newArrayList<Mensagem>();comandoEnviar("AT+CMGL=\"REC UNREAD\""+ENTER);try{Thread.sleep(10000);}catch(Exceptione){}Stringrecebido=comandoReceber();recebido=recebido.trim();if(recebido.length()>0){Log.escreveLog("Modem: recebido: <"+recebido+">");Mensagemmensagem;String[]cmgl=recebido.split("CMGL");String[]virgula;String[]msgarray;Stringmsgtxt;intnegativo;for(intcont=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=newMensagem();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(intcont3=1;cont3<msgarray.length;cont3++){msgtxt+=msgarray[cont3].replaceFirst("\r","");}}if(virgula.length>6){for(intcont4=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(Exceptione){Log.escreveLog(e);}}}}returnmensagens;}catch(Exceptione){Log.escreveLog(e);}returnnull;}}}