`
wind1124
  • 浏览: 9780 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

在Java中操作串口实现短信收发(转)

阅读更多
1.配置comm.jar.

Comm.jar是Sub实现底层串口操作的API,调用了本地的DLL文件,因为Java本身不具备直接访问硬件设置的能力,都是通过调用本地方法来实现的.可以Java的官方网站下载.下载之后把其中Comm.jar包导入到工程的Classpath中,把另外两个非常重要的文件javax.comm.properties和win32com.dll考贝到你的工程目录下,即java.user下.

2.打开串口.

在打开串口前首先要加载Win32com.dll,因为我们没有把它放到JRE路径下,所以必须要自己显式的加载.

   String  driverName  =  "com.sun.comm.Win32Driver";
   CommDriver  driver  =  null;

   try  {
     System.loadLibrary("win32com");
       driver  =  (CommDriver)  Class.forName(driverName).newInstance();
     driver.initialize();
   }  catch  (InstantiationException  e1)  {
     logger.error("1:"  +  e1.getMessage());

   }  catch  (IllegalAccessException  e1)  {
     logger.error("2:"  +  e1.getMessage());

   }  catch  (ClassNotFoundException  e1)  {
     logger.error(e1.getMessage()); 
   }

然后获取你指定的端口:

SerialPort  sPort  =  null;
   CommPortIdentifier  portID;
   String  owner  =  new  String("modemn");
   int  keeptime  =  5000;
   Enumeration  portList;
   portList  =  CommPortIdentifier.getPortIdentifiers();

//  如果有多个端口
   while  (portList.hasMoreElements())  {
     portID  =  (CommPortIdentifier)  portList.nextElement();
     if  (portID.getName().equals(com))
       try  {
         sPort  =  (SerialPort)  portID.open(owner,  keeptime);
         break;
       }//  打开一个串口
       catch  (PortInUseException  e)  {
         logger.fatal(e.getMessage());
         System.exit(1);
       }

   }//  while

成功打开端口之后,设置端口的相关参数,如波特率、数据位、奇偶校验位等.这个跟具体的设备有关,不过一般情况下波特率为9600,数据位为8,停止位为1,奇偶为0,流量控制为Off:

if  (sPort  !=  null)  {
     logger.debug("serial  name  is  :"  +  sPort.getName());
     try  {
       //  设置串口的参数
       sPort.setSerialPortParams(9600,//  波特率
           SerialPort.DATABITS_8,//  数据位数
           SerialPort.STOPBITS_1,  //  停止位
           SerialPort.PARITY_NONE);//  奇偶位
     }  catch  (UnsupportedCommOperationException  e)  {
       e.printStackTrace();
       logger.error(e.getMessage());
     }
   }

3.对端口进行初始化

对进行数据接收或发送之前,还要先进行一些参数的设置。重要的有:

AT+cmgf=0(设置Modem收发采用Pdu方式,1为Text方式。有些Modem可能正好相反,具体参考Modem的At指令说明)

At+cnmi=2,2,0,0,0(设置Modem自动接收,AT指令说明书给的定义是新的短消息指示说明,就是说说有了新的短消息,怎么给你提示。这个设置是有消息将自动显示,无需进行读卡操作。看到有很网上的例子都是1,1,这样还要通过读卡操作才能得到短消息,十分不方便,还降低了SIM卡的使用寿命)

At+csmp=17,167,0,240(设置短消息文本模式参数。其中17是指SMS-SUBMIT的十进制整数表达形式,即提交;167指是有效期的整数表达形式;0指的是协议标识的十进制整数表示形式。前三个参数都该命令的默认值。最后一240指是编码方案,在Text方式下发送英文和Pdu模式下一般设置成240.如果要在Text模式下发送中文,有多Modem要设成8)

对端口所作的上述初始化工作,可以在超终终端里直接设置。但最好是把它写在程序里,在程序启动之后就进行此工作,避免手工操作的麻烦。

对Modem进行初始化,就必须把上述命令输出到Modem的端口上,还要看它的反回值是不是OK。要想得到返回值,就要对COM端口进行侦听了。所以初始化的工作有三步:

第一,侦听端口
       sPort.addEventListener(this);
       sPort.notifyOnDataAvailable(true);

第二,建立输入输出流,把初始化命令输出到Modem的COM端口

//  用配置参数初始化MODEM
     msg  =  conf.initParam();
     if  (msg  !=  null)  {
       if  (conf.modemMode()  !=  null  &&  conf.modemMode().equals("0"))
           if  (isPduMode)
               msg  =  "at+cmgf=0;"  +  msg;
       else
             msg  =  "at+cmgf=1;"  +  msg;
             sendMsg(msg.getBytes(),  sPort);
             sendOKFlag  =  true;
     }


//  把短消息通过数据猫发送出去
private  void  sendMsg(byte[]  msg,  SerialPort  sPort)  {

   DataOutputStream  pw;
   if  (msg  !=  null  &&  sPort  !=  null)
     try  {

       pw  =  new  DataOutputStream(sPort.getOutputStream());
       pw.write(msg);

       pw.flush();
       pw.close();
       logger.debug("msg  has  been  send  from  Modemn:");

     }  catch  (IOException  e)  {
       logger.error(e.getMessage());
       e.printStackTrace();
     }
}

//  处理侦听到的串口事件
public  synchronized  void  serialEvent(SerialPortEvent  ev)  {

   DataInputStream  in;
   int  c  =  0;
   StringBuffer  sb  =  null;
   //  如果有串口事件发生
   if  (ev.getEventType()  ==  SerialPortEvent.DATA_AVAILABLE)  {

     try  {
       in  =  new  DataInputStream(sPort.getInputStream());
       sb  =  new  StringBuffer();
       while  ((c  =  in.read())  !=  -1)  {
         sb.append((char)  c);

         System.out.println(sb);
         if  (handleRecData(sb))  {
           logger.debug("从Modem接收到的数据"  +  sb);
           sb  =  new  StringBuffer();

         }

       }

     }//  try
     catch  (IOException  e)  {
       logger.error(e.getMessage());
       e.printStackTrace();
     }
   }
}

serialEvent事件就是刚才添加侦听之后要工作的部分。如果写过界面程序的人,对这个会比较熟悉。一但Modem回复数据,此事件就会触发。我们在发送完初始化命令之后,就从此事件中接收数据,看能不能收到OK。如果收到,就初始化成功。

4.发送数据

成功进行初始化之后,就可以进行正常的数据收发了。我们在此使用PDU的方式做说明,Text方式一是很多Modem或手机都不支持,二是也比较简单,在最后再提。

首先我们可以把要发送的数据放到发送缓冲列表中,对数据一条一条的发送。因为Modem不支持异步(我自己的经验),我们只能发完一条之后,再发第二条。发送的原理同发送初始化命令一样,但是要注意的一点是发送内容首先要进行PDU编码,发送的格式为:

AT+CMGS=<Length><CR>PDU  DATA<CTRL-z>

其中Length为经过编码之后的PDU  data的长度减去18再除以2得到,至于为什么这样算,可以参考AT命令手册。有些Modem支持直接把上面的做为一个完整的数据包发送过去(比如:FALCOM系列的),有的就非常的笨(比如:西门子  Tc35i),它要求必须先发前面的At命令,等接收到回应“>”符号之后,再发送PDU  DATA,十分麻烦,一点去不为咱们开发人员着想:(,我就是在这吃的亏。按以前的习惯做,结果怎么都发不出去。

步骤是这样的:

首先取出经过PDU编码过的数据,计算它的长度,生成At+cmgs=<length><cr>

然后发送出去

接着侦听COM端口,等待接收">"字符

接收“>”之后,接着发送剩余的部分

然后再侦听,接收回应,看是否发送成功。如果发送成功的话,一般会接到这样的数据:

数据本身:PDU  DATA<CTRL-z>

发送序号:+CMGS:22

成功标志:OK

有时候也能接收OK,但是收不到+CMGS:22这样的东西,还是没有发送成功,这两个都必须有,才真正发送成功。

5.接收数据

接收数据其实也是在serialEvent里面处理。如果象上面的设置那样,设成自动接收,那么一但有短消息来了之后,自动触发事件,完整的数据格式大概是这样的:

+CMT:<data><time><index>

PDU  Data

"\n\r"

最后是以回车换行结束

我们收到完整的数据之后,把PDU  data取出来,再按PDU编码进行解码就行。

6.调试

首先最好能用超级终端,因为它使用起来很方便,直接输命令,直接看结果。

还有一些非常好的串口监测调试软件,能直接显示出来你向串口都发了什么数据,从串口接收到了什么数据,发送接收的对错,一看就清楚了。我在调TC35i的时候就折腾了好几天,就是不知道是什么原因,最后有网友建议我用串口监测软件,结果我没有半个小时就把问题搞定了,不是它,我都要哭了。强烈推荐一款是AcessPort,中文,免费,非常好用。

7.关于Text方式

格式如下:

AT+CMGS="+8613912345678"<CR>Text  content<ctrl-z>

如果是英文数字的话,直接发送就行了,接收到的也是Ascii码,无需编码

如果是中文的话,要先进行Unicode编码,接收也一样,收到之后要进行Unicode转gb的转换

另外先把配置设置好

8.参考源代码:

package  com.gftech.dcs.commu;

import  java.io.BufferedReader;
import  java.io.DataInputStream;
import  java.io.DataOutputStream;
import  java.io.IOException;
import  java.io.InputStreamReader;
import  java.io.PrintWriter;
import  java.util.ArrayList;
import  java.util.Enumeration;
import  java.util.TooManyListenersException;

import  javax.comm.CommDriver;
import  javax.comm.CommPortIdentifier;
import  javax.comm.PortInUseException;
import  javax.comm.SerialPort;
import  javax.comm.SerialPortEvent;
import  javax.comm.SerialPortEventListener;
import  javax.comm.UnsupportedCommOperationException;

import  org.apache.log4j.Logger;
import  org.apache.log4j.xml.DOMConfigurator;

import  com.gftech.common.PduPack;
import  com.gftech.smp.DeliverPack;
import  com.gftech.smp.SubmitPack;

/**
*  @author  sinboy

*  无线MODEM适配器。  用来从MODEM发送短消息,以及从MODEM接收短消息
*/
public  class  ModemAdapter  extends  Thread  implements  SerialPortEventListener  {
private  static  ModemAdapter  modem;

//  发送是否已成功完成
private  boolean  sendOKFlag;

private  int  errCount;

//  发送模式是否是PDU方式
private  boolean  isPduMode;

private  String  smContent;

private  ArrayList<SubmitPack>  sendBuffer;

//  要打开使用的串口
private  SerialPort  sPort;

static  Logger  logger  =  Logger.getLogger(ModemAdapter.class);

private  ModemAdapter()  {
   DOMConfigurator.configure(MyFinal.LOG4J_CONF_FILE);

   isPduMode  =  false;
   errCount  =  0;

   logger.debug("Add  a  test  data");
   sendBuffer  =  new  ArrayList<SubmitPack>();
   SubmitPack  msg  =  new  SubmitPack();
   ArrayList<String>  destList  =  new  ArrayList<String>();
   destList.add("136××××××××");
   msg.setSm("你好,张新波");
   msg.setDestAddr(destList);
   add(msg);

   start();

}

public  static  ModemAdapter  getInstance()  {
   if  (modem  ==  null)
     modem  =  new  ModemAdapter();
   return  modem;
}

//  得到计算机的串口
private  SerialPort  getSerialPort(String  com)  {
   SerialPort  sPort  =  null;
   CommPortIdentifier  portID;
   String  owner  =  new  String("modemn");
   int  keeptime  =  5000;
   Enumeration  portList;
   portList  =  CommPortIdentifier.getPortIdentifiers();

   String  driverName  =  "com.sun.comm.Win32Driver";
   CommDriver  driver  =  null;

   try  {
     System.loadLibrary("win32com");
     logger.debug("Win32Com  Library  Loaded");

     driver  =  (CommDriver)  Class.forName(driverName).newInstance();
     driver.initialize();
     logger.debug("Win32Driver  Initialized");
   }  catch  (InstantiationException  e1)  {
     logger.error("1:"  +  e1.getMessage());
     e1.printStackTrace();
   }  catch  (IllegalAccessException  e1)  {
     logger.error("2:"  +  e1.getMessage());
     e1.printStackTrace();
   }  catch  (ClassNotFoundException  e1)  {
     logger.error(e1.getMessage());
     e1.printStackTrace();
   }
   //  如果有多个端口
   while  (portList.hasMoreElements())  {
     portID  =  (CommPortIdentifier)  portList.nextElement();
     if  (portID.getName().equals(com))
       try  {
         sPort  =  (SerialPort)  portID.open(owner,  keeptime);
         break;
       }//  打开一个串口
       catch  (PortInUseException  e)  {
         logger.fatal(e.getMessage());
         System.exit(1);
       }

   }//  while

   if  (sPort  !=  null)  {
     logger.debug("serial  name  is  :"  +  sPort.getName());
     try  {
       //  设置串口的参数
       sPort.setSerialPortParams(9600,//  波特率
           SerialPort.DATABITS_8,//  数据位数
           SerialPort.STOPBITS_1,  //  停止位
           SerialPort.PARITY_NONE);//  奇偶位
     }  catch  (UnsupportedCommOperationException  e)  {
       e.printStackTrace();
       logger.error(e.getMessage());
     }
   }

   return  sPort;
}

private  boolean  init()  {
   boolean  result  =  false;
   Config  conf  =  new  Config();
   String  comName  =  conf.comName();
   sPort  =  getSerialPort(comName);
   String  msg  =  null;

   if  (sPort  !=  null)  {
     listenSerialPort(sPort);
     //  用配置参数初始化MODEM
     msg  =  conf.initParam();
     if  (msg  !=  null)  {
       if  (conf.modemMode()  !=  null  &&  conf.modemMode().equals("0"))
         isPduMode  =  true;

       if  (isPduMode)
         msg  =  "at+cmgf=0;"  +  msg;
       else
         msg  =  "at+cmgf=1;"  +  msg;
         sendMsg(msg,  sPort);
         sendOKFlag  =  true;
     }
   }

   for  (int  i  =  0;  i  <  100;  i++)  {
     try  {
       Thread.sleep(1000);

       if  (sendOKFlag)  {
         logger.debug("初始化MODEM成功!");
         return  true;
       }
     }  catch  (InterruptedException  e)  {
       e.printStackTrace();
     }
   }

   return  result;
}

//  把短消息通过数据猫发送出去
private  void  sendMsg(String  msg,  SerialPort  sPort)  {

   PrintWriter  pw;
   if  (msg  !=  null  &&  sPort  !=  null)
     try  {

       pw  =  new  PrintWriter(sPort.getOutputStream());
       pw.println(msg);

       pw.flush();
       pw.close();
       logger.debug("msg  has  been  send  from  Modemn:");
       logger.debug(msg);
     }  catch  (IOException  e)  {
       logger.error(e.getMessage());
       e.printStackTrace();
     }
}

//  把短消息通过数据猫发送出去
private  void  sendMsg(byte[]  msg,  SerialPort  sPort)  {

   DataOutputStream  pw;
   if  (msg  !=  null  &&  sPort  !=  null)
     try  {

       pw  =  new  DataOutputStream(sPort.getOutputStream());
       pw.write(msg);

       pw.flush();
       pw.close();
       logger.debug("msg  has  been  send  from  Modemn:");

     }  catch  (IOException  e)  {
       logger.error(e.getMessage());
       e.printStackTrace();
     }
}

private  void  listenSerialPort(SerialPort  sPort)  {

   if  (sPort  !=  null)
     try  {

       sPort.addEventListener(this);
       sPort.notifyOnDataAvailable(true);
     }  catch  (TooManyListenersException  e)  {
       logger.error(e.getMessage());
       e.printStackTrace();
     }

}

public  void  run()  {
   int  waitCount  =  0;
   String  cmd1  =  null;

   SubmitPack  msg;
   String  dest;
   String  content;

   if  (init())  {

     while  (true)  {
       try  {
         sleep(10);
       }  catch  (InterruptedException  e)  {
         e.printStackTrace();
       }
       msg  =  getOneMsg();
       if  (msg  !=  null)  {
         ArrayList<String>  destList  =  msg.getDestAddr();
         for  (int  i  =  0;  destList  !=  null  &&  i  <  destList.size();  i++)  {
           dest  =  (String)  destList.get(i);
           content  =  msg.getSm();

           if  (content  !=  null)  {
             while  (true)  {
               if  (sendOKFlag  ==  true)  {
                 if  (isPduMode)  {
                   Config  conf  =  new  Config();
                   PduPack  pack  =  new  PduPack();
                   pack.setAddr(dest);
                   pack.setMsgContent(content);
                   pack.setSmsc(conf.smsc());
                   String  coded  =  pack.getCodedResult();
                   if  (coded  !=  null
                       &&  coded.length()  >  18)
                     cmd1  =  "AT+CMGS="
                         +  (coded.length()  -  18)  /  2
                         +  "\r";
                   smContent  =  coded
                       +  (char)  Integer.parseInt("1A",
                           16);

                   //  cmd1+=smContent;
                   sendMsg(cmd1.getBytes(),  sPort);
                   cmd1  =  null;

                 }  else
                   cmd1  =  "AT+CMGS=\"+86"
                       +  dest
                       +  "\"\r"
                       +  content
                       +  (char)  Integer.parseInt("1a",
                           16)  +  "z";
                 if  (cmd1  !=  null)  {
                   logger.debug("Cmd:"  +  cmd1);
                   sendMsg(cmd1,  sPort);
                   sendOKFlag  =  false;
                   logger.debug("isSendOK=false");
                 }
                 break;
               }  else
                 try  {
                   sleep(100);
                   if  (waitCount  >  300)  {
                     sendOKFlag  =  true;
                     waitCount  =  0;
                   }  else
                     waitCount++;
                 }  catch  (InterruptedException  e)  {
                 }
             }
           }
         }
       }

     }//  while
   }  else  {
     logger.fatal("无法成功初始化MODEM,请检查设备");
     System.exit(0);
   }

}

//  处理侦听到的串口事件
public  synchronized  void  serialEvent(SerialPortEvent  ev)  {

   DataInputStream  in;
   int  c  =  0;
   StringBuffer  sb  =  null;
   //  如果有串口事件发生
   if  (ev.getEventType()  ==  SerialPortEvent.DATA_AVAILABLE)  {

     try  {
       in  =  new  DataInputStream(sPort.getInputStream());
       sb  =  new  StringBuffer();
       while  ((c  =  in.read())  !=  -1)  {
         sb.append((char)  c);

         System.out.println(sb);
         if  (handleRecData(sb))  {
           logger.debug("从Modem接收到的数据"  +  sb);
           sb  =  new  StringBuffer();

         }

       }

     }//  try
     catch  (IOException  e)  {
       logger.error(e.getMessage());
       e.printStackTrace();
     }
   }
}

/**
   *  判断接收到的数据是否最后是以"OK"结束的
   * 
   *  @param  data
   *  @return
   */
private  boolean  isRecOK(String  data)  {
   final  String  OK_FLAG  =  "OK";
   int  index1  =  0;

   if  (data  !=  null)  {
     index1  =  data.indexOf(OK_FLAG);

     if  (index1  >=  0  &&  index1  +  4  <=  data.length())  {
       String  t  =  data.substring(index1  +  2);
       byte[]  b  =  t.getBytes();
       if  (b.length  >=  2)  {
         if  (b[0]  ==  0x0D  &&  b[1]  ==  0x0A)
           return  true;
       }
     }
   }

   return  false;
}

/**
   *  发送短消息是否成功.
   *  <p>
   *  判断依据:  收到回应的消息中有+CMGS:<space><number>,紧接着是两个换行回车(0x0D,0x0A,0x0D,0x0A),
   *  然后是OK,最后是一个回车换行(0x0D,0x0A)
   * 
   *  @param  data
   *  @return
   */
private  boolean  isSendOK(String  data)  {
   final  String  FLAG  =  "+CMGS:";
   int  index  =  -1;
   int  index2  =  -1;

   if  (data  !=  null)  {
     index  =  data.indexOf(FLAG);
     if  (index  >  0)  {
       index  +=  6;
       if  (index  <  data.length())  {
         String  temp  =  data.substring(index);
         index  =  0;
         byte[]  b  =  temp.getBytes();
         for  (int  i  =  0;  i  <  b.length;  i++)  {
           if  (b[i]  ==  0x0D)  {
             index2  =  i;
             break;
           }
         }

         if  (index2  <  temp.length()  &&  index2  >  index  +  1)  {
           String  t1  =  temp.substring(index  +  1,  index2);

           try  {
             int  seqid  =  Integer.parseInt(t1);
             logger.debug("seqID:"  +  seqid);

             if  (index2  +  8  ==  temp.length())  {
               //  两个回车换行符
               if  (b[index2]  ==  0x0D  &&  b[++index2]  ==  0x0A
                   &&  b[++index2]  ==  0x0D
                   &&  b[++index2]  ==  0x0A)  {
                 if  (b[++index2]  ==  0x4F
                     &&  b[++index2]  ==  0x4B)  {//  OK
                   if  (b[++index2]  ==  0x0D
                       &&  b[++index2]  ==  0x0A)  {//  一个回车换行
                     return  true;
                   }
                 }
               }
             }
           }  catch  (NumberFormatException  e)  {
             e.printStackTrace();
             return  false;
           }
         }
       }
     }
   }

   return  false;
}

/**
   *  判断接收到的字符串最后是否是以"ERROR"结束的
   * 
   *  @param  data
   *  @return
   */
private  boolean  isRecError(String  data)  {

   final  String  FLAG  =  "ERROR";

   int  index1  =  0;

   if  (data  !=  null)  {
     index1  =  data.indexOf(FLAG);

     if  (index1  >=  0  &&  index1  +  7  <=  data.length())  {
       String  t  =  data.substring(index1  +  5);
       byte[]  b  =  t.getBytes();
       if  (b.length  >=  2)  {
         if  (b[0]  ==  0x0D  &&  b[1]  ==  0x0A)
           return  true;
       }
     }
   }

   return  false;
}

/**
   *  是否接收到手机发来的完整数据,上传的数据是以"+CMT:"开头
   * 
   *  @param  data
   *  @return
   */
private  boolean  isRecData(String  data)  {
   final  String  BEGIN_FLAG  =  "+CMT:";
   int  index0  =  -1;
   int  index1  =  -1;
   int  index2  =  -1;

   if  (data  !=  null)  {
     index0  =  data.indexOf(BEGIN_FLAG);
     if  (index0  >=  0  &&  index0  <  data.length())  {
       //  data=data.substring(index0);
       //  index1  =  data.indexOf("\r\n");
       //  if  (index1  >  index0  &&  index1  +  2  <  data.length())  {
       //  String  str=data.substring(index1+2);
       //  index2=str.indexOf("\r\n");
       //  if(index2>0  &&  index2<str.length()){
       //               
       //  return  true;
       //  }
       //  }

       return  true;

     }
   }
   return  false;
}

private  boolean  handleRecData(StringBuffer  sb)  {
   String  data  =  null;

   if  (sb  !=  null)  {
     data  =  sb.toString();
     if  (isRecOK(data))  {
       sendOKFlag  =  true;
       return  true;
     }  else  if  (isRecError(data))  {
       errCount++;
       if  (errCount  >  3)  {
         sendOKFlag  =  true;
         errCount  =  0;
       }

       return  true;
     }  else  if  (sb.indexOf(">")  !=  -1  &&  smContent  !=  null)  {
       sendMsg(smContent.getBytes(),  sPort);
       smContent  =  null;
     }

     else  {
       int  index0  =  data.lastIndexOf("+CMT:");

       if  (index0  >=  0  &&  index0  <  data.length())  {
         data  =  data.substring(index0);

         int  index1  =  data.indexOf("\r\n");
         if  (index1  !=  -1  &&  index1  +  2  <  data.length())  {
           data  =  data.substring(index1  +  2);

           int  index2  =  data.indexOf("\r\n");
           if  (index2  >  1  &&  index2  <  data.length())  {
             data  =  data.substring(0,  index2);
             if  (data  !=  null  &&  data.length()  >  0)  {
               PduPack  pack  =  new  PduPack(data);
               String  srcAddr  =  pack.getAddr();
               String  content  =  pack.getMsgContent();
               String  destAddr  =  "012345";

               if  (srcAddr  !=  null  &&  content  !=  null)  {
                 logger.debug("srcAddr:"+srcAddr);
                 logger.debug("content:"+content);
                
                 Config  conf  =  new  Config();
                 destAddr  =  conf.cmppSSN();
                 DeliverPack  deliver  =  new  DeliverPack(
                     srcAddr,  destAddr,  content);
                 ServerAdapter  server  =  ServerAdapter
                     .getInstance();
                 server.addDeliverPack(deliver);

                 return  true;
               }
             }
           }
         }
       }

     }

   }
   return  false;
}

     private  SubmitPack  getOneMsg()  {
   SubmitPack  result  =  null;

   if  (sendBuffer  !=  null  &&  sendBuffer.size()  >  0)
     result  =  (SubmitPack)  sendBuffer.remove(0);
   return  result;
}

public  void  add(SubmitPack  msg)  {
   sendBuffer.add(msg);
}

}
9.结束语

在如下环境调试通过:

Eclipse3.1,Jdk1.5,西门子  Tc35i  Modem


分享到:
评论

相关推荐

    基于短信猫,采用PDU编码的短信收发java实现

    在IT行业中,短信猫是一种硬件设备,通过串行接口连接到计算机,允许程序模拟手机进行短信的收发。本文将详细讲解如何利用Java语言,结合PDU编码来实现基于短信猫的短信通信功能。 首先,我们需要理解PDU(Protocol...

    Java 使用SMSLib通过串口通讯收发短信

    Java 使用SMSLib通过串口通讯收发短信是一个在IT领域中的特定应用场景,主要涉及Java编程、SMSLib库以及串行通信技术。以下是对这个主题的详细解析: 1. **Java编程**:Java是一种广泛使用的面向对象的编程语言,...

    java实现通过串口与GSM猫相连从而发送短信

    在本文中,我们将深入探讨这个主题,了解如何利用 Java 来操作串行端口,并与 GSM 模块进行交互。 首先,Java 并没有内置对串口的支持,因此我们需要使用第三方库,如 RXTX 库,它提供了 Java 对串口通信的 API。...

    java代码实现短信猫发短信

    在实现短信发送功能后,需要编写测试用例来验证其正确性。这可能包括发送短信到一个已知的手机号码,检查是否能成功发送,以及是否能接收到正确的返回信息。同时,考虑到可能存在的网络延迟和短信中心的处理时间,...

    java短信猫收发短信的例子

    Java短信猫收发短信的例子是基于Java编程语言实现的一个实用工具,主要用于与短信猫设备进行交互,实现短信的发送和接收功能。短信猫是一种硬件设备,通常通过USB或串口连接到计算机,使得电脑能够通过GSM网络发送和...

    短信猫收发例子(用于短信猫串口编程)

    在"短信猫收发例子"中,这个OCX控件可能封装了与短信猫进行通信的函数和方法,包括初始化串口、发送短信、接收短信、查询状态等功能。开发者可以通过调用这些控件的方法,实现对短信猫的操作。 文件名为"smsdemo_pb...

    SMS.rar_java serial port_sms_串口收发短信_手机短信_短信 AT 命令

    总之,Java串口通信结合AT命令,为开发者提供了一种灵活的方式,可以在软件中集成短信功能,实现设备间的数据交换。这个技术虽有一定的学习曲线,但掌握后能够极大地扩展应用程序的功能和应用场景。

    SMSLib实现Java短信收发的功能

    总结起来,使用SMSLib在Java项目中实现短信收发功能,需要理解Java串口通信的基本原理,正确配置相关库,然后通过SMSLib提供的API调用来实现短信的发送和接收。这为开发者提供了一种高效且无需深入了解底层细节的...

    Java控制CDMA MODEM完成短信息收发.pdf

    在实现短信息收发时,需要了解CDMA MODEM的短信息数据协议格式,包括短信息的发送、接收、删除、存储等操作。同时,需要使用AT指令来控制CDMA MODEM的各种通信功能,例如呼叫、接听、短信息接收和发送等。 在搭建...

    java短信收发文档

    综上所述,Java短信收发文档提供了一个基于smslib库的解决方案,用于通过短信猫在Java应用程序中实现短信服务。这涉及到硬件驱动的安装、配置文件的管理、Java代码的编写以及库的使用等多个方面,是Java与硬件设备...

    Java使用短信猫发送短信(AT指令操作串口)

    在IT行业中,尤其是在通信与自动化领域,通过编程语言如Java来控制硬件设备是常见的需求。本教程将聚焦于如何利用Java...在实际开发中,确保对硬件设备的理解和Java串口编程的熟练掌握,将有助于提升你的解决方案质量。

    短信猫用rxtx收发短信Java示例

    本示例将详细介绍如何使用RXTX库在Java中实现通过AT指令控制短信猫进行收发短信的功能。 首先,你需要安装RXTX库。提供的压缩包文件`rxtx-2.1-7-bins-r2.zip`和`rxtx-2.2pre2-bins.zip`包含了RXTX的不同版本。解压...

    用串口通信实现手机短信的收发

    6. **错误处理和调试**:在实现过程中,可能遇到如超时、数据错乱、短信发送失败等问题,需要编写适当的错误处理代码,并利用串口终端软件进行调试,查看通信过程中的原始数据。 7. **安全性与隐私**:由于短信可能...

    java短信猫多串口收短信

    短信猫(SMS Modem)是一种硬件设备,它通过串行接口连接到计算机,可以模拟手机接收和发送短信。本文将深入探讨如何使用Java进行短信猫的多串口管理,并解决smslib库可能出现的队列错误。 首先,我们需要理解Java...

    java版短信猫收发程序

    在Java版短信猫程序中,GSM协议是实现短信收发的关键。GSM协议定义了移动通信中的各种信令过程,包括短信服务(SMS)部分,它规定了如何在GSM网络中创建、传输和存储短信。 3. **AT指令集**: AT(Attention)指令...

    java短信的收发demo

    综上所述,Java短信收发涉及到API集成、硬件设备交互、协议理解、安全性、性能优化等多个方面,是一个综合性的技术实践。通过学习和实践这些知识点,开发者可以构建出稳定且高效的短信服务系统。

    java串口通讯 短信测试 comm编程 PDU编码 进制转换 AT命令

    KEIL中如何用虚拟串口调试串口程序.doc Message PDU编码规则.doc QHDQ-29DDDAD3A0.LOG SMSLib串口通信.doc 串口常用参数.doc 关于java使用javacomm20.doc 常见的进制转换方法.doc 浅谈Java串行端口技术协议.doc 短信...

Global site tag (gtag.js) - Google Analytics