`
yuyu456
  • 浏览: 13369 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

java发送短信之AT指令

    博客分类:
  • JAVA
阅读更多
短信内容的存储类
/***
 * CommonSms 短信用于全局变量  
 */
public class CommonSms{

	/** id */
	private int id;
	/**短信内容*/
	private String smstext;
	/**短信发送方*/
	private String sender;//短信发送方
	/**短信接收发*/
	private String recver;//短信接收发
	/**时间*/
	private Date date;	
	public String getSmstext() {
		return smstext;
	}
	public void setSmstext(String smstext) {
		this.smstext = smstext;
	}
	
	public Date getDate() {
		return date;
	}
	public void setDate(Date date) {
		this.date = date;
	}
	public int getId() {
		return id;
	}
	
	public void setId(Integer id) {
		this.id = id;
		
	}
	public String getSender() {
		return sender;
	}
	public void setSender(String sender) {
		this.sender = sender;
	}
	public String getRecver() {
		return recver;
	}
	public void setRecver(String recver) {
		this.recver = recver;
	}
	
}

串口操作实现类
/***
 * 串口操作实现类
 */
public class Port {
	private CommPortIdentifier portId;
	private SerialPort serialPort;
	private OutputStreamWriter out;
	private InputStreamReader in;
	private String COMname;
	private static char symbol1 = 13;
	
	public String getCOMname() {
		return COMname;
	}
	public void setCOMname(String mname) {
		COMname = mname;
	}
	public CommPortIdentifier getPortId() {
		return portId;
	}

	public void setPortId(CommPortIdentifier portId) {
		this.portId = portId;
	}

	
	public SerialPort getSerialPort() {
		return serialPort;
	}

	public void setSerialPort(SerialPort serialPort) {
		this.serialPort = serialPort;
	}

	public OutputStreamWriter getOut() {
		return out;
	}

	public void setOut(OutputStreamWriter out) {
		this.out = out;
	}
	public InputStreamReader getIn() {
		return in;
	}

	public void setIn(InputStreamReader in) {
		this.in = in;
	}
	public boolean isused =true;
	
	public boolean isIsused() {
		return isused;
	}

	public void setIsused(boolean isused) {
		this.isused = isused;
	}
	/**
	 * 打开com口 
	 * @param portName
	 * @return
	 */		
	public  Port(String portName) {
		try {
			portId = CommPortIdentifier.getPortIdentifier(portName);
			if (portId == null) {
				System.out.println("port is null");
			}
			try {
				serialPort = (SerialPort) portId.open(portName,100000);
			} catch (PortInUseException e) {
				System.gc();
				e.printStackTrace();
			}
			// 下面是得到用于和COM口通讯的输入、输出流。
			try {
				in = new InputStreamReader(serialPort.getInputStream());
				out = new OutputStreamWriter(serialPort.getOutputStream());
			} catch (IOException e) {
				System.gc();
				System.out.println("IOException");
			}
			// 下面是初始化COM口的传输参数,如传输速率:9600等。
			try {
				serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8,
						SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
				setCOMname(portId.getName());
				setIsused(true);				
			} catch (UnsupportedCommOperationException e) {
				e.printStackTrace();
				System.gc();
			}

		} catch (NoSuchPortException e) {
			e.printStackTrace();
			System.gc();
		}		
	}
	/**
	 * 检查SIM是否存在
	 * @return
	 */
	public  boolean chakanPort() {
		try {
			String 	atCommand = "AT+ccid";
			String	strReturn = sendAT(atCommand);
			if (strReturn.indexOf("OK", 0) != -1) {		
				return true;
			}
			return false;
		} catch (Exception ex) {
			System.gc();
			ex.printStackTrace();
			return false;
		}
	}
	/**
	 * 关闭COM口
	 * @return boolean
	 */
	public void close() {
		try {
			in.close();
			out.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
		serialPort.close();	
		System.gc();
		setIsused(false);		
	}

	/**
	 * 向串口中写入字符串命令
	 * @param s 字符串命令
	 * @throws Exception 异常
	 */
	public  void writeln(String s) throws Exception {
		out.write(s);
		out.write('\r');
		out.flush();
	}

	/**
	 * 读取COM命令的返回字符串
	 * @return 结果字符串
	 * @throws Exception
	 */
	public  String read() throws Exception {
		int n, i;
		char c;
		String answer = "";
		for (i = 0; i < 100; i++) {
			while (in.ready()) {
				n = in.read();
				if (n != -1) {
					c = (char) n;
					answer = answer + c;
					Thread.sleep(1);
				} else
					break;
			}
			if (answer.indexOf("OK") != -1) {
				break;
			}
			Thread.sleep(100);
		}
		return answer;
	}

	/**
	 * 向串口发送AT指令
	 * @param atcommand 指令内容
	 * @return 指令返回结果
	 * @throws java.rmi.RemoteException
	 */
	public String sendAT(String atcommand) throws java.rmi.RemoteException {
		String s = "";
		try {
			Thread.sleep(100);
			writeln(atcommand);
			Thread.sleep(80);
			s = read();
			Thread.sleep(100);
		} catch (Exception e) {
			System.gc();
			System.out.println("ERROR: send AT command failed; " + "Command: "
					+ atcommand + "; Answer: " + s + "  " + e);
		}
		return s;
	}
}

短信操作类
/***
 * 短信操作类
 */
public class Sms{

	private CommonSms commonsms;
	private static char symbol1 = 13;
	private static String strReturn = "", atCommand = "";

	public boolean SendSms(Port myport) {
		if(!myport.isIsused())
		{		
		System.out.println("COM通讯端口未正常打开!");		
		return false;
		}
		setMessageMode(myport,1);
		// 空格
		char symbol2 = 34;
		// ctrl~z 发送指令
		char symbol3 = 26;
		try {
			atCommand = "AT+CSMP=17,169,0,08" + String.valueOf(symbol1);
			strReturn = myport.sendAT(atCommand);
			System.out.println(strReturn);
			if (strReturn.indexOf("OK", 0) != -1) {
				atCommand = "AT+CMGS=" + commonsms.getRecver()
						+ String.valueOf(symbol1);
				strReturn = myport.sendAT(atCommand);
				atCommand = StringUtil.encodeHex(commonsms.getSmstext().trim())
						+ String.valueOf(symbol3) + String.valueOf(symbol1);
				strReturn = myport.sendAT(atCommand);
				if (strReturn.indexOf("OK") != -1
						&& strReturn.indexOf("+CMGS") != -1) {
					System.out.println("短信发送成功...");
					return true;
				}
			}
		} catch (Exception ex) {
			ex.printStackTrace();			
			System.out.println("短信发送失败...");		
			return false;
		}	
		System.out.println("短信发送失败...");	
		return false;
	}
	/**
	 * 设置消息模式 
	 * @param op
	 * 0-pdu 1-text(默认1 文本方式 )
	 * @return
	 */
	public boolean setMessageMode(Port myport,int op) {
		try {
			String atCommand = "AT+CMGF=" + String.valueOf(op)
					+ String.valueOf(symbol1);
			String 	strReturn = myport.sendAT(atCommand);
			if (strReturn.indexOf("OK", 0) != -1) {
				System.out.println("*************文本方式设置成功************");
				return true;
			}
			return false;
		} catch (Exception ex) {
			ex.printStackTrace();
			return false;
		}
	}	
	
	/**
	* 读取所有短信 
	* @return CommonSms集合
	*/
	public List<CommonSms> RecvSmsList(Port myport) {
		if(!myport.isIsused())
		{
			System.out.println("System Message:  COM通讯端口未正常打开!");		
			return null;
		}
		List<CommonSms> listMes = new ArrayList<CommonSms>();
		try {
			atCommand = "AT+CMGL=\"ALL\"";
			strReturn = myport.sendAT(atCommand);
			listMes = StringUtil.analyseArraySMS(strReturn);			
		} catch (Exception ex) {
			ex.printStackTrace();
		}
		return listMes;
	}

	
	/**
	 * 删除短信
	 * @param index 短信存储的位置
	 * @return boolean
	 */

	public boolean DeleteSMS(int index,Port myport) {
		if(!myport.isIsused()){
			System.out.println("System Message:  COM通讯端口未正常打开!");
			return false;
		}
		try {
			atCommand = "AT+CMGD=" + index;
			strReturn = myport.sendAT(atCommand);
			if (strReturn.indexOf("OK") != -1) {
				System.out.println("System Message:  成功删除存储位置为" + index
						+ "的短信......");
			}
		} catch (Exception ex) {
			ex.printStackTrace();
		}
		return true;
	}
	
	/**
	 * 删除短信中所有短信
	 * @return boolean
	 */
	public boolean DeleteAllSMS(Port myport)
	{
		List list=RecvSmsList(myport);
		boolean ret=true;
		if(list!=null&&!list.equals("")&&list.size()>0)
		{		
		for(int i=0;i<list.size();i++)
		{
			CommonSms tempcomsms=(CommonSms)list.get(i);
			if(!DeleteSMS(tempcomsms.getId(),myport))
			{
				ret=false;
			}
		}
		}
		return ret;
	}
	public CommonSms getCommonsms() {
		return commonsms;
	}

	public void setCommonsms(CommonSms commonsms) {
		this.commonsms = commonsms;
	}
	/**
	 * 号码,内容,发送短信息
	 * @param phone
	 * @param countstring
	 * @throws Exception
	 */
	public static void sendmsn(String phone,String countstring){
		 Sms s = new Sms();
		  // 发送测试		
		  CommonSms cs=new CommonSms();
		  cs.setRecver(phone);
		  cs.setSmstext(countstring);
		  s.setCommonsms(cs);
		  Port myort=new Port("COM7");
		  s.SendSms(myort);
	           myort.close();
	}
	
	public static void main(String[] args) throws Exception {
		sendmsn("13265551149","我有一筐的愿望,却等不到一颗流星,闭上眼睛,我看到了我的前途");	}	

指令字符串操作类
/***
 * 指令字符串操作类
 */
public class StringUtil {
	/**
	 * 使用Sms 的RecvSms(int index)的方法时,使用该方法解析MODEM返回的字符串
	 * 根据MODEM返回的字符串,解析成一个CommonSms对象
	 * @param str 串口返回的读取短信结果字符串
	 * @param index 短信索引
	 * @return
	 */
	public static CommonSms analyseSMS(String str, int index) {
		CommonSms commonSms = new CommonSms();
		String mesContent;
		String[] s = str.split("\"");
		int len = s.length;
		commonSms.setId(index);
		mesContent = s[len - 1];
		if (mesContent.indexOf("OK") != -1) {
			mesContent = mesContent.substring(0, mesContent.indexOf("OK"));
		}
		mesContent = mesContent.trim();
		commonSms.setSmstext(analyseStr(mesContent));
		// 短信有中文时使用
		// mes.setMessage(Unicode2GBK(analyseStr(mesContent)));
		SimpleDateFormat df = new SimpleDateFormat("yy/MM/dd hh:mm:ss");
		String datestring = s[len - 2].substring(0, s[len - 2].length() - 3)
				.replace(',', ' ');// 短信时间格式09/09/09 20:18:01+32
		Date date = null;
		try {
			date = df.parse(datestring);
			System.out.println(date.toLocaleString());
		} catch (Exception ex) {
			System.out.println(ex.getMessage());
		}
		commonSms.setDate(date);
		if (s[1].equals("REC READ")) {
			commonSms.setState("已读");
		} else {
			commonSms.setState("未读");
		}
		commonSms.setSender(s[3]);

		return commonSms;
	}

	/**
	 * 使用Sms 的RecvSmsList()方法时,通过该方法解析MODEM返回来的字符串
	 * 根据MODEM返回的字符串,解析成一个CommonSms的集合对象
	 * @param str MODEM返回的字符串
	 * @return
	 */
	public static List<CommonSms> analyseArraySMS(String str) {
		List<CommonSms> mesList = new ArrayList<CommonSms>();
		CommonSms cs;
		String[] messages;
		String temp;
		String[] t;
		if (str.indexOf("CMGL: ") == -1)
			return null;
		str = str.substring(0, str.indexOf("OK")).trim();
		messages = str.split("\n");
		if (messages.length < 2)
			return null;
		for (int i = 1; i < messages.length; i++) {
			cs = new CommonSms();
			messages[i] = messages[i]
					.substring(messages[i].indexOf("CMGL: ") + 6);
			t = messages[i].split(",");
			if (t.length > 5) {
				cs.setId(Integer.parseInt(t[0].trim()));
				temp = t[1].substring(t[1].indexOf('"') + 1,
						t[1].lastIndexOf('"')).trim();
				if (temp.equals("REC READ")) {
					cs.setState("已读");
				} else {
					cs.setState("未读");
				}
				cs.setSender((t[2].substring(t[2].indexOf('"') + 1, t[2]
						.lastIndexOf('"')).trim()));
				SimpleDateFormat df = new SimpleDateFormat("yy/MM/dd hh:mm:ss");
				String datestring = t[4].substring(t[4].indexOf('"') + 1) + " "
						+ t[5].substring(0, t[5].indexOf('"'));// 短信时间格式09/09/09
																// 20:18:01+32
				Date date = null;
				try {
					date = df.parse(datestring);
				} catch (Exception ex) {
					System.out.println(ex.getMessage());
				}
				cs.setDate(date);
				i++;
				cs.setSmstext(analyseStr(messages[i].trim()));
				mesList.add(cs);
			}
		}
		return mesList;
	}

	/**
	 * 将PDU编码的十六进制字符串 如“4F60597DFF01” 转换成unicode "\u4F60\u597D\uFF01"
	 * @param str 要转化的字符串
	 * @return 转换后的十六进制字符串
	 */
	public static String analyseStr(String str) {
		StringBuffer sb = new StringBuffer();
		if (!(str.length() % 4 == 0))
			return str;
		for (int i = 0; i < str.length(); i++) {
			if (i == 0 || i % 4 == 0) {
				sb.append("\\u");
			}
			sb.append(str.charAt(i));
		}
		return Unicode2GBK(sb.toString());
	}

	/**
	 * 将unicode编码 "\u4F60\u597D\uFF01" 转换成中文 "你好!"
	 * @param dataStr 要转化的字符串
	 * @return 转换后的中文字符串
	 */
	public static String Unicode2GBK(String dataStr) {
		int index = 0;
		StringBuffer buffer = new StringBuffer();
		while (index < dataStr.length()) {
			if (!"\\u".equals(dataStr.substring(index, index + 2))) {
				buffer.append(dataStr.charAt(index));
				index++;
				continue;
			}
			String charStr = "";
			charStr = dataStr.substring(index + 2, index + 6);
			char letter = 0;
			try{letter = (char) Integer.parseInt(charStr, 16);}catch (Exception e) {}
			buffer.append(letter);
			index += 6;
		}
		return buffer.toString();
	}

	/**
	 * 将中文字符串转换成Unicode
	 * @param str 要转换的中文字符串
	 * @return 转换后的Unicode
	 */
	public static String GBK2Unicode(String str) {

		StringBuffer result = new StringBuffer();

		for (int i = 0; i < str.length(); i++) {

			char chr1 = (char) str.charAt(i);

			if (!isNeedConvert(chr1)) {

				result.append(chr1);

				continue;

			}
			try{result.append("\\u" + Integer.toHexString((int) chr1));}catch (Exception e) {}

		}

		return result.toString();

	}

	/**
	 * 在中文字符串转换成Unicode方法中判断是否需要转换
	 * @param para 要转化的字符
	 * @return boolean
	 */
	public static boolean isNeedConvert(char para) {
		return ((para & (0x00FF)) != para);

	}

	/**
	 * 使用Sms 的 SendSms()方法发送短信时,调用此方法将其短信内容转换成十六进制
	 * @param msg 短信内容
	 * @return 转换后的十六进制短信
	 */
	public static final String encodeHex(String msg) {
		byte[] bytes = null;
		try {
			bytes = msg.getBytes("GBK");
		} catch (java.io.UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		StringBuffer buff = new StringBuffer(bytes.length * 4);
		String b = "";
		char a;
		int n = 0;
		int m = 0;
		for (int i = 0; i < bytes.length; i++) {
			try{b = Integer.toHexString(bytes[i]);}catch (Exception e) {}
			if (bytes[i] > 0) {
				buff.append("00");
				buff.append(b);
				n = n + 1;
			} else {
				a = msg.charAt((i - n) / 2 + n);
				m = a;
				try{b = Integer.toHexString(m);}catch (Exception e) {}
				buff.append(b.substring(0, 4));

				i = i + 1;
			}
		}
		return buff.toString();
	}
}

附件
分享到:
评论
2 楼 xiao_feng68 2013-02-25  
找不到端口呢,这是怎么回事?
1 楼 zhuhuqiu 2012-11-08  
怎么没有群发部分?

相关推荐

    Java使用短信猫发送短信(AT指令操作串口)

    本教程将聚焦于如何利用Java结合短信猫(Modem)发送短信,这通常涉及到AT指令集的使用以及串行通信。短信猫是一种硬件设备,能够通过SIM卡连接到移动网络,从而实现短信收发功能。在Java中,我们通常会借助特定的库...

    java 串口通过AT 指令发送短信

    java读取串口通过AT指令发送短信 操作短信猫进行收发短信

    java调用modem执行at指令

    在这种情况下,Java调用Modem执行AT指令可能用于自动拨打电话验证用户身份、发送短信验证码或进行远程设备控制。 综上所述,实现“Java调用Modem执行AT指令”涉及了Java串口通信、AT指令控制、错误处理、线程管理和...

    短信猫AT指令发送短信源码

    在Java编程中,我们可以通过使用AT指令与短信猫进行通信,实现短信的发送功能。AT指令是串行通信中的控制命令,用于设置和查询设备状态,发送短信就是其中的一项常见应用。 首先,要使用AT指令发送短信,我们需要...

    java发送短信

    首先,要实现Java发送短信,我们需要一个短信服务提供商,如阿里云、腾讯云等,它们提供HTTP API或者SDK供开发者调用。通常,这些API会要求我们完成以下步骤: 1. **注册账户**:在短信服务提供商的官网上注册一个...

    短信猫java,java集成短信接口

    5. **发送AT命令**:使用`OutputStream`向短信猫发送AT命令,AT命令是控制短信猫工作的基本指令集,用于设置工作模式、读取状态、发送短信等。 6. **接收响应**:通过`InputStream`读取短信猫返回的响应,以确认命令...

    java mas机发短信

    Java MAS(Machine Access Subsystem)机发短信是一种通过Java编程语言与短信猫设备进行交互,实现短信发送的技术。MAS机通常是指支持短信收发功能的硬件设备,它连接到计算机或服务器,允许程序通过特定的API接口...

    android发送AT命令

    2. **短信操作**:`AT+CMGF=1`设置短信模式为文本模式,`AT+CMGS="&lt;手机号&gt;"`开始发送短信,然后写入短信内容,最后发送Ctrl+Z(ASCII码127)结束发送。 3. **数据连接**:`AT+CGDCONT=1,"IP","internet"`设置PDP上...

    短信猫用rxtx收发短信Java示例

    本示例将详细介绍如何使用RXTX库在Java中实现通过AT指令控制短信猫进行收发短信的功能。 首先,你需要安装RXTX库。提供的压缩包文件`rxtx-2.1-7-bins-r2.zip`和`rxtx-2.2pre2-bins.zip`包含了RXTX的不同版本。解压...

    java版短信猫收发程序

    Java程序通过发送AT指令到短信猫设备来执行各种操作,如设置短信中心号码、发送短信、接收短信等。常见的AT指令有: - `AT+CMGF`:切换短信模式,如文本模式或PDU模式。 - `AT+CMGS`:发送短信,需要提供接收方...

    java代码实现短信猫发送短信

    在这个场景中,我们主要关注AT命令模式,因为它是直接通过发送特定的AT指令来控制短信猫收发短信。例如,`AT+CMGF=1`指令用于设置短信为文本模式,`AT+CMGS`用于发送短信。 在Java代码实现中,首先需要建立与短信猫...

    java调用短信猫

    还有一个sms.rar是我从51cto上下载的一个直接用java调用at指令调用短信猫。也需要按上面配置java串口通信组件。这个上传上去是为了便于大家查看smslib中的基本通信原理。用起来更方便一些。 附录1.还有smslib.jar ...

    JYC311-4G短信.rar

    本文将围绕"JYC311-4G短信.rar"这一主题,详细探讨如何使用C#语言开发一个控制短信Modem发送短信的程序,特别是针对长短信的支持以及如何通过AT指令与GSM Modem进行交互。 一、C#短信程序开发基础 C#是一种强大的...

    java 短信发送 smslib RXTX 自动串口检测 下载

    如果要发送AT指令,需要先转换成相应的Ascii码.如: 发送AT指令A(acsii:65)T(ascii:84)回车(ascii:13) char[] atOrder = {65, 84 ,13}; smslib_test.writeByte(atOrder); SmsService.java:smslib的封装 SmsSendJob....

    java短信猫源码

    Java短信猫源码是用于通过Java编程语言控制短信猫设备发送短信的一种软件开发资源。短信猫,也称为GSM调制解调器,是一种硬件设备,可以连接到计算机并模拟手机功能,允许用户通过AT命令进行短信收发。在本项目中,...

    SMS.rar_java serial port_sms_串口收发短信_手机短信_短信 AT 命令

    AT命令是一系列预定义的指令,如AT+CMGF用于设置短信模式(文本或PDU),AT+CMGS用于发送短信,而AT+CMGL用于读取短信等。在Java程序中,我们可以通过调用SerialPort对象的writeBytes方法发送AT命令,然后通过...

    短信猫java二次开发代码

    综上所述,这个Java二次开发代码项目是为了解决在Windows系统下,如何利用Java编程语言,通过串口控制GPRS MODEM,利用AT指令进行短信的发送和接收。这对于需要集成短信功能的Java应用来说,是一个实用的开发基础。...

    java实现发送短信

    综上,无论选择哪种方式,实现Java发送短信都需要对网络通信、JSON处理、错误处理有深入了解,并可能涉及到硬件设备的控制。对于开发者来说,理解相关的API文档和协议标准是必不可少的步骤。在实际项目中,还要考虑...

    Java与手机串口通信及AT文档

    AT命令集提供了发送和接收短信的命令,如`AT+CMGF`用于切换文本模式或PDU模式,`AT+CMGS`用于发送短信,`AT+CMGL`用于读取短信等。通过Java串口通信,我们可以实现自动化的短信收发功能,例如在后台服务中监控特定...

Global site tag (gtag.js) - Google Analytics