文档章节

[应用][AT][C++] 使用AT命令操作SIM卡进行短信发送

邵周铧
 邵周铧
发布于 2016/08/07 14:52
字数 1999
阅读 61
收藏 0

        最近投身于某电子公司的用电信息采集终端软件重写,主要负责终端与主台的通讯功能编写。本周用到了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

© 著作权归作者所有

共有 人打赏支持
邵周铧
粉丝 0
博文 1
码字总数 1999
作品 0
成都
程序员
私信 提问
iOS—打电话、发短信

电话、短信是手机的基础功能,iOS中提供了接口,让我们调用。这篇文章简单的介绍一下iOS的打电话、发短信在程序中怎么调用。 1、打电话 [cpp] view plaincopyprint? [[UIApplication sharedA...

-Man
2015/11/19
0
0
MFC建立应用程序启示录(创世纪新篇)

MFC是vc+的核心部分,需要一定的编程功底。 Windows编程基础 编制一个功能强大和易操作的Windows应用程序所需要的代码肯定会比一般的C++程序要多得多,但并不是所有的代码都需要自己从头开始...

crossmix
2015/07/25
0
1
Visual C++网络编程案例实战

试读PDF下载: http://pan.baidu.com/s/1AEBtn 随书视频分享 http://pan.baidu.com/share/link?shareid=1501607663&uk=3593874494 随书PPT分享 http://pan.baidu.com/share/link?shareid=15......

请叫我院长
2013/11/29
747
3
SiteServer CMS 发布 V6.0 正式版

2018年3月1日,SiteServer CMS全新版本V6.0正式发布,这是继SiteServer CMS宣布开源并发布5.0版本之后的又一振奋人心的消息,SiteServer CMS V6.0版本带来了全新的插件平台、舒适的用户体验、...

SiteServer
03/01
550
2
STL,ATL,WTL的联系与区别

STL,ATL,WTL的联系与区别 STL 即 Standard Template Library STL(标准模板库)是惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时...

IMGTN
2012/06/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Kafka+Flink 实现准实时异常检测系统

1.背景介绍 异常检测可以定义为“基于行动者(人或机器)的行为是否正常作出决策”,这项技术可以应用于非常多的行业中,比如金融场景中做交易检测、贷款检测;工业场景中做生产线预警;安防...

架构师springboot
8分钟前
0
0
DecimalFormat 类基本使用

/* * DecimalFormat 类主要靠 # 和 0 两种占位符号来指定数字长度 * 0 表示如果位数不足则以 0 填充 * # 表示只要有可能就把数字拉上这个位置 * */ public static void main(String[] args){...

嘴角轻扬30
25分钟前
1
0
This APT has Super Cow Powers.

在Debian/Ubuntu上,apt包管理器内嵌着一个彩蛋. 如果你在命令行界面输入 apt help 在最后一行能找到This APT has Super Cow Powers. 说明该apt具有超级牛力 牛力是个什么梗? 则说明你的系统...

taadis
42分钟前
1
0
起薪2万的爬虫工程师,Python需要学到什么程度才可以就业?

爬虫工程师的的薪资为20K起,当然,因为大数据,薪资也将一路上扬。那么,Python需要学到什么程度呢?今天我们来看看3位前辈的回答。 1、前段时间快要毕业,而我又不想找自己的老本行Java开发...

糖宝lsh
51分钟前
6
0
携手开发者共建云生态 首届腾讯云+社区开发者大会在京举办

本文由云+社区发表 北京时间12月15日,由腾讯云主办,极客邦科技、微信、腾讯TEG协办的首届腾讯云+社区开发者大会在北京朝阳悠唐皇冠假日酒店举办。在会上,腾讯云发布了重磅产品开发者平台以...

腾讯云加社区
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部