كيفية قراءة الرسائل القصيرة من gsm باستخدام جافا comm?

StackOverflow https://stackoverflow.com/questions/8826902

سؤال

وجدت الحرة المصدر المشروع إلى إرسال الرسائل القصيرة sms باستخدام جافا 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+"***");
        }
      }

في الأوامر إرسال وفقا للمواصفات.وهو يعمل تماما, ولكن الآن لدي قراءة الرسائل من صندوق البريد الوارد.يجب كتابة وظيفة مماثلة من هذا القبيل:

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 والاستجابة موافق ثم الأمر في+cmgl=\"كل\" و مرة أخرى استجابة موافق ، ولكن أين هي رسائلي ؟ كنت أفكر ثم آخر رد (getIncommingString) يجب أن تحتوي على قراءة الرسائل من صندوق البريد الوارد.

أنا أعرف أن SMSLib وغيرها من المكتبات.ولكن استخدام تلك المكتبات أضفت الكثير من المكتبات الأخرى (تسجيل).أريد أن يكون تطبيق بسيط لإرسال واستقبال الرسائل القصيرة.

شكرا

هل كانت مفيدة؟

المحلول

إذا كنت تقرأ رسائل من بطاقة SIM ثم يجب أولا تنفيذ في+CMGL لمعرفة مؤشرات من أي الرسائل القصيرة (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 الخاصة بك.هذا هو التحكم باستخدام AT+CNMI الأمر إلى تكوين الرسائل غير المرغوب فيها إلى تمكين.ثم كلما SMS تلقي ثم سوف تتلقى +CMT رسالة بشكل غير متزامن.إذا كنت تريد أن تعرف المزيد عن ذلك واحد فقط اسمحوا لي أن أعرف.

هناك عدد قليل من فوائد استخدام غير المرغوب فيها النهج.أهمها أنك لا تضطر إلى إدارة بطاقات SIM الخاصة بك الذاكرة (لا يوجد خطر من الحصول على كامل).أيضا مع كميات كبيرة من رسائل بطاقة SIM الخاصة بك في الواقع يمكن أن تصبح غير صالحة للاستعمال.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top