2

Java 通信を使用して SMS を送信する無料のソース プロジェクトを見つけました: http://code.google.com/p/find-ur-pal/source/browse/src/?r=21

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

AT コマンドは仕様どおりに送信しています。それは完全に機能しますが、今では受信トレイから SMS を読みました。私はこのような同様の関数を書いています:

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 が返され、コマンド at+cmgl=\"ALL\" と再度応答 OK が返されましたが、メッセージはどこにあるのでしょうか? 最後の応答 (getIncommingString) には、受信トレイから読み取られたメッセージが含まれている必要があると考えていました。

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

ありがとう

4

1 に答える 1

1

SIMカードからSMSを読み取る場合は、最初に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カードが実際に使用できなくなる可能性があります。

于 2012-01-12T13:00:19.863 に答える