查看: 53297|回复: 14

短信卡发设备java短信二次开发包源代码smslib-3.5.4.jar

[复制链接]
发表于 2015-1-26 11:01:29 | 显示全部楼层 |阅读模式
SMSLib开发指南


一、SMSLib简介

SMSLib是一个开放源代码的短信收发设备短信二次开发包,有JAVA和.Net两个版本,目前最新版为v3.5.4。

184344g3q02gilimo92iao.jpg                                                                                                                                                                       图1-1

二、Window平台


1、在smslib官网下载“SMSLib for Java v3.5.2”开发包,并解压,目录结构如下图所示:

184256aalylnlocdhk0lhl.jpg

                                                                        图2-1

184253t18qc99ix3cgii08.jpg

                                                                        图2-2

lib:存放二次开发包(smslib-3.5.2.jar)和运行时的依赖包(slf4j、log4j、commons-net、jsmpp等)(重要)

dist:存放短服务开发包(smsserver-3.5.2.jar),该包包括了smslib-3.5.2.jar中的所有核心类。如果是将短信收发设备作为服务的方式部署,不需要额外写代码开发短信发送和接收的接口,直接部署短信服务即可,详细的步聚,可以参考《短信服务安装与配置指南》。(重要)

doc:smslib介绍、使用指南、smsserver安装与配置等文档(重要)

javadoc:二次开发包API

src:存放二次开发包源码和示例源码

misc:smslib日志(log4j)配置配置模板、smsserver数据库建库脚本及服务接口等文件

build:项目管理相关文件(不重要)


2、下载SUN JavaComm v2 (Win32)动态库,并解压,目录结构如下图所示:

184250a4biac657lcfmf34.jpg

                                                                        图3-1

3、运行环境配置

  • 复制“图3-1”中javax.comm.properties文件到%JAVA_HOME%\jre\lib目录下,win32com.dll文件到%JAVA_HOME%\jre\bin目录下
  • 复制“图3-1”中comm.jar和图2-2中所有jar文件到CLASSPATH目录下(如果是用eclipse等IDE工具,将这些jar包导入到工程中)

       注意: win32com.dll只支持32位jdk,64位JDK的用RXTX

