Как читать смс из gsm, используя java comm?

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

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

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

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

Спасибо

1 ответ

Решение

Если вы читаете SMS-сообщения с SIM-карты, то сначала необходимо выполнить AT+CMGL, чтобы узнать индексы любых сохраненных SMS-сообщений (SMS-DELIVER). Затем вам нужно использовать 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-карта может фактически стать непригодной для использования.

Другие вопросы по тегам