社区
下载资源悬赏专区
帖子详情
AT指令发中文短信的实现下载
weixin_39821051
2019-06-11 11:30:13
利用At指令集操作手机发送短信的实验和分析
相关下载链接:
//download.csdn.net/download/moneysmile/2543220?utm_source=bbsseo
...全文
9
回复
打赏
收藏
AT指令发中文短信的实现下载
利用At指令集操作手机发送短信的实验和分析 相关下载链接://download.csdn.net/download/moneysmile/2543220?utm_source=bbsseo
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
AT
指令
发
中文
短信
的
实现
利用At
指令
集操作手机
发
送
短信
的实验和分析
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 RecvSmsList(Port myport) { if(!myport.isIsused()) { System.out.println("System Message: COM通讯端口未正常打开!"); return null; } List listMes = new ArrayList(); 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
发送
短信
息 * @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 analyseArraySMS(String str) { List mesList = new ArrayList(); 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 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 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(); } }
stm32+4G从零开始连接阿里云IOT
本课程着重介绍如何使用stm32+4G通信模组连接阿里云物联网平台,
实现
数据属性上报以及远程升级功能。在本课程中,大家可以学习到如何使用操作阿里云物联网平台;4G模块和AT
指令
的编程技巧;以及MQTT协议的内容和源码的移植,在课程后面我会手把手的教大家怎么使用stm32这款低端平台的单片机编程
实现
连接阿里云物联网平台。随着物联网技术日益成熟,目前很多设备都是搭载通信模组“上云”。通过学习本课程后我相信大家对设备上云有一个全面的认识,帮助大家在工作谈薪时多个加分项,(据我了解,目前熟悉物联网开
发
的工程师不会低于20K)。在学习本课程时也希望大家做到如下:1、熟悉stm32基本开
发
工作,或者能很快看懂stm32平台的源码。2、由于课程中产出的代码量较多,课程无法逐一讲解,大家在课下好好阅读底层
实现
。
Quectel BC95
中文
AT
指令
集 NB-IoT
NB-IoT的
中文
指令
集,基于BC95 657 SP2版本翻译的。 —————————————————————— AT 命令 描述
实现
的状态 3GPP Commands (27.007) AT+CGMI 查询制造商 ID B350+ AT+CGMM 查询模块型号 B350+ AT+CGMR 查询固件版本 B350+ AT+CGSN 查询模块序列号 B350+ AT+CEREG 查询网络注册状态 B350+ AT+CSCON 查询信号连接状态 B350+ AT+CLAC 列出可用命令 B350+ AT+CSQ 获取信号强度 B350+ AT+CGPADDR 显示 PDP 地址 B350+ AT+COPS 选择接入的网络 B350+ AT+CGATT PS 连接或分离 B350+ AT+CGACT 激活或停用 PDP 上下文 B657SP1+ AT+CIMI 查询国际移动设备身份码 B350+ AT+CGDCONT 定义一个 PDP 上下文 B350+ AT+CFUN 设置终端功能 B350+ AT+CMEE 报告移动终端错误 B600+ AT+CCLK 返回当前日期和时间 B656+ AT+CPSMS 省电模式设置 B657SP1+ AT+CEDRXS eDRX 设置 B657SP1+ AT+CEER 扩展错误报告 B657SP1+ AT+CEDRXRDP eDRX 阅读动态参数 B657SP1+ AT+CTZR 时区报告 B657SP1+ ETSI Commands(正在开
发
中) AT+CSMS 选择短消息服务 B657SP1+ AT+CNMA 模块消息提醒 B657SP1+ AT+CSCA 服务中心地址 B657SP1+ AT+CMGS
发
送短消息 B657SP1+ AT+CMGC
发
送
短信
命令 B657SP1+ AT+CSODCP 通过控制层
发
送原始数据 B657SP1+ AT+CRTDCP 通过控制层传送终端数据 B657SP1+ General Commands 通用命令 AT+NMGS
发
送消息到 CDP 服务器 B350+ AT+NMGR 接收 CDP 服务器消息 B350+ AT+NNMI 接收消息标志 B350+ AT+NSMI
发
送消息的标志 B350+ AT+NQMGR 查询接收到的消息量 B350+ AT+NQMGS 查询
发
送的消息量 B350+ AT+NMSTATUS 信息注册状态 B657SP1+ AT+NRB 模块重启 B350+ AT+NCDP 配置和查询 CDP 服务器设置 B350+ AT+NUESTATS 获取的操作统计 B350+ AT+NEARFCN 指定搜素频率 B350+ AT+NSOCR 创建 Socket B350+ AT+NSOST
发
送数据 B350+ AT+NSOSTF
发
送有标记数据 B656+ AT+NSORF 接收命令 B350+ AT+NSOCL 关闭 Socket B350+ +NSONMI 指示 Socket 消息到达(只响应) B350+ AT+NPING 测试 IP 网络连接到远程主机 B350+ AT+NBAND 设置频段 B600+ AT+NLOGLEVEL 设置日志级别 B600+ AT+NCONFIG 配置模块的功能 B650+ AT+NATSPEED 配置 UART 端口波特率 B656+ AT+NCCID 卡片识别 B657SP1+ AT+NFWUPD 通过 UART 更新固件 B657SP1+ AT+NRDCTRL 控制无线配置 B657SP1+ AT+NCHIPINFO 读取系统信息 B657SP1+ Temporary Commands 临时命令
通过串口使用AT
指令
发
送短消息
首先,我们要对由ESTI制订的SMS规范有所了解。与我们讨论的短消息收
发
有关的规范主要包括GSM 03.38、GSM 03.40 和GSM 07.05。前二者着重描述SMS的技术
实现
(含编码方式),后者则规定了SMS的DTE-DCE接口标准(AT命令 集)。 一共有三种方式来
发
送和接收 SMS 信息:Block Mode, Text Mode 和 PDU Mode。Block Mode 已是昔日黄花,目前很 少用了。Text Mode 是纯文本方式,可使用不同的字符集,主要用于欧美地区。从技术上说也可用于
发
送
中文
短消息, 但国内手机基本上不支持。PDU Mode 被所有手机支持,可以使用任何字符集,这也是手机默认的编码方式。Text Mode 比较简单,而且不适合做自定义数据传输,我们就不讨论了。
下载资源悬赏专区
12,794
社区成员
12,330,525
社区内容
发帖
与我相关
我的任务
下载资源悬赏专区
CSDN 下载资源悬赏专区
复制链接
扫一扫
分享
社区描述
CSDN 下载资源悬赏专区
其他
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章