4、运行示例程序并测试
      修改图2-1中src\java\examples\modem目录下的SendMessage.java和ReadMessages.java程序发送短信的参数配置,编译并运行。如下图所示:
  1. // SendMessage.java - Sample application.  
  2. // 短信发送测试程序  
  3. // This application shows you the basic procedure for sending messages.  
  4. // You will find how to send synchronous and asynchronous messages.  
  5. //  
  6. // For asynchronous dispatch, the example application sets a callback  
  7. // notification, to see what's happened with messages.  
  8.   
  9. package examples.modem;  
  10.   
  11. import org.smslib.AGateway;  
  12. import org.smslib.IOutboundMessageNotification;  
  13. import org.smslib.Library;  
  14. import org.smslib.OutboundMessage;  
  15. import org.smslib.Service;  
  16. import org.smslib.modem.SerialModemGateway;  
  17.   
  18. public class SendMessage  
  19. {  
  20.     public void doIt() throws Exception  
  21.     {  
  22.         OutboundNotification outboundNotification = new OutboundNotification();  
  23.         System.out.println("Example: Send message from a serial gsm modem.");  
  24.         System.out.println(Library.getLibraryDescription());  
  25.         System.out.println("Version: " + Library.getLibraryVersion());  
  26.         /*
  27.         modem.com1:网关ID(即短信收发设备端口编号)
  28.         COM4:串口名称(在window中以COMXX表示端口名称,在linux,unix平台下以ttyS0-N或ttyUSB0-N表示端口名称),通过端口检测程序得到可用的端口
  29.         115200:串口每秒发送数据的bit位数,必须设置正确才可以正常发送短信,可通过程序进行检测。常用的有115200、9600
  30.         Huawei:短信收发设备生产厂商,不同的短信设备生产厂商smslib所封装的AT指令接口会不一致,必须设置正确.常见的有Huawei、wavecom等厂商
  31.         最后一个参数表示设备的型号,可选
  32.         */  
  33.         SerialModemGateway gateway = new SerialModemGateway("modem.com1", "COM4", 115200, "Huawei", "");  
  34.         gateway.setInbound(true);   //设置true,表示该网关可以接收短信,根据需求修改  
  35.         gateway.setOutbound(true);//设置true,表示该网关可以发送短信,根据需求修改  
  36.         gateway.setSimPin("0000");//sim卡锁,一般默认为0000或1234  
  37.         // Explicit SMSC address set is required for some modems.  
  38.         // Below is for VODAFONE GREECE - be sure to set your own!  
  39.         gateway.setSmscNumber("+306942190000");//短信服务中心号码  
  40.         Service.getInstance().setOutboundMessageNotification(outboundNotification); //发送短信成功后的回调函方法  
  41.         Service.getInstance().addGateway(gateway);  //将网关添加到短信服务中  
  42.         Service.getInstance().startService();   //启动服务,进入短信发送就绪状态  
  43.         System.out.println();  
  44.         //打印设备信息  
  45.         System.out.println("Modem Information:");  
  46.         System.out.println("  Manufacturer: " + gateway.getManufacturer());  
  47.         System.out.println("  Model: " + gateway.getModel());  
  48.         System.out.println("  Serial No: " + gateway.getSerialNo());  
  49.         System.out.println("  SIM IMSI: " + gateway.getImsi());  
  50.         System.out.println("  Signal Level: " + gateway.getSignalLevel() + " dBm");  
  51.         System.out.println("  Battery Level: " + gateway.getBatteryLevel() + "%");  
  52.         System.out.println();  
  53.         // Send a message synchronously.  
  54.         OutboundMessage msg = new OutboundMessage("306974000000", "Hello from SMSLib!");    //参数1:手机号码 参数2:短信内容  
  55.         Service.getInstance().sendMessage(msg); //执行发送短信  
  56.         System.out.println(msg);  
  57.         // Or, send out a WAP SI message.  
  58.         //OutboundWapSIMessage wapMsg = new OutboundWapSIMessage("306974000000",   
  59. //new URL("http://www.smslib.org/"), "Visit SMSLib now!");  
  60.         //Service.getInstance().sendMessage(wapMsg);  
  61.         //System.out.println(wapMsg);  
  62.         // You can also queue some asynchronous messages to see how the callbacks  
  63.         // are called...  
  64.         //msg = new OutboundMessage("309999999999", "Wrong number!");  
  65.         //srv.queueMessage(msg, gateway.getGatewayId());  
  66.         //msg = new OutboundMessage("308888888888", "Wrong number!");  
  67.         //srv.queueMessage(msg, gateway.getGatewayId());  
  68.         System.out.println("Now Sleeping - Hit <enter> to terminate.");  
  69.         System.in.read();  
  70.         Service.getInstance().stopService();  
  71.     }  
  72.   
  73.     /*
  74.      短信发送成功后,调用该接口。并将发送短信的网关和短信内容对象传给process接口
  75.     */  
  76.     public class OutboundNotification implements IOutboundMessageNotification  
  77.     {  
  78.         public void process(AGateway gateway, OutboundMessage msg)  
  79.         {  
  80.             System.out.println("Outbound handler called from Gateway: " + gateway.getGatewayId());  
  81.             System.out.println(msg);  
  82.         }  
  83.     }  
  84.   
  85.     public static void main(String args[])  
  86.     {  
  87.         SendMessage app = new SendMessage();  
  88.         try  
  89.         {  
  90.             app.doIt();  
  91.         }  
  92.         catch (Exception e)  
  93.         {  
  94.             e.printStackTrace();  
  95.         }  
  96.     }  
  97. }
复制代码

  



  1. // ReadMessages.java - Sample application.  
  2. // 短信读取程序  
  3. // This application shows you the basic procedure needed for reading  
  4. // SMS messages from your GSM modem, in synchronous mode.  
  5. //  
  6. // Operation description:  
  7. // The application setup the necessary objects and connects to the phone.  
  8. // As a first step, it reads all messages found in the phone.  
  9. // Then, it goes to sleep, allowing the asynchronous callback handlers to  
  10. // be called. Furthermore, for callback demonstration purposes, it responds  
  11. // to each received message with a "Got It!" reply.  
  12. //  
  13. // Tasks:  
  14. // 1) Setup Service object.  
  15. // 2) Setup one or more Gateway objects.  
  16. // 3) Attach Gateway objects to Service object.  
  17. // 4) Setup callback notifications.  
  18. // 5) Run  
  19.   
  20. package examples.modem;  
  21.   
  22. import java.util.ArrayList;  
  23. import java.util.List;  
  24. import javax.crypto.spec.SecretKeySpec;  
  25. import org.smslib.AGateway;  
  26. import org.smslib.AGateway.GatewayStatuses;  
  27. import org.smslib.AGateway.Protocols;  
  28. import org.smslib.ICallNotification;  
  29. import org.smslib.IGatewayStatusNotification;  
  30. import org.smslib.IInboundMessageNotification;  
  31. import org.smslib.IOrphanedMessageNotification;  
  32. import org.smslib.InboundMessage;  
  33. import org.smslib.InboundMessage.MessageClasses;  
  34. import org.smslib.Library;  
  35. import org.smslib.Message.MessageTypes;  
  36. import org.smslib.Service;  
  37. import org.smslib.crypto.AESKey;  
  38. import org.smslib.modem.SerialModemGateway;  
  39.   
  40. public class ReadMessages  
  41. {  
  42.     public void doIt() throws Exception  
  43.     {  
  44.         // Define a list which will hold the read messages.  
  45.         List<InboundMessage> msgList;  
  46.         // Create the notification callback method for inbound & status report  
  47.         // messages.  
  48.         InboundNotification inboundNotification = new InboundNotification();  
  49.         // Create the notification callback method for inbound voice calls.  
  50.         CallNotification callNotification = new CallNotification();  
  51.         //Create the notification callback method for gateway statuses.  
  52.         GatewayStatusNotification statusNotification = new GatewayStatusNotification();  
  53.         OrphanedMessageNotification orphanedMessageNotification = new OrphanedMessageNotification();  
  54.         try  
  55.         {  
  56.             System.out.println("Example: Read messages from a serial gsm modem.");  
  57.             System.out.println(Library.getLibraryDescription());  
  58.             System.out.println("Version: " + Library.getLibraryVersion());  
  59.             // Create the Gateway representing the serial GSM modem.  
  60.             SerialModemGateway gateway = new SerialModemGateway("modem.com4", "COM4", 115200, "Huawei", "E160");  
  61.             // Set the modem protocol to PDU (alternative is TEXT). PDU is the default, anyway...  
  62.             gateway.setProtocol(Protocols.PDU);  
  63.             // Do we want the Gateway to be used for Inbound messages?  
  64.             gateway.setInbound(true);  
  65.             // Do we want the Gateway to be used for Outbound messages?  
  66.             gateway.setOutbound(true);  
  67.             // Let SMSLib know which is the SIM PIN.  
  68.             gateway.setSimPin("0000");  
  69.             // Set up the notification methods.  
  70.             Service.getInstance().setInboundMessageNotification(inboundNotification);  
  71.             Service.getInstance().setCallNotification(callNotification);  
  72.             Service.getInstance().setGatewayStatusNotification(statusNotification);  
  73.             Service.getInstance().setOrphanedMessageNotification(orphanedMessageNotification);  
  74.             // Add the Gateway to the Service object.  
  75.             Service.getInstance().addGateway(gateway);  
  76.             // Similarly, you may define as many Gateway objects, representing  
  77.             // various GSM modems, add them in the Service object and control all of them.  
  78.             // Start! (i.e. connect to all defined Gateways)  
  79.             Service.getInstance().startService();  
  80.             // Printout some general information about the modem.  
  81.             System.out.println();  
  82.             System.out.println("Modem Information:");  
  83.             System.out.println("  Manufacturer: " + gateway.getManufacturer());  
  84.             System.out.println("  Model: " + gateway.getModel());  
  85.             System.out.println("  Serial No: " + gateway.getSerialNo());  
  86.             System.out.println("  SIM IMSI: " + gateway.getImsi());  
  87.             System.out.println("  Signal Level: " + gateway.getSignalLevel() + " dBm");  
  88.             System.out.println("  Battery Level: " + gateway.getBatteryLevel() + "%");  
  89.             System.out.println();  
  90.             // In case you work with encrypted messages, its a good time to declare your keys.  
  91.             // Create a new AES Key with a known key value.   
  92.             // Register it in KeyManager in order to keep it active. SMSLib will then automatically  
  93.             // encrypt / decrypt all messages send to / received from this number.  
  94.             Service.getInstance().getKeyManager().registerKey("+306948494037",   
  95. new AESKey(new SecretKeySpec("0011223344556677".getBytes(), "AES")));  
  96.             // Read Messages. The reading is done via the Service object and  
  97.             // affects all Gateway objects defined. This can also be more directed to a specific  
  98.             // Gateway - look the JavaDocs for information on the Service method calls.  
  99.             msgList = new ArrayList<InboundMessage>();  
  100.             Service.getInstance().readMessages(msgList, MessageClasses.ALL);  
  101.             for (InboundMessage msg : msgList)  
  102.                 System.out.println(msg);  
  103.             // Sleep now. Emulate real world situation and give a chance to the notifications  
  104.             // methods to be called in the event of message or voice call reception.  
  105.             System.out.println("Now Sleeping - Hit <enter> to stop service.");  
  106.             System.in.read();  
  107.             System.in.read();  
  108.         }  
  109.         catch (Exception e)  
  110.         {  
  111.             e.printStackTrace();  
  112.         }  
  113.         finally  
  114.         {  
  115.             Service.getInstance().stopService();  
  116.         }  
  117.     }  
  118.   
  119.     public class InboundNotification implements IInboundMessageNotification  
  120.     {  
  121.         public void process(AGateway gateway, MessageTypes msgType, InboundMessage msg)  
  122.         {  
  123.             if (msgType == MessageTypes.INBOUND) System.out.println(">>> New Inbound message detected from Gateway: "   
  124. + gateway.getGatewayId());  
  125.             else if (msgType == MessageTypes.STATUSREPORT) System.out.println(">>> New Inbound Status " +   
  126. "Report message detected from Gateway: " + gateway.getGatewayId());  
  127.             System.out.println(msg);  
  128.         }  
  129.     }  
  130.   
  131.     public class CallNotification implements ICallNotification  
  132.     {  
  133.         public void process(AGateway gateway, String callerId)  
  134.         {  
  135.             System.out.println(">>> New call detected from Gateway: " + gateway.getGatewayId() + " : " + callerId);  
  136.         }  
  137.     }  
  138.   
  139.     public class GatewayStatusNotification implements IGatewayStatusNotification  
  140.     {  
  141.         public void process(AGateway gateway, GatewayStatuses oldStatus, GatewayStatuses newStatus)  
  142.         {  
  143.             System.out.println(">>> Gateway Status change for " + gateway.getGatewayId() + ", OLD: " + oldStatus + " -> NEW: " + newStatus);  
  144.         }  
  145.     }  
  146.   
  147.     public class OrphanedMessageNotification implements IOrphanedMessageNotification  
  148.     {  
  149.         public boolean process(AGateway gateway, InboundMessage msg)  
  150.         {  
  151.             System.out.println(">>> Orphaned message part detected from " + gateway.getGatewayId());  
  152.             System.out.println(msg);  
  153.             // Since we are just testing, return FALSE and keep the orphaned message part.  
  154.             return false;  
  155.         }  
  156.     }  
  157.   
  158.     public static void main(String args[])  
  159.     {  
  160.         ReadMessages app = new ReadMessages();  
  161.         try  
  162.         {  
  163.             app.doIt();  
  164.         }  
  165.         catch (Exception e)  
  166.         {  
  167.             e.printStackTrace();  
  168.         }  
  169.     }  
  170. }  
