java - 如何使用 java comm 从 gsm 读取短信?

标签 java sms gsm at-command javax.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 命令并得到响应,然后命令 ath0 并响应 OK,然后命令 at+cmgl=\"ALL\"并再次响应 OK,但是我的消息在哪里?我在想最后的响应 (getIncommingString) 应该包含从收件箱读取的消息。

我知道是 SMSLib 和其他库。但是要使用这些库,我必须添加很多其他库(用于日志记录)。我想要一个简单的应用程序来发送和接收短信。

谢谢

最佳答案

如果您正在从 SIM 卡读取 SMS,那么您必须首先执行 AT+CMGL 以找出存储的任何 SMS(SMS-DELIVER)的索引。然后你需要使用 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"

还有一个选项可以防止将 SMS 消息存储在您的 SIM 卡上。这是通过使用 AT+CNMI 命令配置要启用的未经请求的消息来控制的。然后,无论何时收到 SMS,您都会异步收到一条 +CMT 消息。如果您想了解更多关于那个的信息,请告诉我。

使用主动提供的方法有一些好处。最主要的是您不必管理 SIM 卡内存(没有内存变满的风险)。此外,对于大量短信,您的 SIM 卡实际上可能变得无法使用。

关于java - 如何使用 java comm 从 gsm 读取短信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8826902/

相关文章:

android - 如何开始处理移动恶意软件?

c - 如何在嵌入式 C 中读取来自 GSM 调制解调器的消息?

java - Spring应用程序监听器-ContextRefreshedEvent java :comp/env/jdbc/db not found

java - 为什么Spring-proxy使用委托(delegate)模式而不是继承+super?

android - 更改Android中短信的读取状态

node.js - 短信状态回调中的 Twilio 11200 错误

gsm - 如何使用 SIM 卡(安装小程序)

android - getGsmSignalStrength() 返回超出范围的值?

java - 使用转换器和提供程序而不是属性映射时如何让 ModelMapper.validate() 成功?

java - 如何在函数执行期间显示加载消息?