【转载】Java调用SMSLib用单口短信猫发送短信详解
SMSLib是Apache的一个开源项目
发短信几种方式:
1、向当地的运营商申请网关,不需要额外的设备,利用对方提供的 API调用程序发送短信,适用于大型的通信公司。 稳定,速度快,适合短信量特别大的需求,需要连接到运营商的网络中,不适合内网项目。
2、短信猫发送短信,借助像 GSM MODEM之类的设备,通过数据线连接电脑来发送短信,这种方法比较适用于小公司及个人。 不需要联网,速度慢,简单说就是通过程序调用短信猫设备发短信,价格看发短信卡的套餐了,适合中小项目。
短信猫发送短信设备
3、互联网短信平台,由互联网上专业做短信收发的网站代发短信数据,对网站依赖性太高,速度,价格都看选择的短信平台了,有些平台速度快,也稳定,不过价格高。 不适合内网项目。
4、内网短信平台产品,其实和短信猫没什么区别,就是单独把短信收发功能做成了一个产品,有支持甚至几十张卡同时发的产品,速度也不慢,短信负载都做的很好了,我们公司自己也有一个类似产品,不过比较庞大,安装麻烦,这类产品通常价格也比较贵。
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<CommPortIdentifier> 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 < 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> ) >= <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” ;
}
}
}运行结果如下:最后,有个要注意的地方,上面的代码全部是测试代码,如果真要放到项目中使用,最好自己维护一个短信发送队列,因为发1条短信大约5s左右,太多的话虽然smslib内部有个队列,但是如果一旦设备出错短信就丢了,如果多核设备,还要考虑负载均衡问题等等。
<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>