复制代码




三、Linux、Unix、Solaris平台

与window平台不同的地方就在于动态库和二次开发包不一致,其它基本类似
rxtx与comm的编码方式是不一样的。

1、下载RxTx v2.1.7 R2
2、解压,目录结构如下图所示:


                                                                        图4-1

3、运行环境配置
  • 复制图4-1中Linux目录下的librxtxSerial.so文件至$JAVA_HOME/jre/lib/$(ARCH)/目录下,复制RXTXcomm.jar到应用程序的CLASSPATH或$JAVA_HOME/jre/lib/ext目录下
  • 复制图3-1中的javax.comm.properties文件至$JAVA_HOME/jre/lib目录下,并将文件中的Driver=com.sun.comm.Win32Driver改成Driver=gnu.io.CommDriver。文件内容如下图所示:
  • 184258gw66j2us0z20ssmz.jpg
4、修改示例程序,编译并运行



四、短信收发设备可用端口检测程序
  1. import gnu.io.*;  
  2. import java.util.*;  
  3. import java.io.*;  
  4.   
  5. public class CommTest  
  6. {  
  7.     static CommPortIdentifier portId;  
  8.     static Enumeration portList;  
  9.     static int bauds[] = { 9600, 19200, 57600, 115200 };    //检测端口所支持的波特率  
  10.   
  11.     public static void main(String[] args)  
  12.     {  
  13.         portList = CommPortIdentifier.getPortIdentifiers();  
  14.         System.out.println("短信设备端口连接测试...");  
  15.         while (portList.hasMoreElements())  
  16.         {  
  17.             portId = (CommPortIdentifier) portList.nextElement();  
  18.             if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL)  
  19.             {  
  20.                 System.out.println("找到串口: " + portId.getName());  
  21.                 for (int i = 0; i < bauds.length; i++)  
  22.                 {  
  23.                     System.out.print("  Trying at " + bauds[i] + "...");  
  24.                     try  
  25.                     {  
  26.                         SerialPort serialPort;  
  27.                         InputStream inStream;  
  28.                         OutputStream outStream;  
  29.                         int c;  
  30.                         String response;  
  31.                         serialPort = (SerialPort) portId.open("SMSLibCommTester", 1971);  
  32.                         serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_RTSCTS_IN);  
  33.                         serialPort.setSerialPortParams(bauds[i], SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);  
  34.                         inStream = serialPort.getInputStream();  
  35.                         outStream = serialPort.getOutputStream();  
  36.                         serialPort.enableReceiveTimeout(1000);  
  37.                         c = inStream.read();  
  38.                         while (c != -1)  
  39.                             c = inStream.read();  
  40.                         outStream.write('A');  
  41.                         outStream.write('T');  
  42.                         outStream.write('\r');  
  43.                         try  
  44.                         {  
  45.                             Thread.sleep(1000);  
  46.                         }  
  47.                         catch (Exception e)  
  48.                         {  
  49.                         }  
  50.                         response = "";  
  51.                         c = inStream.read();  
  52.                         while (c != -1)  
  53.                         {  
  54.                             response += (char) c;  
  55.                             c = inStream.read();  
  56.                         }  
  57.                         if (response.indexOf("OK") >= 0)  
  58.                         {  
  59.                             try  
  60.                             {  
  61.                                 System.out.print("  获取设备信息...");  
  62.                                 outStream.write('A');  
  63.                                 outStream.write('T');  
  64.                                 outStream.write('+');  
  65.                                 outStream.write('C');  
  66.                                 outStream.write('G');  
  67.                                 outStream.write('M');  
  68.                                 outStream.write('M');  
  69.                                 outStream.write('\r');  
  70.                                 response = "";  
  71.                                 c = inStream.read();  
  72.                                 while (c != -1)  
  73.                                 {  
  74.                                     response += (char) c;  
  75.                                     c = inStream.read();  
  76.                                 }  
  77.                                 System.out.println("  发现设备: " + response.replaceAll("\\s+OK\\s+", "").replaceAll("\n", "").replaceAll("\r", ""));  
  78.                             }  
  79.                             catch (Exception e)  
  80.                             {  
  81.                                 System.out.println("  没有发现设备!");  
  82.                             }  
  83.                         }  
  84.                         else System.out.println("  没有发现设备!");  
  85.                         serialPort.close();  
  86.                     }  
  87.                     catch (Exception e)  
  88.                     {  
  89.                         System.out.println("  没有发现设备!");  
  90.                     }  
  91.                 }  
  92.             }  
  93.         }  
  94.     }  
  95. }
