Java短信猫测试与使用
以下操作,无特殊说明则全部在root帐户下完成。
第一步,设置用户组与权限
>> usermod -a -G uucp root
>> usermod -a -G lock root
执行一上命令后使用 id root命令查看root是否具有uucp、lock分组的配置
>> id root
第二步,安装minicom串口配置工具
使用root帐户登陆系统,新建目录,例如 /home/smart/minicom-install/ 使用XFTP等工具上传 minicom-2.7.1.tar.gz,ncurses-6.0.tar.gz 源码文件,按照如下步骤执行编译安装。
# tar -zxvf ncurses-6.0.tar.gz # cd ncurses-6.0
# ./configure # make # make install # tar -zxvf minicom-2.7.1.tar.gz # cd minicom-2.7.1 # ./configure # make # make install 执行以上安装过程如果遇到问题请检查gcc等编译环境,如果编译完成就可以使用minicom配置串口。
使用 ls /dev/ttyS* 或ls /dev/ttyUSB*分别查询主板串口或USB转换后的串口,linux 2.6+自动识别USB转换。
之后使用 minicom -s 进入超级终端,然后使用AT指令测试短信猫功能
Minicom超级终端如果测试不正常,可能设备有问题,可以尝试给短信猫SIM卡打电话,如果能听到“嘟嘟嘟”的声音,说明短信猫工作正常。
如果短信猫一切正常,请使用minicom终端测试以下AT指令
(1) ATE1 打开回显
(2) 输入AT,回车,显示OK则表示AT指令被支持。
(3) 输入ATZ,回车,初始化设备,显示OK表示命令执行成功。
(4) 输入AT+CSQ,回车,测试设备信号,显示类似 GSM,26,0 正常,显示ERROR表示出错。
(5) AT+CMGF=1,回车,设置短信发送格式,显示OK表示设置成功。
(6) 发送短信分两步:
1) AT+CMGS=手机号码,回车,提示输入短信内容(仅支持ASCII字符)
2) 在提示符 “>”后输入发送内容,例如:”Hello world”,后按:Ctrl+Z即可
发送短信内容。
(7) 如果测试设备打电话功能,输入ATD13800010001(即ATD紧跟电话号码)。
主要测试短信猫的状态。
使用配置工具或程序访问短信猫过程中,如果遇到串口被占用或锁定,请使用 ls -ltr /var/lock 查看锁定文件,使用 kill 0或 rm -rf LCK*** 文件。
第三步,配置RXTXComm.jar 与 librxtxSerial.so 及JDK
SmsMessage.jar 打包(Runnable包的时候已经包括了RXTXComm.jar包,如果是容器类程序,例如Tomcat拉起来的程序需要放入WEB-INF/lib下或放在$JDK_HOME/jre/lib/ext目录)。
librxtxSerial.so请放在 $JDK_HOME/jre/lib/amd64目录
第四步,设置SmsMessager.jar 运行配置文件
message.properties,log4j.properties
设置发送配置参数messasge.properties文件,按如下标准
配置文件中的 A.*标识的是短信猫程序启动时指定的猫对象,默认是A。即:
指定配置时使用
package com.sms.message;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.apache.log4j.Logger;
import org.dom4j.Element;
import org.dom4j.io.DOMReader;
import org.smslib.Message.MessageEncodings;
import org.smslib.OutboundMessage;
import org.smslib.SMSLibException;
import org.smslib.Service;
import org.smslib.TimeoutException;
import org.smslib.helper.CommPortIdentifier;
import org.smslib.modem.SerialModemGateway;
import org.w3c.dom.Document;
public class SendMessage
{
private static Logger logger =
Logger.getLogger(SendMessage.class);
private SerialModemGateway gateway = null;
private String gateId = null;
private String portName = null;
private int boardRate = 9600;
private String manufacturer = null;
private String model = null;
private long messageCount = 0;
private String messgePrefix = \"\";
public static int MSG_MAX_LEN = 96;
public SendMessage(String gateId, String portName, String String model,
Integer boardRate)
{
this.gateId = gateId;
this.portName = portName;
this.manufacturer = manufacturer;
this.model = model;
manufacturer,
if (boardRate != null)
{
this.boardRate = boardRate.intValue();
}
logger.info(String.format(\"串口号:%s,网关ID:%s,波特率:%d, 使用
ATHandler_%s_%s 类处理短信收发.his.portName, this.gateId, this.boardRate, this.manufacturer, this.model));
}
public void init() throws Exception
{
/**
* TEST FUNCTION
*/
Enumeration portIdentifiers = if (portIdentifiers.hasMoreElements()) { CommPortIdentifier port = portIdentifiers.nextElement(); logger.info(String.format(\"串口名称:%s 类型:%d\port.getName(), port.getPortType())); } else { throw new Exception(String.format(\"没有可用串口对象,当前设置参数,厂商:%s,型号:%s,portId:/dev/ttyUSB0\ } logger.debug(System.getProperty(\"java.library.path\")); SerialModemGateway gateway = null; gateway = new SerialModemGateway(this.gateId, this.portName, this.boardRate, this.manufacturer, this.model); logger.info(\"ready to start gateway\"); gateway.setInbound(true); // 设置true,表示该网关可以接收短信,根据需求修改 gateway.setOutbound(true); // 设置true,表示该网关可以发送短信,根据需求修改 gateway.setSimPin(\"1234\"); // sim卡锁,一般默认为0000或1234 try { logger.info(\"Now to add gate way\"); Service.getInstance().addGateway(gateway); // 将网关添加到短信猫服务中 logger.info(\"Using SERIAL_POLLING Mode to check port status\"); Service.getInstance().S.SERIAL_POLLING = true; logger.info(\"Gate way added,ready to start service\"); Service.getInstance().startService(); // 启动服务,进入短信发送就绪状态 logger.info(\"Service started ok.\"); } catch (Exception e) { throw e; } } public void destroy() { try { Service.getInstance().stopService(); if (gateway != null) { Service.getInstance().removeGateway(gateway); } } catch (Exception e) { logger.debug(e); } } public void sendMessage(String phoneNum, String content) throws TimeoutException, SMSLibException, IOException, InterruptedException { logger.info(String.format(\"开始发送短信%s,Content:%s\ // 参数1:手机号码 参数2:短信内容 OutboundMessage msg = new OutboundMessage(phoneNum, content); msg.setEncoding(MessageEncodings.ENCUCS2);// 这句话是发中文短信必须的 Service.getInstance().sendMessage(msg); // 执行发送短信 logger.info(String.format(\"完成发送短信%s\ } public void start(String folderName) throws Exception { folderName = folderName.replace(\"\\\\\ if (!folderName.endsWith(\"/\")) { folderName += \"/\"; } File messageFileFolder = new File(folderName); if (!messageFileFolder.exists()) { messageFileFolder.mkdirs(); logger.warn(String.format(\"文件夹:%s不存在,已创建\ } logger.warn(String.format(\"短信存放文件夹:%s\ logger.info(String.format(\"已经发送了:%d条短信\ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); int prefixLen = this.messgePrefix.length(); if (prefixLen > 10) { this.messgePrefix = \"\"; prefixLen = 0; } while (true) { File files[] = messageFileFolder.listFiles(); if (files == null || files.length < 1) { try { Thread.sleep(1000); } catch (InterruptedException ie) { logger.debug(\"sleep InterruptedException\"); } continue; } for (File xmlFile : files) { if (!xmlFile.getName().endsWith(\".xml\")) continue; String content = null; List try { DOMReader reader = new DOMReader(); Document domDocument = db.parse(xmlFile); org.dom4j.Document document = reader.read(domDocument); Element root = document.getRootElement(); content = String.valueOf(root.attribute(\"name\").getData()); if (content.equals(\"null\") || content.trim().isEmpty()) { logger.info(String.format(\"文件:%s 短信内容为空 忽略xmlFile.getAbsoluteFile())); this.deleteFile(xmlFile); continue; } Element phonesElement = root.element(\"iphones\"); if (phonesElement == null) { logger.info(String.format(\"文件:%s 短信接收人未配置忽略\ \ xmlFile.getAbsoluteFile())); this.deleteFile(xmlFile); continue; } List if (phoneElements == null) continue; Iterator while (it.hasNext()) { String phone = String.valueOf(it.next().attribute(\"name\").getData()); if (!isMobileNO(phone)) continue; recvPhones.add(phone); } List logger.info(String.format(\"短信:%s分割为%d条发送给每个人\content, moreContent.size())); for (String phoneNum : recvPhones) { for (String c : moreContent) { this.sendMessage(phoneNum, String.format(\"%s%s\ this.messageCount++; } } this.deleteFile(xmlFile); } catch (Exception e) { logger.warn(String.format(\"读取文件:%s 构建xmlFile.getAbsoluteFile()), e); XML文档时异常\ } } } } /** * 把原始字符串分割成指定长度的字符串列表 * * @param inputString * 原始字符串 * @param length * 指定长度 * @return */ public static List { int size = inputString.length() / length; if (inputString.length() % length != 0) { size += 1; } return getStrList(inputString, length, size); } /** * 把原始字符串分割成指定长度的字符串列表 * * @param inputString * 原始字符串 * @param length * 指定长度 * @param size * 指定列表大小 * @return */ public static List { List for (int index = 0; index < size; index++) { String childStr = substring(inputString, index * length, (index + 1) * length); list.add(childStr); } return list; } /** * 分割字符串,如果开始位置大于字符串长度,返回空 * * @param str * 原始字符串 * @param f * 开始位置 * @param t * 结束位置 * @return */ public static String substring(String str, int f, int t) { if (f > str.length()) return null; if (t > str.length()) { return str.substring(f, str.length()); } else { return str.substring(f, t); } } private void deleteFile(File file) { try { if (file.exists()) file.delete(); } catch (Exception e) { logger.info(\"删除文件:\" + file.getAbsolutePath() + \"时异常\ } } private boolean isMobileNO(String mobiles) { String telRegex = \"[1][3578]\\\\d{9}\"; // \"[1]\"代表第1位为数字1,\"[3578]\"代表第二位可以为3、5、8中的一个,\"\\\\d{9}\"代表后面是可以是0~9的数字,有9位。 if (mobiles == null || \"null\".equalsIgnoreCase(mobiles) || mobiles.isEmpty()) { return false; } else return mobiles.matches(telRegex); } public String getMessgePrefix() { return messgePrefix; } public void setMessgePrefix(String messgePrefix) { this.messgePrefix = messgePrefix; } } 因篇幅问题不能全部显示,请点此查看更多更全内容