Como ler sms de gsm usando java comm?
-
27-10-2019 - |
Pergunta
Eu encontrei projeto de código livre para enviar sms usando java comm: http://code.google.com/ p / encontrar-ur-pal / fonte / browse / src /? r = 21
Função enviando olhares sms assim:
public void run(){
boolean timeOut=false;
long startTime=(new Date()).getTime();
while ((step <7) && (!timeOut)){
// log(""+((new Date()).getTime() - startTime);
//check where we are in specified delay
timeOut=((new Date()).getTime() - startTime)>delay;
//if atz does not work, type to send cntrlZ and retry, in case a message was stuck
if (timeOut && (step==1)) {
step=-1;
mySerial.send( ""+cntrlZ);
}
//read incoming string
String result= mySerial.getIncommingString() ;
// log ("<- "+result+"\n--------");
int expectedResult=-1;
try{
//log ("Step:"+step);
switch (step){
case 0:
mySerial.send("atz");
delay=LONG;
startTime=(new Date()).getTime();
break;
case 1:
delay=STANDARD;
mySerial.send("ath0");
startTime=(new Date()).getTime();
break;
case 2:
expectedResult=result.indexOf("OK");
//log ("received ok ="+expectedResult);
if (expectedResult>-1){
mySerial.send("at+cmgf=1");
startTime=(new Date()).getTime();
}else{
step=step-1;
}
break;
case 3:
expectedResult=result.indexOf("OK");
// log ("received ok ="+expectedResult);
if (expectedResult>-1){
mySerial.send("at+csca=\""+csca+"\"");
startTime=(new Date()).getTime();
}else{
step=step-1;
}
break;
case 4:
expectedResult=result.indexOf("OK");
// log ("received ok ="+expectedResult);
if (expectedResult>-1){
mySerial.send("at+cmgs=\""+recipient+"\"");
startTime=(new Date()).getTime();
}else{
step=step-1;
}
break;
case 5:
expectedResult=result.indexOf(">");
// log ("received ok ="+expectedResult);
if (expectedResult>-1){
mySerial.send(message+cntrlZ);
startTime=(new Date()).getTime();
}else{
step=step-1;
}
delay=VERYLONG;//waitning for message ack
break;
case 6:
expectedResult=result.indexOf("OK");
//read message number
if (expectedResult>-1){
int n=result.indexOf("CMGS:");
result=result.substring(n+5);
n=result.indexOf("\n");
status=0;
messageNo=Long.parseLong(result.substring(0,n).trim() );
log ("sent message no:"+messageNo);
}else{
step=step-1;
}
break;
}
step=step+1;
aThread.sleep(100);
}catch (Exception e){
e.printStackTrace();
}
}
mySerial.closeConnection() ;
//if timed out set status
if (timeOut ) {
status=-2;
log("*** time out at step "+step+"***");
}
}
comandos AT está enviando acordo com as especificações. E ele funciona perfeitamente, mas agora eu li sms da Caixa de entrada. Eu tenho função semelhante escrita assim:
public void receiveMessage() throws Exception
{
int expectedResult = 0;
SerialParameters params = defaultParameters;
mySerial =new SerialConnection (params);
mySerial.openConnection();
// step 1
mySerial.send("atz");
delay=LONG;
Thread.sleep(100);
//aThread.sleep(100);
String result= mySerial.getIncommingString() ;
// step 2
delay=STANDARD;
mySerial.send("ath0");
Thread.sleep(100);
// step 3
result= mySerial.getIncommingString() ;
expectedResult=result.indexOf("OK");
//log ("received ok ="+expectedResult);
if (expectedResult>-1){
mySerial.send("at+cmgf=1");
//startTime=(new Date()).getTime();
}
// step 4
result= mySerial.getIncommingString() ;
expectedResult=result.indexOf("OK");
//log ("received ok ="+expectedResult);
if (expectedResult>-1){
//mySerial.send("at+cmgl=\"ALL\"");
mySerial.send("at+cmgr=1");
//startTime=(new Date()).getTime();
}
Thread.sleep(100);
result= mySerial.getIncommingString() ;
}
Na etapa 1 I enviar atz comando e eu tenho resposta OK então ath0 de comando e resposta OK e, em seguida, comando + CMGL = \ "ALL \" e novamente a resposta OK, mas onde estão as minhas mensagens? Eu estava pensando em seguida, a última resposta (getIncommingString) deve conter mensagens lidas da caixa de entrada.
Eu sei que são SMSLib e outras bibliotecas. Mas para usar que as bibliotecas que eu tenho que adicionou um monte de outras bibliotecas (para o log). Quero ter aplicação simples para enviar e receber SMS.
Graças
Solução
Se você está lendo SMS do do cartão SIM, então você deve primeiro executar AT + CMGL para descobrir os índices de qualquer de SMS (SMS-entrega) armazenado. Então você precisa usar AT + CMGR para ler uma específica SMS. Você está trabalhando em modo modo ou texto PDU?
Assim como uma nota lateral. Por que você está enviando comandos ATZ e ath0? Estes são perfil e comandos relacionados chamadas.
Para ver todos os status de mensagens permitida de seu modem:
AT+CGML=?
Uma resposta típica seria:
+CMGL: ("REC UNREAD","REC READ","STO UNSENT","STO SENT","ALL")
Assim que olhar para todas as mensagens no cartão SIM:
AT+CGML="ALL"
Para ver todas as (novas) mensagens não lidas no seu cartão SIM:
AT+CGML="REC UNREAD"
Não há outra opção onde você pode impedir que mensagens SMS sejam armazenados em seu cartão SIM. Isto é controlado usando o comando AT + CNMI para configurar mensagens não solicitadas para ser ativado. Em seguida, sempre que um SMS é recebido, em seguida, você receberá uma mensagem + CMT forma assíncrona. Se você quiser saber mais sobre isso só me avisar.
Existem algumas vantagens que fazem uso da abordagem não solicitada. Sendo o principal deles você não tem que gerenciar sua memória cartões SIM (não há risco de ele ficar completo). Também com grandes quantidades de SMS é o seu cartão SIM pode realmente se tornar inutilizável.