复制代码




五、短信收发设备使用minicom检测

1、linux下端口配置

软件安装完毕后,采用minicom进行配置

执行sudo minicom -s,进入配置界面,

184306m9nk85j4nwwpd8dw.jpg

在第三项『串口配置』,设置端口为全面查询到的端口,速率是9600(根据短信收发设备来定,不同的厂家可能会不一样)


184310r0vlo3h3fvgg3u33.jpg
Serial Device :/dev/ttyS1(此为串口端口,可以在ttyS0~~ttyS4中挨个试)


然后在主菜单Save setup as dfl

可选择Exit推出配置进入minicom,就可以使用at命令测试配置是否成功;也可选择Exit from Minicom推出minicom。

接下在再次执行minicom,进入主界面,这时候应该就可以输入AT指令了。要注意的是,我是重新插拔了一下短信收发才成功连上的

六、minicom使用方法

1、启动minicom命令

   sudo miniscom

2、输入命令

   同时按Ctrl+a 后按e键,不按e键不能输入命令。

   输入at回车,会输出OK。证明短信收发设备连接成功。如果没有返回可以修改端口再试

  at发短信命令 at+cmgs=手机号码

  ctrl+z发送短信

3、退出命令

   同时按Ctrl+a 后按x键

七、linux虚拟机需要注意是否共享串口

    184459ilcfr9rub9i78j2j.jpg
配置成功后会在“vm”菜单中看到共享的端口

八、java环境变量

注意事项:

