搜索
您的当前位置:首页正文

Java短信猫测试与使用

来源:爱够旅游网


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 CommPortIdentifier.getPortIdentifiers();

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 recvPhones = new ArrayList();

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 phoneElements = phonesElement.elements(\"iphone\");

if (phoneElements == null) continue;

Iterator it = phoneElements.iterator();

while (it.hasNext())

{

String phone = String.valueOf(it.next().attribute(\"name\").getData());

if (!isMobileNO(phone)) continue;

recvPhones.add(phone);

}

List moreContent = getStrList(content, MSG_MAX_LEN - prefixLen);

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 getStrList(String inputString, int length)

{

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 getStrList(String inputString, int length, int size)

{

List list = new ArrayList();

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;

}

}

因篇幅问题不能全部显示,请点此查看更多更全内容

Top