文档章节

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

邵周铧
 邵周铧
发布于 2016/08/07 14:52
字数 1999
阅读 31
收藏 0
点赞 0
评论 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
成都
程序员
VS2010/MFC编程入门教程之目录和总结(鸡啄米)

鸡啄米的这套VS2010/MFC编程入门教程到此就全部完成了,虽然有些内容还未涉及到,但帮助大家进行VS2010/MFC的入门学习业已足够。以此教程的知识为基础,学习VS2010/MFC较为深入的内容已非难事...

weixin_40647819 ⋅ 05/23 ⋅ 0

c语言编程软件有哪些 Win7下用哪种C语言编译器

C语言是一门历史很长的编程语言,其编译器和开发工具也多种多样,其开发工具包括编译器,现举几个开发工具供大家选择,当然也要根据自己的操作系统来选择适合自己的开发工具 好多刚开始接触c...

mini92 ⋅ 04/20 ⋅ 0

大神有话说之c++,还在迷茫的朋友可以来看一下

C++ 是一种中级语言,它是由 Bjarne Stroustrup 于 1979 年在贝尔实验室开始设计开发的。C++ 进一步扩充和完善了 C 语言,是一种面向对象的程序设计语言。C++ 可运行于多种平台上,如 Window...

悟空_b201 ⋅ 05/30 ⋅ 0

Java程序员如何高效而优雅地入门C++

Java程序员如何高效而优雅地入门Cpp,由于工作需要,需要用C++写一些模块。关于C++ 的知识结构,虽说我有过快速学习很多新语言的经验,但对于C++ 我也算是老手,但也还需要心生敬畏,本文会从...

小欣妹妹 ⋅ 04/23 ⋅ 0

C语言/C++编程新手学习常见问题

C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到...

小辰带你看世界 ⋅ 05/11 ⋅ 0

跪求大佬对java web项目与桌面应用数据交互方面给予指导!

最近在做一个java web项目,其中有个模块,需要在web项目中点击某个按钮的时候向一个桌面应用程序(另一个团队使用C/C++写的程序)发送一个指令。说到底就是javaweb项目中向C/C++项目发送一个...

Daisygeo ⋅ 04/23 ⋅ 0

SWIG与JAVA 交互最全开发指南一

项目背景 最近开始研究做移动端项目,但是本人基本是做了五六年的c++的底层研发,对C++的研发可以说是驾轻就熟了,但是对于android还是属于刚入门阶段,虽然断断续续做移动端也做了一年,但是...

揽月凡尘 ⋅ 06/16 ⋅ 0

C语言编程新手基础学习:Windows编程入门

C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到...

小辰带你看世界 ⋅ 05/22 ⋅ 0

AndroidStudio3.0NDK输出多个so库

个人博客地址 http://dandanlove.com/ 前言 去年的 Android之NDK开发初体验 这篇文章讲述NDK开发环境的搭建,以及在AndroidStudio3.0版本之前的NKDK简单开发。这次升级到Android Studio3.1,...

静默加载 ⋅ 04/12 ⋅ 0

C语言程序员编程学习文件操作与JSON

C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到...

小辰带你看世界 ⋅ 03/15 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

两道面试题,带你解析Java类加载机制

在许多Java面试中,我们经常会看到关于Java类加载机制的考察,例如下面这道题: class Grandpa{ static { System.out.println("爷爷在静态代码块"); }} cl...

1527 ⋅ 11分钟前 ⋅ 0

SpringCloud(Data Flow)

dataflow-server

赵-猛 ⋅ 21分钟前 ⋅ 0

深入理解Java虚拟机

这本书我读到第8章,之后就是在读不下去了。 读到后面是一种痛苦的体验,太多的东西是不全面的,大量的专有名词是没有解释的,读到最后很多东西仅仅是一个侧面,所以我觉得,这本书不适合初学...

颖伙虫 ⋅ 26分钟前 ⋅ 0

B树和B+树的总结

B树 为什么要B树 磁盘中有两个机械运动的部分,分别是盘片旋转和磁臂移动。盘片旋转就是我们市面上所提到的多少转每分钟,而磁盘移动则是在盘片旋转到指定位置以后,移动磁臂后开始进行数据的...

浮躁的码农 ⋅ 29分钟前 ⋅ 0

NanoPi NEO core/ Ubuntu16.04单网卡配置3个IP地址(2个静态,1个动态)

配置 root@NanoPi-NEO-Core:/etc/network# cat interfacesauto loiface lo inet loopbackallow-hotplug eth0iface eth0 inet static address 172.31.188.249 netmask 255.......

SamXIAO ⋅ 56分钟前 ⋅ 0

三步为你的App集成LivePhoto功能

摘要:LivePhoto是iOS9新推出的一种拍照方式,类似于拍摄Gif图或录制视频片段生成图片。如果没有画面感,可以联想《哈利波特》霍格沃茨城堡的壁画,哈哈,很炫酷有木有,但坑爹的是只有iphone6S以...

壹峰 ⋅ 今天 ⋅ 0

centos7 git安装

由于centos中的源仓库中git不是最新版本,需要进行源码安装。 1、查看yum仓库git信息 [root@iZm5e3d4r5i5ml889vh6esZ zh]# yum info gitLoaded plugins: fastestmirrorLoading mirror s...

xixingzhe ⋅ 今天 ⋅ 0

input file 重复上传同一张图片失效的解决办法

解决办法 方法一:来回切换input[type='file']的type属性值,可以是‘text’,'button','button'....,然后再切换回来‘file’ 方法二:每次取消图片预览后,重置input[type='file']的value的...

时刻在奔跑 ⋅ 今天 ⋅ 0

Mahout推荐算法API详解

前言 用Mahout来构建推荐系统,是一件既简单又困难的事情。简单是因为Mahout完整地封装了“协同过滤”算法,并实现了并行化,提供非常简单的API接口;困难是因为我们不了解算法细节,很难去根...

xiaomin0322 ⋅ 今天 ⋅ 0

WampServer默认web服务器根目录位置

安装WampServer之后的web服务器根目录默认位置在WampServer安装目录下的www:

临江仙卜算子 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部