📄 smssender.java
字号:
package sms;
/*
* 短信发送的主要功能类,负责将格式化好的短信发送至CDMA modem
*/
import gnu.io.CommPortIdentifier;
import gnu.io.PortInUseException;
import gnu.io.SerialPort;
import gnu.io.UnsupportedCommOperationException;
import java.io.*;
import java.util.*;
import common.SMSParametersInfo;
public class SMSSender {
/*
* 开始设置参数
*/
SerialPort serialPort=null;//串口对象,用于获取串口的流
CommPortIdentifier portId = null;//串口控制器对象,类似指针,用于获取串口
Enumeration portList = CommPortIdentifier.getPortIdentifiers();//串口列表,列出本机上所有可用串口
final SMSReturnEventListener smsReturnEventListener=new SMSReturnEventListener();//串口事件监听器
/*
* 以下参数是系统传过来,uid+model+ip+ctrlName+severity+evtStr,用于向用户传递内容,recv用户表示发送的手机号码
*/
String uid;
String model;
String ip;
String ctrlName;
String severity;
String evtStr;
String recv;
List smsArray=new ArrayList();//连续保存划分好的短信
//--------------------------------------------------------------------------
//构造SMSSender()函数负责设置类内部参数
public SMSSender(String uid,
String model,
String ip,
String ctrlName,
String severity,
String evtStr,
String recv){
//首先就把格式排列好
this.uid="uid: "+uid+" ";
this.model="model: "+model+" ";
this.ip="ip: "+ip+" ";
this.ctrlName="ctrlName: "+ctrlName+" ";
this.severity="severity: "+severity+" ";
this.evtStr="evtStr: "+evtStr+" ";
this.recv=recv;
}
//--------------------------------------------------------------------------
//串口初始化函数,获取本机上所有的串口,并检测是否与连接有modem的串口相同
private void initializeserialport(){
while (portList.hasMoreElements()){
CommPortIdentifier com = (CommPortIdentifier)portList.nextElement();
if (com.getPortType() == CommPortIdentifier.PORT_SERIAL){
if(com.getName().equals(SMSParametersInfo.SMS_Parameter_COM)){
portId=com;
break;
}
}
}
try {
serialPort=(SerialPort)portId.open("SMS", 2000);
serialPort.setSerialPortParams(115200, SerialPort.DATABITS_8, //设置串口读写参数
SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_RTSCTS_IN);
serialPort.notifyOnDataAvailable(true);
// serialPort.notifyOnBreakInterrupt(false);
// serialPort.addEventListener(smsReturnEventListener);
} catch (UnsupportedCommOperationException e) {
} catch (PortInUseException e) {
System.out.println("PortInUseException");
e.printStackTrace();
}
}
//--------------------------------------------------------------------------
//本函数负责将分好类的短信内容分为若干条独立的短信,并逐条调用send(),依次发送
public void rankSMS() throws InterruptedException{
SMSSorting smsSorting=new SMSSorting();
Map messagesHashMap=smsSorting.Segmentation(uid, model, ip, ctrlName, severity, evtStr);
//准备发送的短信
String firstMessage="";//第1条短信
String secondMessage="";//第2条短信
String thirdMessage="";//第3条短信
String fouthMessage="";//第4条短信
String fifthMessage="";//第5条短信
String sixMessage="";//第6条短信
if(messagesHashMap!=null){
//首先根据dividHashMap中内容,对不同的短信进行划分
Set messagesSet=messagesHashMap.keySet();
Iterator messagesIterator=messagesSet.iterator();
while(messagesIterator.hasNext()){
String key=(String)messagesIterator.next();
System.out.println(key+"-----"+messagesHashMap.get(key));
switch(key.charAt(0)) {
case '0' :/*属于第1条短信*/firstMessage=firstMessage+messagesHashMap.get(key);break;
case '1' :/*属于第2条短信*/secondMessage=secondMessage+messagesHashMap.get(key);break;
case '2' :/*属于第3条短信*/thirdMessage=thirdMessage+messagesHashMap.get(key);break;
case '3' :/*属于第4条短信*/fouthMessage=fouthMessage+messagesHashMap.get(key);break;
case '4' :/*属于第5条短信*/fifthMessage=fifthMessage+messagesHashMap.get(key);break;
case '5' :/*属于第6条短信*/sixMessage=sixMessage+messagesHashMap.get(key);break;
}
}
}else{
System.err.println("短信中某一个参数长度超出最大规定,无法发送");
return;
}
//首先要统计出所有的短信数量
int smsNum=0;
List smsContentList=new ArrayList();
if(!firstMessage.equals("")){
//第1条短信有内容
smsNum++;
smsContentList.add(firstMessage);
}
if(!secondMessage.equals("")){
//第2条短信有内容
smsNum++;
smsContentList.add(secondMessage);
}
if(!thirdMessage.equals("")){
//第3条短信有内容
smsNum++;
smsContentList.add(thirdMessage);
}
if(!fouthMessage.equals("")){
//第4条短信有内容
smsNum++;
smsContentList.add(fouthMessage);
}
if(!fifthMessage.equals("")){
//第5条短信有内容
smsNum++;
smsContentList.add(fifthMessage);
}
if(!sixMessage.equals("")){
//第6条短信有内容
smsNum++;
smsContentList.add(sixMessage);
}
//开始循环发送
for(int index=0;index<smsNum;index++){
String smscontent=(String)smsContentList.get(index)+" "+"("+Integer.toString(index+1)+"/"+smsNum+"))";
initializeserialport();
send(smscontent);
}//调整格式,循环发送
}
//--------------------------------------------------------------------------
//本函数是系统中主要的功能函数,负责通过CDMA modem发送短信smsContent
private void send(String smsContent){
System.out.println("本次发送的短信内容为"+smsContent);
System.out.println("本次发送的短信长度为"+smsContent.length());
InputStream inputStream = null;
OutputStream outputStream = null;
try {
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
inputStream = new BufferedInputStream(serialPort.getInputStream());
outputStream = new BufferedOutputStream(serialPort.getOutputStream());
outputStream.flush();
outputStream.write("AT+CMGF=1\r".getBytes());
outputStream.write("AT+WSCL=1,2\r".getBytes());
outputStream.write(("AT+CMGS=\""+recv+"\","+Integer.toString(smsContent.length()-1)+"\r").getBytes());
outputStream.write(smsContent.getBytes());
outputStream.write("AT\r".getBytes());
outputStream.write("AT\r".getBytes());
outputStream.flush();
} catch (IOException e) {
System.err.println("发生了IO异常");
e.printStackTrace();
}finally{
try {
inputStream.close();
outputStream.close();
serialPort.close();
} catch (IOException e) {
e.printStackTrace();
}//这一句很重要,必须关闭串口资源
}
}
//--------------------------------------------------------------------------
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -