2012-01-11 94 views
2

我发现免费的源项目发送使用Java通讯短信: http://code.google.com/p/find-ur-pal/source/browse/src/?r=21如何阅读使用Java通信的GSM GSM短信?

功能发送短信是这样的:

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+"***"); 
     } 
     } 

AT命令按照规范发送。它完美的作品,但现在我从收件箱中读取短信。我有写类似的功能是这样的:

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() ; 

     } 

在步骤1我在+ CMGL =发送ATZ的命令,我得到了响应OK,然后命令ATH0和响应确定,然后COMMAND \“ALL \”,并再次响应OK,但我的信息在哪里?我在想,最后一个响应(getIncommingString)应该包含从收件箱中读取的消息。

我知道这是SMSLib和其他库。但要使用这些库,我必须添加许多其他库(用于记录)。我想要简单的应用程序来发送和接收短信。

感谢

回答

1

如果你正在阅读从SIM卡短信的,那么你必须先执行AT + CMGL找出存储任何SMS的(SMS-提供)的索引。然后你需要使用AT + CMGR来读取特定的SMS。你在PDU模式还是文本模式下工作?

就像一个侧面说明。你为什么要发送ATZ和ATH0命令?这些是配置文件和调用相关的命令。

要查看您的调制解调器允许的所有消息状态:

AT+CGML=? 

一个典型的反应是:

+CMGL: ("REC UNREAD","REC READ","STO UNSENT","STO SENT","ALL") 

所以看你的SIM卡上的所有信息:

AT+CGML="ALL" 

要查看SIM卡上的所有未读(新消息):

AT+CGML="REC UNREAD" 

还有另一种选择,您可以防止SMS消息存储在SIM卡上。这是通过使用AT + CNMI命令配置未经请求的消息来启用的。然后,无论何时接收到SMS,您都将异步收到+ CMT消息。如果你想知道更多关于那个只是让我知道。

利用未经请求的方法有几个好处。主要的一点是你不必管理你的SIM卡记忆(没有充满的风险)。此外,如果使用大量的短信,您的SIM卡实际上可能无法使用。

+0

文本模式,我从谷歌的示例项目复制ATZ和ATH0。 – Robert 2012-01-12 20:04:04

+0

我改变了代码,现在命令AT + CMGL发送并且响应正常,然后我发送AT + CMGR = 1,响应也可以,但是消息索引列表在哪里呢? – Robert 2012-01-12 20:18:44

+0

我注意到我的短信在本地标签中,而在SIM卡中没有任何短信,所以当我运行我的应用程序时,它从SIM卡读取短信,所以我认为这是我仍然有0消息时的原因我使用cmgl命令。当短信到达存储它的gsm时?我如何从本地标签读取短信? (没有保存在SIM卡中)? – Robert 2012-01-12 20:28:34