[应用][AT][C++] 使用AT命令操作SIM卡进行短信发送
最近投身于某电子公司的用电信息采集终端软件重写,主要负责终端与主台的通讯功能编写。本周用到了AT命令操作SIM卡进行发送短信功能,在此做一个小小的总结,希望对有类似需求的童鞋能有所帮助。
注:由于有C语言源码,再加上鄙人对硬件实在是知之甚少,所以很多操作步骤都是按照原有逻辑进行重写(尤其是短信模块的初始化),若有错误,请各位酌情添加、删除或修改。
1、 硬件的初始化
在现有代码逻辑中按如下步骤进行硬件初始化:打开串口→重启SIM硬件模块→发送AT命令检查SIM卡运行状态。
a) 打开串口
串口操作已经有很成熟的代码,这里就不赘述了。
b) 重启SIM硬件模块
使用的魔法数字定义:
static const unsigned char RESET_CTL = 0;
static const unsigned char POWER_CTL = 1;
static const unsigned char IGT_CTL = 2;
重启步骤 |
硬件操作 |
turnOffModel() |
int fd = open( "/dev/gprs_io", O_RDWR | O_NONBLOCK ) |
ioctl( fd, 0, POWER_CTL) |
|
sleep(3) |
|
::close(fd) |
|
startModel() |
int fd = open( "/dev/gprs_io", O_RDWR | O_NONBLOCK ) |
ioctl(fd, 0, IGT_CTL) |
|
ioctl(fd, 1, POWER_CTL) |
|
ioctl(fd, 1, RESET_CTL) |
|
usleep(500000) |
|
ioctl(fd, 0, RESET_CTL) |
|
usleep(500000) |
|
ioctl(fd, 1, RESET_CTL) |
|
sleep(2) |
|
ioctl(fd, 1, IGT_CTL) |
|
sleep(3) |
|
ioctl(fd, 0, IGT_CTL) |
|
::close(fd) |
|
sleep(5) |
c) 发送AT命令检查SIM卡运行状态
操作步骤 |
发送的AT命令(C++转意格式) |
模块正常时回复的结果 |
结果含义 |
检测模块是否正常 |
“AT\n” |
AT OK |
OK表示模块正常 ERROR表示模块异常 |
查询移动终端国际移动台标号 |
“AT+CIMI\n” |
AT+CIMI 460000973136668 |
第二行数字为移动终端国际移动台标号。 此处用于系统进行操作记录,可忽略结果。 |
检测SIM是否已注册到网络 |
“AT+CREG?\n” |
AT+CREG? +CREG: 0,2 OK |
<0,2><0,5><1,2><1,5>均认为结果正确。 +CREG: mode,state mode: 0 : 禁止网络注册主动提供结果代码(默认设置) 1:允许网络注册主动提供结果代码,格式: state: 0:未注册,并且模块当前不搜寻新的运营商 1:已注册本地网络 2:未注册,终端正在搜寻基站 4:注册被拒绝 5:已注册,并且处于漫游状态 |
查看信号值 |
“AT+CSQ\n” |
AT+CSQ +CSQ: 13,5 OK |
第一个数字(即接收信号强度)大于6即认为可用。 +CSQ:<RSSI>,<FER> <RSSI>: 有效值0-31。值越大表明信号越好,16以下,呼叫有可能失败。 模块信号强度范围在-75到-125DB,换算到有效值公式为 31×(125-|DB|)/50 <FER>: 信道误帧率。 |
设置短信格式 |
“AT+CMGF=0\n” |
AT+CMGF=0 OK |
0:PDU模式。 1:文本模式。 |
2、 接收短信
操作步骤如下:
操作步骤 |
发送的AT命令(C++转意格式) |
模块正常时回复的结果 |
结果含义 |
获取短信数量 |
"AT+CPMS=\"SM\",\"SM\",\"SM\"\r" |
+CPMS: 4,50,4,50,4,50 OK |
此处取前两位数字: 4表示当前存储的短信数量; 50表示SIM卡可存储的短信总量。 |
获取短信1信息 |
“AT+CMGR=1\r" |
+CMGR: 1,,38 0891683108200845F7240D91683121436587F9 0000617072917253231 474747A0E4ACF416110BD3CA783C66F72D905 |
错误时会返回: AT+CMGR=1 +CMS ERROR:<err> |
删除短信 |
“AT+CMGD=1\r” |
OK |
错误时返回 AT+CMGD=1 +CMGD ERROR:<err> |
短信PDU码流解析:
0891683108200845F7240D91683121436587F90000617072917253231474747A0E4ACF416110BD3CA783C66F72D905
08 |
短信中心号码(含类型码)所占字节数 |
08表示之后8个字节(即16个十六进制数)为短信中心号码(含类型码) |
91 |
短信中心号码类型 |
91表示国际码 A1表示国内码 |
68 31 08 20 08 45 F7 |
短信中心号码 |
使用的是BCD编码,该例中短信中心号码为“8613800280547”。即所有字节高低位交换。F为填充码。 |
24 |
基本参数(TP-MTI/MMS/RP) |
含义未知 |
0D |
发送方电话号码长度(个数,非字节数,不含类型码) |
本例中为13个数字 |
91 |
发送方电话号码类型 |
91表示国际码 A1表示国内码 |
68 31 21 43 65 87 F9 |
发送方电话号码 |
本例发送方电话号码为“8613123456789”(请原谅我为了保护隐私,修改了这段码流) |
00 |
参数显示SMSC以何种方式处理SM (比如FAX,、Voice等) |
00表示是普通GSM类型,点到点方式 |
00 |
用户数据(UD)编码方案 |
00为7-bit编码,08为UCS2编码 |
61 70 72 91 72 53 23 |
BCD编码,时间戳 |
本例为 16年7月27日19:27:35 +8时区 |
14 |
短信的实际长度。 |
本例为20个字节。 |
74 74 7A 0E 4A CF 41 61 10 BD 3C A7 83 C6 6F 72 D9 05 |
用户数据”this is a test code.”的7-bit编码。 |
用户数据所占字节数因“编码方案”不同而不同。 |
用户数据的实际字节数(1个字节为2个16进制数)计算方式:
7-bit编码: 短信实际长度*7/8,若有余数则加1.
UCS2编码: 短信实际长度.
其他方式(不推荐,仅用于保证程序的健壮性):短信实际长度和”/r/n”之间的数据。
3、 发送短信
操作步骤如下;
操作步骤 |
发送的AT命令(C++转意格式) |
模块正常时回复的结果 |
结果含义 |
发送短信 |
“AT+CMGS=33\r" |
> |
等待输入短信PDU编码 |
"0891683108100005F011000D91683121436587F90000AA 1474747A0E4ACF416110BD3CA783C66F72D905"+0xA1 |
OK |
发送成功。 失败返回: +CMS ERROR: :<err> 0xa1为<Ctrl-Z>的符号码,表示PDU码流发送结束。 |
“AT+CMGS=33\r"中33表示发送的PDU编码中除去短信中心号码(”0891683108100005F0”)外的其他信息字节数(不含0xA1)。本例中为码流” 11000D91683121436587F90000AA1474747A0E4ACF416110BD3CA783C66F72D905”的长度除以2.
短信PDU码流解析:
0891683108100005F011000D91683121436587F90000AA1474747A0E4ACF416110BD3CA783C66F72D905
08 |
短信中心号码(含类型码)所占字节数 |
08表示之后8个字节(即16个十六进制数)为短信中心号码(含类型码) |
91 |
短信中心号码类型 |
91表示国际码 A1表示国内码 |
68 31 08 10 00 05 F0 |
短信中心号码 |
使用的是BCD编码,该例中短信中心号码为“8613800100500”。即所有字节高低位交换。F为填充码。 |
11 |
pdu类型 |
11:160个英文字符/70个汉字以内的短信,无短信报告 31:160个英文字符/70个汉字以内的短信,有短信报告 51:长短信(多条合并),无短信报告 71:长短信(多条合并),有短信报告 |
00 |
消息基准值(TP-MR) |
|
0D |
发送方电话号码长度(个数,非字节数,不含类型码) |
本例中为13个数字 |
91 |
发送方电话号码类型 |
91表示国际码 A1表示国内码 |
68 31 21 43 65 87 F9 |
发送方电话号码 |
本例发送方电话号码为“8613123456789”(请原谅我为了保护隐私,修改了这段码流) |
00 |
参数显示SMSC以何种方式处理SM (比如FAX,、Voice等) |
00表示是普通GSM类型,点到点方式 |
00 |
用户数据(UD)编码方案 |
00为7-bit编码,08为UCS2编码 注;与短信实际长度、用户数据要相对应,否则会返回531错误。 |
AA |
短信有效期(TP-VP) |
00 表示5分钟 AA表示最长 其他未知 |
14 |
短信的实际长度。 |
20个字节。与编码方案、用户数据相对应。 |
74 74 7A 0E 4A CF 41 61 10 BD 3C A7 83 C6 6F 72 D9 05 |
用户数据”this is a test code.”的7-bit编码。 |
用户数据所占字节数因“编码方案”不同而不同。 |
4、 关闭模块
turnOffModel()、关闭串口。
参考文档及网页:
中兴通讯 ME3000模块AT指令手册(V1[1].3)
通过串口发短信息http://fly-top.blog.163.com/blog/static/1727551122011223112159820/
用串口操作手机收发短信总结http://blog.csdn.net/nonetracer/article/details/2525600
转载于:https://my.oschina.net/shaozhouhua/blog/729124
[应用][AT][C++] 使用AT命令操作SIM卡进行短信发送相关推荐
- android sim卡 信息,android-如何使用SIM2或双SIM卡提交短信
我创建了Android短信应用程序 我已经能够顺利发送短信sim卡的短信,则没有报告. 顺利 请帮助我添加其源代码 我的密码 public class MainActivity extends Act ...
- android stuido 如何使用SIM2或双SIM卡提交短信
Android studio 使用默认SIM卡发送短信的代码非常简单 SmsManager.getDefault().sendTextMessage("电话号码", null, & ...
- 电脑通过手机SIM卡收发短信
一.开发背景: 应客户需求,用户在网站注册时,网站要向用户手机发送验证码短信. 二.硬件准备: 1.电脑一台 2.西门子.诺基亚.摩托罗拉等支持AT指令的手机或支持AT指令的GSM短信终端. 3.手机 ...
- 【群控】通过adb命令实现接打电话发短信脚本
由于电信局有规定,手机号码长期不使用时会进入锁定状态(能接电话不能打电话,能接短信不能发短信),所以为了避免手机号被判定为僵尸号需要做一个定期互相拨打电话并且接通的脚本. 声明:本文只用作技术讨论,技 ...
- Android学习之——操作SIM卡联系人
今天!!!对,就是就是今天,,,,我终于换手机啦啦啦,四儿子拿到手啦...虽然是个二手货,不过人家他爸也不卖了,只能买二手货了,五儿子那凸凸的摄像头和价格又有点难以下咽. 嗯.....新机子到手,折腾 ...
- API调用实现短信发送以及天气预报外加HTTP和MQTT实践操作
文章目录 一.关于HTTP协议和MQTT协议 1.HTTP协议 2.API应用实例 二.MQTT协议 1.简介 2.MQTT实战入门 2.2.1 MQTT的安装 2.2.2 主题定义以实战演练 三.小 ...
- pc(电脑)用java通过adb操作android手机发短信及中文乱码解决
最近想用java调用android手机的短信功能.已开始用一下方法实现: adb -s emulator-5554 shell am start -a android.intent.action.SE ...
- java代码如何运用加密狗_如何使用JAVA从加密狗的SIM中读取短信
我使用以下代码从加密狗发送短信. 它的发送成功了. 现在我想从加密狗读取SIM短信或未读短信,所以任何人都可以告诉我如何阅读 以下是发送短信的代码 import org.smslib.Outbound ...
- 用串口操作手机收发短信总结
终于完成了用Java操作手机的模块,遇到了不少麻烦,在这里总结一下,也希望对大家有所帮助. 可能有很多人会问,现在的手机与计算机连接都是USB口,那研究串口手机通讯有什么意义?我开始也是这样考虑,所以 ...
最新文章
- 参加web前端开发培训具体要学什么内容
- gdb php-fpm,使用 gdb 调试 php-fpm 异常错误
- Apple导出p12证书 导出证书为p12 Apple开发
- 企业价值观念形成的四个阶段
- 我的Android笔记--我对安卓系统的一些了解
- 0.11内核rd_load@ramdisk.c中memcpy函数好像有bug
- 机器学习中的数学(4)-线性判别分析(LDA), 主成分分析(PCA)
- PIL 学习笔记(1)
- 基本shell编程【3】- 常用的工具awk\sed\sort\uniq\od
- java压缩文件夹(含有空文件夹)
- 首发!来自你的Java同行的调查报告
- hart协议服务器,基于HART协议智能仪表的在线管理系统的设计与实现
- 纯html+css写一个收款收据或者发票样式
- 自学软件测试怎么样,有前景吗?
- Python字典知识总结
- 孙溟㠭绘画篆刻——《梦》
- 失落的时候如何调整自己的心情
- 计算机一级ppt演示文稿第5套,PPT | 操作题第 13 套
- 小巧舒适佩戴稳定蓝牙耳机推荐,2020双11高性价比蓝牙耳机,机不可失
- 国家开放大学计算机应用基础终结性考试(大作业).zip