2012-01-11 11 views
2

は、私はJavaのCOMMを使用してSMSを送信するために自由なソースプロジェクトを見つけました:ATコマンドjava commを使ってgsmからsmsを読むには?

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

は仕様に応じて送信されます:SMSを送信する http://code.google.com/p/find-ur-pal/source/browse/src/?r=21

機能は次のようになります。それは完璧に動作しますが、今はInboxからSMSを読んでいます。 、私はコマンドATZ送信し、私は応答がOK [OK]をATH0と応答を指揮し、その後+ cmgl = \「ALL \」でコマンドと再び応答OKしまっステップ1では

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

     } 

:私はこのような同様の機能を記述しています私のメッセージはどこにありますか?私は最後の応答(getIncommingString)には受信トレイから読み取ったメッセージを含めるべきだと考えていました。

私はそれがSMSLibと他のライブラリであることを知っています。しかし、そのライブラリを使用するには、(ロギング用に)他のライブラリをたくさん追加する必要があります。私はSMSを送受信する簡単なアプリケーションを持っていたい。

おかげ

答えて

1

をあなたは、あなたが最初に格納されている任意のSMSの(SMS-提供)のインデックスを見つけるために+ CMGL AT実行しなければなりませんSIMカードからのSMSのを読んでいる場合。次に、特定のSMSを読むためにAT + CMGRを使う必要があります。 PDUモードまたはテキストモードで作業していますか?

ちょっとしたメモです。なぜATZとATH0コマンドを送信していますか?これらはプロファイルおよびコール関連のコマンドです。

AT+CGML=? 

典型的な応答は次のようになります:

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

だからあなたのSIMカード上のすべてのメッセージを見て:

AT+CGML="ALL" 
モデムから許可されているすべてのメッセージのステータスを表示するには

SIMカードの未読(新)メッセージをすべて表示するには

AT+CGML="REC UNREAD" 

SIMカードにSMSメッセージが保存されないようにすることもできます。これは、AT + CNMIコマンドを使用して、非送信請求メッセージを有効にするように構成することによって制御されます。その後SMSが受信されると、+ CMTメッセージが非同期で受信されます。あなたがそのことについてもっと知りたいのであれば、私に知らせてください。

迷惑なアプローチを利用することにはいくつかの利点があります。あなたがSIMカードのメモリを管理する必要はありません(それがいっぱいになるリスクはありません)。また、大量のSMSの場合、SIMカードは実際に使用できなくなる可能性があります。

+0

テキストモードでは、GoogleのサンプルプロジェクトからATZとATH0をコピーしました。 – Robert

+0

コードを変更してAT + CMGLコマンドを送信し、応答がOKならばAT + CMGR = 1を送信し、応答もOKですが、メッセージのインデックスのリストはどこですか? – Robert

+0

SMSがローカルタブにあり、SIMタブにSMSがないことに気づいたので、アプリケーションを実行するとSIMカードからSMSが読み込まれるため、私はcmglコマンドを使用します。 SMSが格納されているgsmにSMSが届いたら?ローカルタブからSMSを読むにはどうすればよいですか? (SIMカードに保存されていない)? – Robert

関連する問題