Java calls with a single port SMSLib send SMS text messages cat Comments

Tech Corner

Current position: SMS cat homepage > Tech Corner >

[Reserved] Java call SMSLib send SMS text messages using single-port Cat Comments

Published: 2017/02/09 Hits:620

SMSLib Apache is an open source project

to send text messages in several ways:
1, apply to the local carrier gateway does not require additional equipment to send text messages using the API call other procedures provided for large communications companies. Stability, speed, suitable for the needs of particularly large amount of text messages, need to be connected to the operator's network, does not fit within the network project. 
2, SMS cat send SMS , GSM MODEM device by means such as, to send text messages via a data line connected to the computer, this method is more suitable for smaller companies and individuals. You do not need networking, slow, it simply is invoked by text message cat equipment texting, texting card price to see the package, suitable for small projects. 


SMS cat send text messages device
3, the Internet messaging platforms, made by a professional on the internet site generation of messaging texting data, dependent on the site is too high, speed, price Choice SMS platform, the platform for some fast speed, stable but the price is high. Not fit within the network project.  
4, network messaging platforms, SMS cat and in fact no difference, that is, separate the text messaging function to make a product, there are dozens of cards at the same time support even hair products, speed is not slow, SMS load are doing very well, we own the company also has a similar product, but relatively large, cumbersome installation, these products are usually more expensive prices.

Ultimately, we chose to use SMS cat to send text messages, SMS is expected to amount about 1000 a day, not too big, and the network project, not connected to external networks and the Internet.
因为怕后期短信量增大,一张卡每天发送短信太多会被运营商认为发送垃圾短信封掉,所以开始设备选择了4核的短信猫,能放4张卡,可惜设备驱动不支持,后来又换成了普通的短信猫,串口 GSM的,下面说说java程序如何和短信猫通信发送短信。
操作短信猫需要发送AT指令(就是一套控制短信设备的标准执行,详情可以百度一下),因为短信猫是串口设备,Java需要与串口进行通讯,发送 AT指令。
既然都是标准,通常就有现成的组件,发送指令控制短信猫等功能可以使用SMSLib这个开源组件完成,SMSLib是Apache的一个开源项目。程序与串口通讯也有很多组件,SMSLib官网上提供了两种: 
JavaComm只支持32位的windows,我们是windows server 2008 64位版本,只能选择RxTx来与串口通信。最终依赖jar包有4个:
windows和串口通讯还需要依赖操作系统的功能,所以 RxTx还需要将  rxtxParallel.dll 和  rxtxSerial.dll 放到jdk目录中,官方的安装说明非常详细了。
rxtxSerial.dll ---> <JAVA_HOME>\jre\bin
     rxtxParallel.dll ---> <JAVA_HOME>\jre\bin
     RXTXcomm.jar只要放到classpath下就行,不用非得放到jre\lib\ext下面
接下来就可以写代码了,代码其实也不复杂:
package com.piaohan.sms;

import org.smslib.Message.MessageEncodings;
import org.smslib.OutboundMessage;
import org.smslib.Service;
import org.smslib.modem.SerialModemGateway;

public class SMSDemo {

<span class="hljs-function"><span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: 700;">public</span> <span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: 700;">static</span> <span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: 700;">void</span> <span class="hljs-title" style="color: rgb(136, 0, 0); font-weight: bold;">main</span><span class="hljs-params">(String args[])</span> <span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: 700;">throws</span> Exception </span>{

    <span class="hljs-comment" style="color: rgb(136, 136, 136);">// ---------------创建串口设备,如果有多个,就创建多个--------------</span>
    <span class="hljs-comment" style="color: rgb(136, 136, 136);">// 1、你自己连接网关的id</span>
    <span class="hljs-comment" style="color: rgb(136, 136, 136);">// 2、com口名称,如COM1或/dev/ttyS1(根据实际情况修改)</span>
    <span class="hljs-comment" style="color: rgb(136, 136, 136);">// 3、串口波特率,如9600(根据实际情况修改)</span>
    <span class="hljs-comment" style="color: rgb(136, 136, 136);">// 4、开发商,如Apple</span>
    <span class="hljs-comment" style="color: rgb(136, 136, 136);">// 5、型号,如iphone4s</span>
    SerialModemGateway gateway = <span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: 700;">new</span> SerialModemGateway(<span class="hljs-string" style="color: rgb(136, 0, 0);">"SMS"</span> , <span class="hljs-string" style="color: rgb(136, 0, 0);">"COM3"</span>,
            <span class="hljs-number" style="color: rgb(136, 0, 0);">9600</span>, <span class="hljs-string" style="color: rgb(136, 0, 0);">""</span>, <span class="hljs-string" style="color: rgb(136, 0, 0);">""</span>);

