- 浏览: 4180705 次
最新评论
SMSLib实现Java短信收发的功能
blog迁移至:http://www.micmiu.com
用java实现短信收发的功能,目前一般项目中短信群发功能的实现方法大致有下面三种:
鉴于项目的情况和多方考虑,同时又找到了一个开源的SMSLib项目的支持,比较倾向于第二种方法,SMSLib的出现就不需要我们自己去写底层的AT指令,这样就可以直接通过调用SMSLib的API来实现通过GSM modem来收发送短信了。
SMSLib官方网站:http://smslib.org/,使用SMSLib的一些基本要点:
有关Java串口通信需要补充说明:
附件提供相关下载:
本次测试的环境是window,GSM modem是wavecom,所以这次主要描述window环境下简单的实现过程:
【一】、配置相应的环境
首先解压下载的Java Comm v2文件javacomm20-win32.zip,具体配置步骤如下:
【二】、测试串口端口程序:
TestGetPortList.java
本机运行结果:
串口: name-COM10 是否占用-false
串口: name-COM21 是否占用-false
串口: name-COM23 是否占用-false
串口: name-COM20 是否占用-false
串口: name-COM22 是否占用-false
串口: name-COM24 是否占用-false
串口: name-COM9 是否占用-false
串口: name-COM19 是否占用-false
串口: name-COM3 是否占用-false
串口: name-COM8 是否占用-false
串口: name-COM98 是否占用-false
串口: name-COM99 是否占用-false
串口: name-COM4 是否占用-false
串口: name-COM5 是否占用-false
串口: name-COM6 是否占用-false
并口: name-LPT1 是否占用-false
并口: name-LPT2 是否占用-false
-------------------------------------
【三】、检查串口设备信息:
TestCommPort.java
运行结果如下:
GSM Modem 串行端口连接测试开始...
找到串口: COM24
Trying at 9600... 正在检测设备: 发现设备: AT+CGMM MULTIBAND 900E 1800
Trying at 19200... 发现设备失败,沒有接收到响应结果!
Trying at 57600... 发现设备失败,沒有接收到响应结果!
Trying at 115200... 发现设备失败,沒有接收到响应结果!
【四】、测试收发短信:
发送短信亲测,手机能正常接收显示。读取设备的短信程序运行结果结果如下:
INFO - Service.listSystemInformation(113) | SMSLib: A Java API library for sending and receiving SMS via a GSM modem or other supported gateways.
This software is distributed under the terms of the Apache v2.0 License.
Web Site: http://smslib.org
INFO - Service.listSystemInformation(114) | Version: 3.5.1
INFO - Service.listSystemInformation(115) | JRE Version: 1.6.0_18
INFO - Service.listSystemInformation(116) | JRE Impl Version: 16.0-b13
INFO - Service.listSystemInformation(117) | O/S: Windows Vista / x86 / 6.0
INFO - SmsHandler.start(55) | SMS service start.....
INFO - DefaultQueueManager.init(92) | Queue directory not defined. Queued messages will not be saved to filesystem.
INFO - ModemGateway.startGateway(188) | GTW: modem.COM24: Starting gateway, using Generic AT Handler.
INFO - SerialModemDriver.connectPort(68) | GTW: modem.COM24: Opening: COM24 @9600
INFO - AModemDriver.waitForNetworkRegistration(459) | GTW: modem.COM24: GSM: Registered to foreign network (roaming).
INFO - AModemDriver.connect(175) | GTW: modem.COM24: MEM: Storage Locations Found: SMBM
INFO - CNMIDetector.getBestMatch(142) | CNMI: No best match, returning: 1
INFO - ModemGateway.startGateway(191) | GTW: modem.COM24: Gateway started.
INFO - SmsHandler.readSMS(113) | read SMS size: 1
发信人:8618918001030 短信内容:hello 回复测试
INFO - ModemGateway.stopGateway(197) | GTW: modem.COM24: Stopping gateway...
INFO - SerialModemDriver.disconnectPort(120) | GTW: modem.COM24: Closing: COM24 @9600
INFO - ModemGateway.stopGateway(201) | GTW: modem.COM24: Gateway stopped.
INFO - SmsHandler.destroy(72) | SMS service stop
-----------
用java实现短信收发的功能,目前一般项目中短信群发功能的实现方法大致有下面三种:
- 1、 向运行商申请短信网关,不需要额外的设备,利用运行商提供的API调用程序发送短信,适用于大型的通信公司。
- 2、 借助像GSM MODEM之类的设备(支持AT指令的手机也行),通过数据线连接电脑来发送短信,这种方法比较适用于小公司及个人。要实现这种方式必须理解串口通信、AT指令、短信编码、解码。
- 3、 借助第三方运行的网站实现,由网站代发短信数据,这种方法对网站依赖性太高,对网络的要求也比较高。
鉴于项目的情况和多方考虑,同时又找到了一个开源的SMSLib项目的支持,比较倾向于第二种方法,SMSLib的出现就不需要我们自己去写底层的AT指令,这样就可以直接通过调用SMSLib的API来实现通过GSM modem来收发送短信了。
SMSLib官方网站:http://smslib.org/,使用SMSLib的一些基本要点:
- SUN JDK 1.6 or newer. (Java环境)
- Java Communications Library. (Java串口通信)
- Apache ANT for building the sources. (编译源码时需要的)
- Apache log4j. (日志工具)
- Apache Jakarta Commons - NET. (网络操作相关的)
- JSMPP Library (SMPP协议时需要的)
有关Java串口通信需要补充说明:
- window系统可以用SUN Java Comm v2. (该版本好像也支持solaris) 其下载地址:http://smslib.googlecode.com/files/javacomm20-win32.zip
- 其他操作系统(比如:Linux, Unix, BSD,等等),你可以选择 Java Comm v3 或者是RxTx。 Java Comm v3下载地址:http://java.sun.com/products/javacomm/(需要注册);
RxTx官网:http://users.frii.com/jarvi/rxtx/index.htmlorhttp://rxtx.qbang.org/wiki/index.php/Main_Page
附件提供相关下载:
- java串口通信v2:javacomm20-win32.zip
- smslib-3.5.1.jar
- 短信 modem驱动:PL2303_Prolific_DriverInstaller_v130.zip
本次测试的环境是window,GSM modem是wavecom,所以这次主要描述window环境下简单的实现过程:
【一】、配置相应的环境
首先解压下载的Java Comm v2文件javacomm20-win32.zip,具体配置步骤如下:
- 把文件:comm.jar copy 到目录:<JDKDIR>/jre/lib/ext/,当然这一步也可以不要这样做,你只需把comm.jar copy到所要运行的项目对应的lib/下既可
- 把文件:javax.comm.properties copy 到目录:<JDKDIR>/jre/lib/
- 把DLL文件:win32com.dll(windows) copy 到目录:<JDKDIR>/jre/bin/
- 如果存在JRE目录, 最好按照上面步骤把文件copy到<JREDIR>相应的目录下
【二】、测试串口端口程序:
TestGetPortList.java
- packagemichael.comm.serial;
- importjava.util.Enumeration;
- importjavax.comm.CommDriver;
- importjavax.comm.CommPortIdentifier;
- importjavax.comm.SerialPort;
- /**
- *@authormichael
- *
- */
- publicclassTestGetPortList{
- /**
- *@paramargs
- *@throwsException
- */
- publicstaticvoidmain(String[]args)throwsException{
- //人工加载驱动
- //MainTest.driverInit();
- TestGetPortList.getCommPortList();
- //人工加载驱动获取端口列表
- //TestGetPortList.getPortByDriver();
- }
- /**
- *手工加载驱动<br>
- *正常情况下程序会自动加载驱动,故通常不需要人工加载<br>
- *每重复加载一次,会把端口重复注册,CommPortIdentifier.getPortIdentifiers()获取的端口就会重复
- */
- publicstaticvoiddriverManualInit(){
- StringdriverName="com.sun.comm.Win32Driver";
- Stringlibname="win32com";
- CommDrivercommDriver=null;
- try{
- System.loadLibrary("win32com");
- System.out.println(libname+"LibraryLoaded");
- commDriver=(javax.comm.CommDriver)Class.forName(driverName)
- .newInstance();
- commDriver.initialize();
- System.out.println("commDriverInitialized");
- }catch(Exceptione){
- System.err.println(e);
- }
- }
- /**
- *获取端口列表
- */
- publicstaticvoidgetCommPortList(){
- CommPortIdentifierportId;
- EnumerationportEnum=CommPortIdentifier.getPortIdentifiers();
- while(portEnum.hasMoreElements()){
- portId=(CommPortIdentifier)portEnum.nextElement();
- if(portId.getPortType()==CommPortIdentifier.PORT_SERIAL){
- System.out.println("串口:name-"+portId.getName()
- +"是否占用-"+portId.isCurrentlyOwned());
- }else{
- System.out.println("并口:name-"+portId.getName()
- +"是否占用-"+portId.isCurrentlyOwned());
- }
- }
- System.out.println("-------------------------------------");
- }
- /**
- *
- */
- publicstaticvoidgetPortByDriver(){
- StringdriverName="com.sun.comm.Win32Driver";
- Stringlibname="win32com";
- CommDrivercommDriver=null;
- try{
- System.loadLibrary("win32com");
- System.out.println(libname+"LibraryLoaded");
- commDriver=(CommDriver)Class.forName(driverName).newInstance();
- commDriver.initialize();
- System.out.println("commDriverInitialized");
- }catch(Exceptione){
- System.err.println(e);
- }
- SerialPortsPort=null;
- try{
- sPort=(SerialPort)commDriver.getCommPort("COM24",
- CommPortIdentifier.PORT_SERIAL);
- System.out.println("findCommPort:"+sPort.toString());
- }catch(Exceptione){
- System.out.println(e.getMessage());
- }
- }
- }
本机运行结果:
引用
串口: name-COM10 是否占用-false
串口: name-COM21 是否占用-false
串口: name-COM23 是否占用-false
串口: name-COM20 是否占用-false
串口: name-COM22 是否占用-false
串口: name-COM24 是否占用-false
串口: name-COM9 是否占用-false
串口: name-COM19 是否占用-false
串口: name-COM3 是否占用-false
串口: name-COM8 是否占用-false
串口: name-COM98 是否占用-false
串口: name-COM99 是否占用-false
串口: name-COM4 是否占用-false
串口: name-COM5 是否占用-false
串口: name-COM6 是否占用-false
并口: name-LPT1 是否占用-false
并口: name-LPT2 是否占用-false
-------------------------------------
【三】、检查串口设备信息:
TestCommPort.java
- packagemichael.comm.serial;
- importjava.io.InputStream;
- importjava.io.OutputStream;
- importjava.util.Enumeration;
- importjavax.comm.CommPortIdentifier;
- importjavax.comm.SerialPort;
- /**
- *@authormichael
- *
- */
- publicclassTestCommPort{
- staticCommPortIdentifierportId;
- staticEnumerationportList;
- staticintbauds[]={9600,19200,57600,115200};
- /**
- *@paramargs
- */
- publicstaticvoidmain(String[]args){
- portList=CommPortIdentifier.getPortIdentifiers();
- System.out.println("GSMModem串行端口连接测试开始...");
- StringportName="COM24";
- while(portList.hasMoreElements()){
- portId=(CommPortIdentifier)portList.nextElement();
- if(portId.getPortType()==CommPortIdentifier.PORT_SERIAL
- &&portName.equals(portId.getName())){
- System.out.println("找到串口:"+portId.getName());
- for(inti=0;i<bauds.length;i++){
- System.out.print("Tryingat"+bauds[i]+"...");
- try{
- SerialPortserialPort;
- InputStreaminStream;
- OutputStreamoutStream;
- intc;
- StringBufferresponse=newStringBuffer();
- serialPort=(SerialPort)portId.open(
- "SMSLibCommTester",2000);
- serialPort
- .setFlowControlMode(SerialPort.FLOWCONTROL_RTSCTS_IN);
- serialPort.setSerialPortParams(bauds[i],
- SerialPort.DATABITS_8,SerialPort.STOPBITS_1,
- SerialPort.PARITY_NONE);
- inStream=serialPort.getInputStream();
- outStream=serialPort.getOutputStream();
- serialPort.enableReceiveTimeout(1000);
- c=inStream.read();
- while(c!=-1){
- c=inStream.read();
- }
- outStream.write('A');
- outStream.write('T');
- outStream.write('\r');
- try{
- Thread.sleep(1000);
- }catch(Exceptione){
- }
- c=inStream.read();
- while(c!=-1){
- response.append((char)c);
- c=inStream.read();
- }
- if(response.indexOf("OK")>=0){
- System.out.print("正在检测设备:");
- try{
- outStream.write('A');
- outStream.write('T');
- outStream.write('+');
- outStream.write('C');
- outStream.write('G');
- outStream.write('M');
- outStream.write('M');
- outStream.write('\r');
- response=newStringBuffer();
- c=inStream.read();
- while(c!=-1){
- response.append((char)c);
- c=inStream.read();
- }
- System.out.println("发现设备:"
- +response.toString().replaceAll(
- "(\\s+OK\\s+)|[\n\r]",""));
- }catch(Exceptione){
- System.out.println("检测设备失败,获取设备信息异常:"
- +e.getMessage());
- }
- }else{
- System.out.println("检测设备失败,沒有接收到响应结果!");
- }
- serialPort.close();
- }catch(Exceptione){
- System.out.println("检测设备失败,发生异常:"+e.getMessage());
- }
- }
- }
- }
- }
- }
运行结果如下:
引用
GSM Modem 串行端口连接测试开始...
找到串口: COM24
Trying at 9600... 正在检测设备: 发现设备: AT+CGMM MULTIBAND 900E 1800
Trying at 19200... 发现设备失败,沒有接收到响应结果!
Trying at 57600... 发现设备失败,沒有接收到响应结果!
Trying at 115200... 发现设备失败,沒有接收到响应结果!
【四】、测试收发短信:
- packagemichael.sms;
- importjava.util.ArrayList;
- importjava.util.LinkedList;
- importjava.util.List;
- importorg.apache.log4j.Level;
- importorg.apache.log4j.Logger;
- importorg.smslib.AGateway;
- importorg.smslib.GatewayException;
- importorg.smslib.InboundMessage;
- importorg.smslib.OutboundMessage;
- importorg.smslib.Service;
- importorg.smslib.AGateway.Protocols;
- importorg.smslib.Message.MessageEncodings;
- importorg.smslib.modem.SerialModemGateway;
- /**
- *@authormichael
- *
- */
- publicclassSmsHandler{
- privatestaticfinalLoggerlogger=Logger.getLogger(SmsHandler.class);
- privateServicesmsService;
- /**
- *
- */
- publicSmsHandler(){
- smsService=Service.getInstance();
- List<AGateway>agatewayList=newArrayList<AGateway>();
- StringportName="COM24";//"/dev/ttyUSB0";//COM24
- SerialModemGatewaygateway=newSerialModemGateway(
- "modem."+portName,portName,9600,"wavecom","PL2303");
- gateway.setInbound(true);
- gateway.setOutbound(true);
- gateway.setProtocol(Protocols.PDU);
- gateway.setSimPin("0000");
- agatewayList.add(gateway);
- try{
- for(AGatewaygatewayTmp:agatewayList){
- smsService.addGateway(gatewayTmp);
- }
- }catch(GatewayExceptionex){
- logger.error(ex.getMessage());
- }
- }
- /**
- *
- */
- publicvoidstart(){
- logger.info("SMSservicestart.....");
- try{
- smsService.startService();
- }catch(Exceptionex){
- logger.error("SMSservicestarterror:",ex);
- }
- }
- /**
- *
- */
- publicvoiddestroy(){
- try{
- smsService.stopService();
- }catch(Exceptionex){
- logger.error("SMSservicestoperror:",ex);
- }
- logger.info("SMSservicestop");
- }
- /**
- *sendSMS
- *@parammsg
- *@returnBoolean
- */
- publicBooleansendSMS(OutboundMessagemsg){
- try{
- msg.setEncoding(MessageEncodings.ENCUCS2);
- returnsmsService.sendMessage(msg);
- }catch(Exceptione){
- logger.error("senderror:",e);
- }
- returnfalse;
- }
- privatebooleanisStarted(){
- if(smsService.getServiceStatus()==Service.ServiceStatus.STARTED){
- for(AGatewaygateway:smsService.getGateways()){
- if(gateway.getStatus()==AGateway.GatewayStatuses.STARTED){
- returntrue;
- }
- }
- }
- returnfalse;
- }
- /**
- *readSMS
- *@returnList
- */
- publicList<InboundMessage>readSMS(){
- List<InboundMessage>msgList=newLinkedList<InboundMessage>();
- if(!isStarted()){
- returnmsgList;
- }
- try{
- this.smsService.readMessages(msgList,
- InboundMessage.MessageClasses.ALL);
- logger.info("readSMSsize:"+msgList.size());
- }catch(Exceptione){
- logger.error("readerror:",e);
- }
- returnmsgList;
- }
- /**
- *@paramargs
- */
- publicstaticvoidmain(String[]args){
- Logger.getRootLogger().setLevel(Level.INFO);
- OutboundMessageoutMsg=newOutboundMessage("189xxxx****","信息测试");
- SmsHandlersmsHandler=newSmsHandler();
- smsHandler.start();
- //发送短信
- smsHandler.sendSMS(outMsg);
- //读取短信
- List<InboundMessage>readList=smsHandler.readSMS();
- for(InboundMessagein:readList){
- System.out.println("发信人:"+in.getOriginator()+"短信内容:"
- +in.getText());
- }
- smsHandler.destroy();
- System.out.println("-----------");
- }
- }
发送短信亲测,手机能正常接收显示。读取设备的短信程序运行结果结果如下:
引用
INFO - Service.listSystemInformation(113) | SMSLib: A Java API library for sending and receiving SMS via a GSM modem or other supported gateways.
This software is distributed under the terms of the Apache v2.0 License.
Web Site: http://smslib.org
INFO - Service.listSystemInformation(114) | Version: 3.5.1
INFO - Service.listSystemInformation(115) | JRE Version: 1.6.0_18
INFO - Service.listSystemInformation(116) | JRE Impl Version: 16.0-b13
INFO - Service.listSystemInformation(117) | O/S: Windows Vista / x86 / 6.0
INFO - SmsHandler.start(55) | SMS service start.....
INFO - DefaultQueueManager.init(92) | Queue directory not defined. Queued messages will not be saved to filesystem.
INFO - ModemGateway.startGateway(188) | GTW: modem.COM24: Starting gateway, using Generic AT Handler.
INFO - SerialModemDriver.connectPort(68) | GTW: modem.COM24: Opening: COM24 @9600
INFO - AModemDriver.waitForNetworkRegistration(459) | GTW: modem.COM24: GSM: Registered to foreign network (roaming).
INFO - AModemDriver.connect(175) | GTW: modem.COM24: MEM: Storage Locations Found: SMBM
INFO - CNMIDetector.getBestMatch(142) | CNMI: No best match, returning: 1
INFO - ModemGateway.startGateway(191) | GTW: modem.COM24: Gateway started.
INFO - SmsHandler.readSMS(113) | read SMS size: 1
发信人:8618918001030 短信内容:hello 回复测试
INFO - ModemGateway.stopGateway(197) | GTW: modem.COM24: Stopping gateway...
INFO - SerialModemDriver.disconnectPort(120) | GTW: modem.COM24: Closing: COM24 @9600
INFO - ModemGateway.stopGateway(201) | GTW: modem.COM24: Gateway stopped.
INFO - SmsHandler.destroy(72) | SMS service stop
-----------
相关推荐
Java 使用SMSLib通过串口通讯收发短信 Java 使用SMSLib通过串口通讯收发短信 Java 使用SMSLib通过串口通讯收发短信 Java 使用SMSLib通过串口通讯收发短信
SMSLib一个很有用的程序,最新的短信猫控制库,含有短信收发例程,Java
1.内涵SMSLIB的资料; 2.JAVA收发短信实例及使用说明; 3.在SMSLIB的基础之上进行了简单的封装,目的是让使用者对简单的短信收、发实现更加简单些。 读者/使用者:Java开发人员。
使用java SMslib实现了短信猫收发短信。串口开发,串口配置工具,配合了完整的测试用例,可以使用到项目中。
smslib使用rxtx发短信需要的jar,commons-net-3.0.1.jar ,jsmpp-2.1.0.jar,log4j-1.2.16.jar,RXTXcomm.jar, slf4j-api-1.6.3.jar,slf4j-log4j12-1.6.3.jar, smslib-3.5.2.jar
基于Java的短信收发包 SMSLib.zip
基于java的短信收发包 SMSLib.zip
java源码:短信收发包 SMSLib.zip
基于Java的源码-短信收发包 SMSLib.zip
基于java的开发源码-短信收发包 SMSLib.zip
基于Java的实例源码-短信收发包 SMSLib.zip
由于前段时间做的系统需要使用短信猫收发短信,所以研究了一下在Java下使用短信猫,网上很多资料都是使用的smslib的jar包来发送短信,但是这种方式只支持32的jdk,而我的系统使用的是linux的64位环境,所以最后采用...
在java下利用smslib的二次开发包使用短信猫进行短信收发,该资源包括smslib-3.3.0b2.jar,win32com.dll,javax.comm.properties,comm.jar,短信收发的两个示例文件以及简略的使用说明,具体的使用可以参考...
java 短信猫 短信收发 GSM java版的短信收发程序,通过操作短信猫,收发程序,支持GSM协议,支持AT指令
购买wavecom生成厂商短信猫,插入sim卡安装短信猫USB驱动,本文档中将短信的发送需要的参数配置在...将短信的收发封装在一个公共的处理类里面,支持短信群发,发送短信采用GSM协议,适用于win32,win64暂不支持。
java的开源框架,基于COM口对短信猫进行短信的收发。
短信收发包 SMSLib源码
SMSLib是一个API库用于通过GSM Modem收发SMS短信息。提供Java和.Net两个版本。 This is the SMSLib project ("smslib") This project was registered on SourceForge.net on Apr 3, 2006, and is described by the ...