1、使用smslib库之前,如果你的设备是usb数据线,先检查系统中该设备驱动程序是否已安装,在window环境下,厂商一般会提供设备的驱动程序,在linux环境下,内核2.6.32或以上版本,预装了常用设备的USB转串口驱动,如果系统未自动识别该设备,就需要自行安装该设备的驱动程序了。

2、在开发过程中,org.smslib.TimeoutException: No response from device是最常遇到的一个异常,解决方案请参考:短信收发设备JAVA二次开发包SMSLib,org.smslib.TimeoutException: No response from device解决方案

4、判断是否设备出问题可按照下面文章进行测试:短信短信收发通过超级终端进行配置和调试

5、如上面问题解决不了你的问题可以跟贴子看看有没正在开发的网友一起交流下



相关附件下载(论坛注册后可下载)

smslib-3.5.4.jarJDK1.7以上版本 smslib-3.5.4.jar (347.95 KB, 下载次数: 8888)
184246buwznywzfiyae5yd.jpg
 楼主| 发表于 2017-6-9 22:03:27 | 显示全部楼层
jdk1.7,32位java环境下,调试smslib3.5.4+rxtx2.2(32位调试视频)
视频清晰度有限,源地址:http://v.youku.com/v_show/id_XMjgxNDMwNDY0OA
 楼主| 发表于 2016-7-7 12:50:36 | 显示全部楼层
QQ截图20160707124523.png
如配置完,调试例子出现上面图上错误
一般是串口通讯库没有配置成功,也可以说是找不到端口。
解决办法:
1,检查短信猫虚拟出来的端口号(com)是否与你例子配置的端口一致
2、波特率是否与短信猫设备默认波特率一致
3、看看项目启用的是那个jre,看看对应jre目录下有没通许库的动态文件存在
4、操作系统是否安装了两个版本jdk,查看电脑当前jdk使用版本是否与项目启用的jdk一致

上面4个解决点解决后基本上是能解决图上出现问题的,如果不能解决再另外处理
发表于 2016-9-2 15:49:49 | 显示全部楼层
你好,问个问题:短信猫怎么监听有新短信?
 楼主| 发表于 2016-9-5 11:42:02 | 显示全部楼层
libo0568 发表于 2016-9-2 07:49
你好,问个问题:短信猫怎么监听有新短信?

你好,可以看看这帖子的回答http://bbs.csdn.net/topics/360001595

采用新版本的smslib

this.srv.readMessages(msgList, MessageClasses.ALL);
你这句代码读的是全部的短信,MessageClasses.READ 已读短信, MessageClasses.UNREAD 未读短信。

问题1:我也发了帖子问了这个,没人回答。
问题2: 我用3.5.0版本的自带有监听器,应该是实时监听的。
我们需要实现一个接口来实现回调方法:
先实现接口:IInboundMessageNotification,
然后实现方法:void process(AGateway gateway, MessageTypes msgType, InboundMessage msg)。
从方法可以看出,传入的参数为:网关,短信类型,进站短信。
这样子,当收到短信的时候这个方法会被自动调用,你就得到短信,就可以做后续处理了,
 楼主| 发表于 2016-9-5 11:52:14 | 显示全部楼层
libo0568 发表于 2016-9-2 07:49
你好,问个问题:短信猫怎么监听有新短信?

这是设备直接串口的监听实现过程,看图
cnmi为2,1时
如果串口反馈到+CMTI: "SM",1    //CMTI: "储存的位置",短信所在序列号,储存位置可以用cpms改变SM,ME,MT,SR等,根据你的猫支持的进行设置,一般是SM
cnmi为2,2时
串口反馈+CMT: "+86手机号码",,“接收时间”

有短信是串口自动反馈信息的。
有对应的返回时你自己去执行cmgr或者cmgl指令进行获取你的短信即可

如果你只是想用smslib来实现,自己去把源码工程下载下来,看看InboundMessage.java了。

发表于 2017-1-12 14:37:23 | 显示全部楼层
2017-01-12 14:30:50 [日志信息] Version: 3.5.2
2017-01-12 14:30:50 [日志信息] JRE Version: 1.7.0_09
2017-01-12 14:30:50 [日志信息] JRE Impl Version: 23.5-b02
2017-01-12 14:30:50 [日志信息] O/S: Windows 7 / x86 / 6.1
2017-01-12 14:30:50 [日志信息] Initialized.
2017-01-12 14:30:50 [日志信息] Running...
2017-01-12 14:30:50 [日志信息] NotifyQueueManager running...
2017-01-12 14:30:52 [日志信息] Queue directory not defined. Queued messages will not be saved to filesystem.
2017-01-12 14:30:52 [日志信息] Initialized.
2017-01-12 14:30:52 [日志信息] Running...
2017-01-12 14:30:52 [日志信息] DelayQueueManager running...
2017-01-12 14:30:52 [日志信息] Initialized.
2017-01-12 14:30:52 [日志信息] Running...
2017-01-12 14:30:52 [日志信息] GTW: modem.com3: Starting gateway, using Wavecom (Generic) AT Handler.
2017-01-12 14:30:52 [日志信息] GTW: modem.com3: Opening: COM3 @9600
2017-01-12 14:30:52 [日志信息] Initialized.
2017-01-12 14:30:52 [日志信息] Running...
2017-01-12 14:30:52 [日志信息] Initialized.
2017-01-12 14:30:52 [日志信息] ** disabled **
2017-01-12 14:30:52 [日志信息] GTW: modem.com3: ModemReader thread started.
2017-01-12 14:30:52 [日志信息] GTW: modem.com3: AsyncNotifier thread started.
2017-01-12 14:30:52 [日志信息] GTW: modem.com3: AsyncMessageProcessor thread started.
2017-01-12 14:30:52 [日志信息] GTW: modem.com3: clearBuffer() called.
2017-01-12 14:30:53 [日志信息] GTW: modem.com3: SEND 27)
2017-01-12 14:30:53 [日志信息] GTW: modem.com3: SEND :+++
2017-01-12 14:30:53 [日志信息] GTW: modem.com3: SEND :ATZ(cr)
2017-01-12 14:30:54 [日志信息] GTW: modem.com3: clearBuffer() called.
2017-01-12 14:30:55 [日志信息] GTW: modem.com3: SEND :AT+CFUN=1(cr)
2017-01-12 14:31:05 [日志信息] GTW: modem.com3: clearBuffer() called.
2017-01-12 14:31:06 [日志信息] GTW: modem.com3: SEND :ATZ(cr)
2017-01-12 14:31:06 [日志信息] GTW: modem.com3: SEND :ATE0(cr)
2017-01-12 14:31:06 [日志信息] GTW: modem.com3: clearBuffer() called.
2017-01-12 14:31:07 [日志信息] Running...
2017-01-12 14:31:07 [日志信息] GTW: modem.com3: SEND :AT+CPIN?(cr)
2017-01-12 14:31:22 [日志信息] Running...
2017-01-12 14:31:22 [日志信息] ** disabled **
2017-01-12 14:31:22 [日志信息] GTW: modem.com3: Buffer contents on timeout: ???
2017-01-12 14:31:22 [日志信息] Stopped.
2017-01-12 14:31:22 [日志信息] Stopped.
2017-01-12 14:31:22 [日志信息] GTW: modem.com3: AsyncNotifier thread ended.
2017-01-12 14:31:22 [日志信息] GTW: modem.com3: AsyncMessageProcessor thread ended.
2017-01-12 14:31:22 [日志信息] GTW: modem.com3: ModemReader thread ended.
2017-01-12 14:31:22 [日志信息] GTW: modem.com3: Closing: COM3 @9600
2017-01-12 14:31:23 [日志信息] NotifyQueueManager end...
2017-01-12 14:31:23 [日志信息] DelayQueueManager end...
2017-01-12 14:31:23 [日志信息] Running...
2017-01-12 14:31:23 [日志信息] NotifyQueueManager running...
2017-01-12 14:31:23 [日志信息] Stopped.
2017-01-12 14:31:23 [日志信息] GTW: modem.com3: Stopping gateway...
2017-01-12 14:31:23 [日志信息] GTW: modem.com3: SEND :AT+WATH=31(cr)
java.io.IOException: write error

        at com.sun.comm.Win32SerialPort.write(Win32SerialPort.java:677)
        at com.sun.comm.Win32SerialOutputStream.write(Win32SerialOutputStream.java:38)
        at org.smslib.modem.SerialModemDriver.write(SerialModemDriver.java:166)
        at org.smslib.modem.AModemDriver.write(AModemDriver.java:302)
        at org.smslib.modem.athandler.ATHandler_Wavecom.done(ATHandler_Wavecom.java:52)
        at org.smslib.modem.ModemGateway.stopGateway(ModemGateway.java:198)
        at org.smslib.Service.stopService(Service.java:354)
        at org.smslib.Service.startService(Service.java:233)
        at org.smslib.Service.startService(Service.java:196)
        at com.controller.SendMessage.doIt(SendMessage.java:27)
        at com.controller.FMSGCallBack.invoke(FMSGCallBack.java:95)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:601)
        at com.sun.jna.CallbackReference$DefaultCallbackProxy.invokeCallback(CallbackReference.java:444)
        at com.sun.jna.CallbackReference$DefaultCallbackProxy.callback(CallbackReference.java:474)