    gateway.setInbound( <span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: 700;">true</span>); <span class="hljs-comment" style="color: rgb(136, 136, 136);">// 设置true,表示该网关可以接收短信</span>
    gateway.setOutbound( <span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: 700;">true</span>); <span class="hljs-comment" style="color: rgb(136, 136, 136);">// 设置true,表示该网关可以发送短信</span>

    <span class="hljs-comment" style="color: rgb(136, 136, 136);">// -----------------创建发送短信的服务(它是单例的)----------------</span>
    Service service = Service. getInstance();

    <span class="hljs-comment" style="color: rgb(136, 136, 136);">// ---------------------- 将设备加到服务中----------------------</span>
    service.addGateway(gateway);

    <span class="hljs-comment" style="color: rgb(136, 136, 136);">// ------------------------- 启动服务 -------------------------</span>
    service.startService();

    <span class="hljs-comment" style="color: rgb(136, 136, 136);">// ------------------------- 发送短信 -------------------------</span>
    OutboundMessage msg = <span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: 700;">new</span> OutboundMessage(<span class="hljs-string" style="color: rgb(136, 0, 0);">"187xxxxxxxx"</span> , <span class="hljs-string" style="color: rgb(136, 0, 0);">"Hello World"</span>);
    msg.setEncoding(MessageEncodings. ENCUCS2);

    service.sendMessage(msg);

    <span class="hljs-comment" style="color: rgb(136, 136, 136);">// ------------------------- 关闭服务 -------------------------</span>
    service.stopService();
}

}


代码不多,但是第一次弄这个时候搞了好久,碰到的问题不少,主要在于串口配置那,串口名称,波特率不知道,其实windows下可以通过“设备管理器”来查看。

也可以使用下面代码来检测端口设备:
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;

import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;

/**

  • CommTest 检测端口
    /
    public class ComTone {
    /
    * 常见端口波特率 */
    public static int bauds[] = { 9600, 19200, 57600, 115200 };

    @SuppressWarnings( “unchecked” )
    public static void main(String[] args) {

     Enumeration&lt;CommPortIdentifier&gt; portList = CommPortIdentifier
             . getPortIdentifiers();
    
     <span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: 700;">long</span> st = System. currentTimeMillis();
    
     System. out.<span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: 700;">println</span>( <span class="hljs-string" style="color: rgb(136, 0, 0);">"短信设备端口连接测试..."</span> );
    
     <span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: 700;">while</span> (portList.hasMoreElements()) {
    
         CommPortIdentifier portId = (CommPortIdentifier) portList
                 .nextElement();
    
         <span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: 700;">if</span> (portId.getPortType() == CommPortIdentifier.PORT_SERIAL ) {
             System. out.<span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: 700;">println</span>( <span class="hljs-string" style="color: rgb(136, 0, 0);">"找到串口:"</span> + portId.getName() + <span class="hljs-string" style="color: rgb(136, 0, 0);">"\t类型:"</span>
                     + getPortTypeName(portId.getPortType()));
    
