文档章节

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

邵周铧
 邵周铧
发布于 2016/08/07 14:52
字数 1999
阅读 50
收藏 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
STL,ATL,WTL的联系与区别

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

IMGTN
2012/06/04
0
0
c++ ActiveX基础1:使用VS2010创建MFC ActiveX工程项目

1.ActiveX的基本概念 ActiveX控件可以看作是一个极小的服务器应用程序,它不能独立运行,必须嵌入到某个容器程序中,与该容器一起运行。这个容器包括WEB网页,应用程序窗体等。。。 ActiveX控...

moki_oschina
2015/01/08
0
0
详解DC、CDC、HDC、句柄、设备上下文

MFC中的DC、CDC、HDC、句柄、设备上下文究竟是什么意思? 在MFC程序中,我们并不经常直接调用Windows API,而是从MFC类创建对象并调用属于这些对象的成员函数.也就是说MFC封装了Windows API 你...

IMGTN
2012/06/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

20.27 分发系统介绍~ 20.30 expect脚本传递参数

分发系统介绍分发系统-expect讲解(也就是一个分发的脚本)场景:业务越来越大,网站app,后端,编程语言是php,所以就需要配置lamp或者lnmp,最好还需要吧代码上传到服务器上;但是因...

洗香香
16分钟前
1
0
设计一个百万级的消息推送系统

前言 首先迟到的祝大家中秋快乐。 最近一周多没有更新了。其实我一直想憋一个大招,分享一些大家感兴趣的干货。 鉴于最近我个人的工作内容,于是利用这三天小长假憋了一个出来(其实是玩了两...

crossoverJie
22分钟前
1
0
软件架构:5种你应该知道的模式

Singleton(单例模式)、仓储模式(repository)、工厂模式(factory)、建造者模式(builder)、装饰模式(decorator)……大概每个上课听讲的程序员都不会陌生——软件的设计模式为我们提供...

好雨云帮
34分钟前
2
0
OSChina 周二乱弹 —— 这只是一笔金钱交易

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @小小编辑:推荐歌曲《暮春秋色》- 窦唯 / 译乐队 《暮春秋色》- 窦唯 / 译乐队 手机党少年们想听歌,请使劲儿戳(这里) @我没有抓狂:跨服聊...

小小编辑
46分钟前
405
14
df命令、du命令 、磁盘分区

9月25日任务 4.1 df命令 4.2 du命令 4.3/4.4 磁盘分区 4.1、命令 :df #磁盘空间使用情况 [root@zgxlinux-02 ~]# df 按字节显示 1000Byte=1KB 1000KB=1MB 1000MB=1GB ...

zgxlinux
54分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部