⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 smssender.java

📁 关于开发SMS的java工程
💻 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 + -