发表于 2017-1-12 14:38:01 | 显示全部楼层
请问一下这是什么原因
发表于 2017-1-12 14:39:23 | 显示全部楼层
我的代码:
package com.controller;

import org.smslib.AGateway;
import org.smslib.IOutboundMessageNotification;
import org.smslib.Library;
import org.smslib.OutboundMessage;
import org.smslib.Service;
import org.smslib.modem.SerialModemGateway;

public class SendMessage
{
        public void doIt() throws Exception
        {
                OutboundNotification outboundNotification = new OutboundNotification();
                System.out.println("Example: Send message from a serial gsm modem.");
                System.out.println(Library.getLibraryDescription());
                System.out.println("Version: " + Library.getLibraryVersion());
                SerialModemGateway gateway = new SerialModemGateway("modem.com3", "COM3", 9600, "Wavecom", "");
                gateway.setInbound(true);
                gateway.setOutbound(true);
                gateway.setSimPin("0000");
                // Explicit SMSC address set is required for some modems.
                // Below is for VODAFONE GREECE - be sure to set your own!
                gateway.setSmscNumber("+8613008197212");
                Service.getInstance().setOutboundMessageNotification(outboundNotification);
                Service.getInstance().addGateway(gateway);
                Service.getInstance().startService();
                System.out.println();
                System.out.println("Modem Information:");
                System.out.println("  Manufacturer: " + gateway.getManufacturer());
                System.out.println("  Model: " + gateway.getModel());
                System.out.println("  Serial No: " + gateway.getSerialNo());
                System.out.println("  SIM IMSI: " + gateway.getImsi());
                System.out.println("  Signal Level: " + gateway.getSignalLevel() + " dBm");
                System.out.println("  Battery Level: " + gateway.getBatteryLevel() + "%");
                System.out.println();
                OutboundMessage msg = new OutboundMessage("136888041107", "Hello from SMSLib!");
                Service.getInstance().sendMessage(msg);
                System.out.println(msg);
                System.out.println("Now Sleeping - Hit <enter> to terminate.");
                System.in.read();
                Service.getInstance().stopService();
        }

        public class OutboundNotification implements IOutboundMessageNotification
        {
                public void process(AGateway gateway, OutboundMessage msg)
                {
                        System.out.println("Outbound handler called from Gateway: " + gateway.getGatewayId());
                        System.out.println(msg);
                }
        }

        public static void main(String args[])
        {
                SendMessage app = new SendMessage();
                try
                {
                        app.doIt();
                }
                catch (Exception e)
                {
                        e.printStackTrace();
                }
        }
}
 楼主| 发表于 2017-2-13 17:36:46 | 显示全部楼层
yijianxiaoao 发表于 2017-1-12 06:39
我的代码:
package com.controller;
2017-01-12 14:31:06 [日志信息] GTW: modem.com3: clearBuffer() called.
2017-01-12 14:31:07 [日志信息] Running...
2017-01-12 14:31:07 [日志信息] GTW: modem.com3: SEND :AT+CPIN?(cr)
2017-01-12 14:31:22 [日志信息] Running...
2017-01-12 14:31:22 [日志信息] ** disabled **
2017-01-12 14:31:22 [日志信息] GTW: modem.com3: Buffer contents on timeout: ???
AT+CPIN?你问题就是这个指令过不去,用最新版,在开源里面去掉这个指令的执行就可以了,因为这个指令,你的卡获取的太慢导致程序返回串口写入超时,导致无法进行下去
你也可以直接换卡也行
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|小黑屋|未来时代科技 ( 粤ICP备12044031号-1

GMT+8, 2024-3-28 20:42 , Processed in 0.091674 second(s), 36 queries .

Powered by WLSD X3.1

© 2013-2014 WLSD Inc.

快速回复 返回顶部 返回列表
 
【电话】(15118131494)
【QQ】 未来时代科技01 售前咨询
【QQ】 未来时代科技02 售后技术
【旺旺】 请问有什么可以帮到您?不在线可留言.
【邮箱】
inextera@sina.com
【地址】 (深圳市龙岗坂田扬马小区)