2012-01-11 3 views
2

я нашел свободный исходный проект, чтобы отправить смс с использованием Java комм: http://code.google.com/p/find-ur-pal/source/browse/src/?r=21Как читать sms из gsm с помощью java comm?

Функция отправки смс выглядит следующим образом:

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 команды посылают в соответствии со спецификациями. И он работает отлично, но теперь я прочитал смс из Inbox. У меня написать подобную функцию, как это:

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 я посылаю команду ATZ, и я получил ответ ОК, а затем команду ath0 и ответ OK, а затем команду на + CMGL = \ «ALL \» и снова ответ OK, но где мои сообщения? Я думал, что последний ответ (getIncommingString) должен содержать сообщения, прочитанные из папки «Входящие».

Я знаю, что это SMSLib и другие библиотеки. Но для использования этих библиотек я должен добавить много других библиотек (для ведения журнала). Я хочу иметь простое приложение для отправки и получения смс.

Благодаря

ответ

1

Если вы читаете SMS-сообщений из 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-карты (без риска ее полного заполнения). Также с большим количеством SMS-сообщений ваша SIM-карта может стать непригодной для использования.

+0

Текстовый режим, я скопировал ATZ и ATH0 из образца проекта из Google. – Robert

+0

Я меняю код, и теперь команда AT + CMGL отправляется, и ответ в порядке, тогда я посылаю AT + CMGR = 1 и ответ тоже в порядке, но где список индексов сообщений? – Robert

+0

Я заметил, что мои смс находятся на вкладке «Местный», а на вкладке «SIM» нет никаких SMS-сообщений, поэтому, когда я запускаю свое приложение, он считывает смс с SIM-карты, поэтому я думаю, что это причина, по которой у меня все еще есть 0 сообщений, когда Я использую команду cmgl. Когда sms приходят в gsm, где он хранится? Как я могу читать смс с локальной вкладки? (не сохраняется на SIM-карте)? – Robert