2012-01-11 2 views
2

나는 자바 통신을 사용하여 SMS를 보낼 수없는 소스 프로젝트를 발견 http://code.google.com/p/find-ur-pal/source/browse/src/?r=21자바 통신을 사용하여 GSM에서 SMS를 읽는 방법?

기능은 SMS를 보내는 것은 다음과 같습니다 명령 AT

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

은 사양에 따라 전송된다. 그리고 그것은 완벽하게 작동하지만 지금은 Inbox에서 SMS를 읽었습니다. 응답 다시 확인을 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() ; 

     } 

내가 ATZ 명령을 보내고 나는 응답이 OK 다음 ATH0 및 응답 확인을 명령했고, 다음 명령 + CMGL =에 "ALL \"\과 :이 같은 유사한 기능을 쓰기가 그러나 내 메시지는 어디에 있습니까? 내 생각에 그때 마지막 응답 (getIncommingString)받은 편지함에서 읽은 메시지를 포함해야합니다.

저는 SMSLib 및 기타 라이브러리를 알고 있습니다. 하지만이 라이브러리를 사용하기 위해서는 (로깅을 위해) 다른 많은 라이브러리를 추가해야합니다. 나는 SMS를 보내고받는 간단한 응용 프로그램을 갖고 싶다.

감사

답변

1

을 당신은 당신이 처음 저장된 SMS 년대 (SMS-제공)의 인덱스를 찾아 + CMGL AT 실행해야하는 SIM 카드에서 SMS 년대를 읽고 있다면. 그런 다음 특정 SMS를 읽으려면 AT + CMGR을 사용해야합니다. PDU 모드 또는 텍스트 모드로 작업하고 있습니까?

부수적 인 메모. ATZ 및 ATH0 명령을 보내는 이유는 무엇입니까? 프로파일 및 호출 관련 명령입니다. 일반적인 응답이 될 것

AT+CGML=? 

:

AT+CGML="ALL" 
: 그래서
+CMGL: ("REC UNREAD","REC READ","STO UNSENT","STO SENT","ALL") 

SIM 카드에있는 모든 메시지를보고

은 모뎀에서 허용 된 모든 메시지 상태를 확인하려면

SIM 카드에서 읽지 않은 (새) 메일을 모두 보려면 :

AT+CGML="REC UNREAD" 

SIM 카드에 SMS 메시지가 저장되는 것을 방지 할 수있는 또 다른 옵션이 있습니다. 이 요청은 AT + CNMI 명령을 사용하여 요청되지 않은 메시지를 사용하도록 구성하여 제어됩니다. 그러면 SMS가 수신 될 때마다 + CMT 메시지가 비동기 적으로 수신됩니다. 그 점에 대해 더 알고 싶다면 알려주세요.

원치 않는 접근 방식을 사용하면 몇 가지 이점이 있습니다. 가장 중요한 것은 SIM 카드 메모리를 관리 할 필요가 없다는 것입니다. 또한 SMS를 대량으로 사용하면 SIM 카드를 실제로 사용할 수 없게 될 수 있습니다.

+0

텍스트 모드에서 Google의 샘플 프로젝트에서 ATZ 및 ATH0을 복사했습니다. – Robert

+0

코드를 변경하고 이제 AT + CMGL 명령을 보내고 응답을 확인한 다음 AT + CMGR = 1을 보내고 응답도 OK이지만 메시지 인덱스 목록은 어디에 있습니까? – Robert

+0

내 SMS가 로컬 탭에 있고 SMS 탭에 SMS가 없으므로 내 응용 프로그램을 실행할 때 SIM 카드에서 SMS를 읽음으로써 이것이 여전히 0 메시지를 가지고있는 이유라고 생각합니다. 나는 cmgl 명령을 사용합니다. SMS가 저장되는 gsm에 도착하면? 로컬 탭에서 SMS를 읽으려면 어떻게해야합니까? (SIM 카드에 저장되지 않음)? – Robert