             <span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: 700;">for</span> ( <span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: 700;">int</span> i = <span class="hljs-number" style="color: rgb(136, 0, 0);">0</span>; i &lt; bauds. length; i++) {
                 System. out.<span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: 700;">print</span>( <span class="hljs-string" style="color: rgb(136, 0, 0);">"  Trying at "</span> + bauds [i] + <span class="hljs-string" style="color: rgb(136, 0, 0);">"..."</span> );
                 <span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: 700;">try</span> {
                     SerialPort serialPort;
                     InputStream inStream;
                     OutputStream outStream;
                     <span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: 700;">int</span> c;
                     String response;
                     serialPort = (SerialPort) portId.open(
                             <span class="hljs-string" style="color: rgb(136, 0, 0);">"SMSLibCommTester"</span> , <span class="hljs-number" style="color: rgb(136, 0, 0);">1000</span>);
                     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(<span class="hljs-number" style="color: rgb(136, 0, 0);">1000</span>);
                     c = inStream.<span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: 700;">read</span>();
                     <span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: 700;">while</span> (c != -<span class="hljs-number" style="color: rgb(136, 0, 0);">1</span>)
                         c = inStream.<span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: 700;">read</span>();
                     outStream.<span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: 700;">write</span>( <span class="hljs-string" style="color: rgb(136, 0, 0);">'A'</span>);
                     outStream.<span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: 700;">write</span>( <span class="hljs-string" style="color: rgb(136, 0, 0);">'T'</span>);
                     outStream.<span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: 700;">write</span>( <span class="hljs-string" style="color: rgb(136, 0, 0);">'\r'</span>);
                     <span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: 700;">try</span> {
                         Thread. sleep(<span class="hljs-number" style="color: rgb(136, 0, 0);">1000</span>);
                     } <span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: 700;">catch</span> (Exception e) {
                     }
                     response = <span class="hljs-string" style="color: rgb(136, 0, 0);">""</span>;
                     c = inStream.<span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: 700;">read</span>();
                     <span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: 700;">while</span> (c != -<span class="hljs-number" style="color: rgb(136, 0, 0);">1</span>) {
                         response += ( <span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: 700;">char</span>) c;
                         c = inStream.<span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: 700;">read</span>();
                     }
                     <span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: 700;">if</span> (response.indexOf( <span class="hljs-string" style="color: rgb(136, 0, 0);">"OK"</span> ) &gt;= <span class="hljs-number" style="color: rgb(136, 0, 0);">0</span>) {
                         <span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: 700;">try</span> {
                             System. out.<span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: 700;">print</span>( <span class="hljs-string" style="color: rgb(136, 0, 0);">"  获取设备信息..."</span> );
                             outStream.<span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: 700;">write</span>( <span class="hljs-string" style="color: rgb(136, 0, 0);">'A'</span>);
                             outStream.<span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: 700;">write</span>( <span class="hljs-string" style="color: rgb(136, 0, 0);">'T'</span>);
                             outStream.<span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: 700;">write</span>( <span class="hljs-string" style="color: rgb(136, 0, 0);">'+'</span>);
                             outStream.<span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: 700;">write</span>( <span class="hljs-string" style="color: rgb(136, 0, 0);">'C'</span>);
                             outStream.<span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: 700;">write</span>( <span class="hljs-string" style="color: rgb(136, 0, 0);">'G'</span>);
                             outStream.<span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: 700;">write</span>( <span class="hljs-string" style="color: rgb(136, 0, 0);">'M'</span>);
                             outStream.<span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: 700;">write</span>( <span class="hljs-string" style="color: rgb(136, 0, 0);">'M'</span>);
                             outStream.<span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: 700;">write</span>( <span class="hljs-string" style="color: rgb(136, 0, 0);">'\r'</span>);
                             response = <span class="hljs-string" style="color: rgb(136, 0, 0);">""</span>;
                             c = inStream.<span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: 700;">read</span>();
                             <span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: 700;">while</span> (c != -<span class="hljs-number" style="color: rgb(136, 0, 0);">1</span>) {
                                 response += ( <span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: 700;">char</span>) c;
                                 c = inStream.<span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: 700;">read</span>();
                             }
                             System. out.<span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: 700;">println</span>( <span class="hljs-string" style="color: rgb(136, 0, 0);">"  发现设备: "</span>
                                     + response.replaceAll(<span class="hljs-string" style="color: rgb(136, 0, 0);">"\\s+OK\\s+"</span> , <span class="hljs-string" style="color: rgb(136, 0, 0);">""</span>)
                                             .replaceAll(<span class="hljs-string" style="color: rgb(136, 0, 0);">"\n"</span> , <span class="hljs-string" style="color: rgb(136, 0, 0);">""</span>)
                                             .replaceAll(<span class="hljs-string" style="color: rgb(136, 0, 0);">"\r"</span> , <span class="hljs-string" style="color: rgb(136, 0, 0);">""</span>));
                         } <span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: 700;">catch</span> (Exception e) {
                             System. out.<span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: 700;">println</span>( <span class="hljs-string" style="color: rgb(136, 0, 0);">"  没有发现设备!"</span> );
                         }
                     } <span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: 700;">else</span>
                         System. out.<span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: 700;">println</span>( <span class="hljs-string" style="color: rgb(136, 0, 0);">"  没有发现设备!"</span> );
                     serialPort.close();
                 } <span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: 700;">catch</span> (Exception e) {
                     System. out.<span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: 700;">println</span>( <span class="hljs-string" style="color: rgb(136, 0, 0);">"  没有发现设备!"</span> );
                 }
             }
             System. out.<span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: 700;">println</span>( <span class="hljs-string" style="color: rgb(136, 0, 0);">"找到串口: "</span> + portId.getName());
         }
     }
     <span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: 700;">long</span> et = System. currentTimeMillis();
     <span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: 700;">long</span> time = et - st;
     System. out.<span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: 700;">println</span>( <span class="hljs-string" style="color: rgb(136, 0, 0);">"系统的试运行时间:"</span> + time + <span class="hljs-string" style="color: rgb(136, 0, 0);">"毫秒"</span> );
    

    }

    private static String getPortTypeName( int portType) {
    switch (portType) {
    case CommPortIdentifier. PORT_I2C :
    return “I2C” ;
    case CommPortIdentifier. PORT_PARALLEL :
    return “Parallel” ;
    case CommPortIdentifier. PORT_RAW :
    return “Raw” ;
    case CommPortIdentifier. PORT_RS485 :
    return “RS485” ;
    case CommPortIdentifier. PORT_SERIAL :
    return “Serial” ;
    default:
    return “unknown type” ;
    }
    }
    }

    运行结果如下:
    Finally, there is a place to note, the above code is to test all the code, if you really want into the project, it is best to maintain their own queue to send a message, because although the internal smslib send a message around about 5s, too many words there is a queue, but once the device error message if it is lost, if a multi-core device, but also consider the load balance issues and so on.



      <div class="page">
        <p>上一篇:<a href="/help/119.html">【转载】SMSLib开源短信猫二次开发包开发指南</a> </p>
        <p>下一篇:<a href="/help/123.html">通过C#实现短信猫短信发送与接收</a> </p>
        <a href="javascript:void(0);" title="返回" class="back" onclick="javascript:history.back(-1);">返回</a> </div>
    </div>
  </div>
</div>

Guess you like

Origin blog.csdn.net/qq_37358860/article/details/93857873