- 浏览: 13369 次
- 性别:
- 来自: 深圳
最新评论
-
xiao_feng68:
找不到端口呢,这是怎么回事?
java发送短信之AT指令 -
zhuhuqiu:
怎么没有群发部分?
java发送短信之AT指令
短信内容的存储类
串口操作实现类
短信操作类
指令字符串操作类
附件
/*** * 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(); } }
附件
- javacomm20-win32.zip (266.3 KB)
- 下载次数: 172
相关推荐
本教程将聚焦于如何利用Java结合短信猫(Modem)发送短信,这通常涉及到AT指令集的使用以及串行通信。短信猫是一种硬件设备,能够通过SIM卡连接到移动网络,从而实现短信收发功能。在Java中,我们通常会借助特定的库...
java读取串口通过AT指令发送短信 操作短信猫进行收发短信
在这种情况下,Java调用Modem执行AT指令可能用于自动拨打电话验证用户身份、发送短信验证码或进行远程设备控制。 综上所述,实现“Java调用Modem执行AT指令”涉及了Java串口通信、AT指令控制、错误处理、线程管理和...
在Java编程中,我们可以通过使用AT指令与短信猫进行通信,实现短信的发送功能。AT指令是串行通信中的控制命令,用于设置和查询设备状态,发送短信就是其中的一项常见应用。 首先,要使用AT指令发送短信,我们需要...
首先,要实现Java发送短信,我们需要一个短信服务提供商,如阿里云、腾讯云等,它们提供HTTP API或者SDK供开发者调用。通常,这些API会要求我们完成以下步骤: 1. **注册账户**:在短信服务提供商的官网上注册一个...
5. **发送AT命令**:使用`OutputStream`向短信猫发送AT命令,AT命令是控制短信猫工作的基本指令集,用于设置工作模式、读取状态、发送短信等。 6. **接收响应**:通过`InputStream`读取短信猫返回的响应,以确认命令...
Java MAS(Machine Access Subsystem)机发短信是一种通过Java编程语言与短信猫设备进行交互,实现短信发送的技术。MAS机通常是指支持短信收发功能的硬件设备,它连接到计算机或服务器,允许程序通过特定的API接口...
2. **短信操作**:`AT+CMGF=1`设置短信模式为文本模式,`AT+CMGS="<手机号>"`开始发送短信,然后写入短信内容,最后发送Ctrl+Z(ASCII码127)结束发送。 3. **数据连接**:`AT+CGDCONT=1,"IP","internet"`设置PDP上...
本示例将详细介绍如何使用RXTX库在Java中实现通过AT指令控制短信猫进行收发短信的功能。 首先,你需要安装RXTX库。提供的压缩包文件`rxtx-2.1-7-bins-r2.zip`和`rxtx-2.2pre2-bins.zip`包含了RXTX的不同版本。解压...
Java程序通过发送AT指令到短信猫设备来执行各种操作,如设置短信中心号码、发送短信、接收短信等。常见的AT指令有: - `AT+CMGF`:切换短信模式,如文本模式或PDU模式。 - `AT+CMGS`:发送短信,需要提供接收方...
在这个场景中,我们主要关注AT命令模式,因为它是直接通过发送特定的AT指令来控制短信猫收发短信。例如,`AT+CMGF=1`指令用于设置短信为文本模式,`AT+CMGS`用于发送短信。 在Java代码实现中,首先需要建立与短信猫...
还有一个sms.rar是我从51cto上下载的一个直接用java调用at指令调用短信猫。也需要按上面配置java串口通信组件。这个上传上去是为了便于大家查看smslib中的基本通信原理。用起来更方便一些。 附录1.还有smslib.jar ...
本文将围绕"JYC311-4G短信.rar"这一主题,详细探讨如何使用C#语言开发一个控制短信Modem发送短信的程序,特别是针对长短信的支持以及如何通过AT指令与GSM Modem进行交互。 一、C#短信程序开发基础 C#是一种强大的...
如果要发送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编程语言控制短信猫设备发送短信的一种软件开发资源。短信猫,也称为GSM调制解调器,是一种硬件设备,可以连接到计算机并模拟手机功能,允许用户通过AT命令进行短信收发。在本项目中,...
AT命令是一系列预定义的指令,如AT+CMGF用于设置短信模式(文本或PDU),AT+CMGS用于发送短信,而AT+CMGL用于读取短信等。在Java程序中,我们可以通过调用SerialPort对象的writeBytes方法发送AT命令,然后通过...
综上所述,这个Java二次开发代码项目是为了解决在Windows系统下,如何利用Java编程语言,通过串口控制GPRS MODEM,利用AT指令进行短信的发送和接收。这对于需要集成短信功能的Java应用来说,是一个实用的开发基础。...
综上,无论选择哪种方式,实现Java发送短信都需要对网络通信、JSON处理、错误处理有深入了解,并可能涉及到硬件设备的控制。对于开发者来说,理解相关的API文档和协议标准是必不可少的步骤。在实际项目中,还要考虑...
AT命令集提供了发送和接收短信的命令,如`AT+CMGF`用于切换文本模式或PDU模式,`AT+CMGS`用于发送短信,`AT+CMGL`用于读取短信等。通过Java串口通信,我们可以实现自动化的短信收发功能,例如在后台服务中监控特定...