SMSLib开发指南

来源:互联网 发布:三国志13武将数据 编辑:程序博客网 时间:2024/06/05 15:28

SMSLib开发指南


一、SMSLib简介

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

                                                                                                                                                                      图1-1

二、Window平台


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

                                                                        图2-1


                                                                        图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)动态库,并解压,目录结构如下图所示:


                                                                        图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

4、运行示例程序并测试
      修改图2-1中src\java\examples\modem目录下的SendMessage.java和ReadMessages.java程序发送短信的参数配置,编译并运行。如下图所示:
[java] view plaincopy
  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. }  
[java] view plaincopy
  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。文件内容如下图所示:
4、修改示例程序,编译并运行

四、短信猫设备可用端口检测程序
[java] view plaincopy
  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[] = { 96001920057600115200 };    //检测端口所支持的波特率  
  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,进入配置界面,


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


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虚拟机需要注意是否共享串口

  
配置成功后会在“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解决方案


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 宝宝发烧40多度怎么办 7岁宝宝发烧了怎么办 宝宝反复发烧39度怎么办 一岁半宝宝反复发烧39度怎么办 七岁发烧38度怎么办 小孩一直37度1怎么办 婴儿一直37度多怎么办 1岁半高烧39度怎么办 反复发烧39度多怎么办 孩子不爱喝水怎么办%3f 8岁儿童不爱喝水怎么办 儿子14岁了不爱说话怎么办 我孩子长得老慢怎么办 老公嫌你烦了怎么办 2岁宝宝吃饭不嚼怎么办 2岁宝宝挑食厌食怎么办 孩子不爱和家长交流怎么办 孩子发烧在医院查不出病因怎么办 宝宝乳牙长歪了怎么办 两岁宝宝不爱吃水果怎么办 两岁宝宝不吃水果怎么办 一岁的宝宝上火了怎么办 吃水果嘴唇肿了怎么办 二岁宝宝不爱吃饭怎么办 小婴儿便秘但不爱喝水怎么办 宝宝只吃水果不吃饭怎么办 一岁宝宝不喜欢吃水果怎么办 1岁宝宝不吃水果怎么办 一岁半宝宝吃水果拉肚子怎么办 大人发烧了怎么办如何退烧 怀孕后不爱吃水果怎么办 不敢吃水果了怕虫怎么办 宝宝发烧38度不出汗怎么办 1岁宝宝喜欢含饭怎么办 3岁宝宝喜欢含饭怎么办 孩子咳嗽发烧怎么办最有效 孩子咳嗽打哈切流鼻涕发烧怎么办 孩子香蕉吃多了怎么办 80多岁老人发烧怎么办 小孩香蕉吃多了怎么办 7个月宝宝缺钙怎么办