如何使用AT命令操作SIM卡进行短信发送

如何使用AT命令操作SIM卡进行短信发送,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

创新互联长期为近千家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为天宁企业提供专业的成都网站建设、成都网站制作,天宁网站改版等技术服务。拥有10多年丰富建站经验和众多成功案例,为您定制开发。

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

有效值0-31。值越大表明信号越好,16以下,呼叫有可能失败。

模块信号强度范围在-75到-125DB,换算到有效值公式为

31×(125-|DB|)/50

信道误帧率。

设置短信格式

“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:

删除短信

“AT+CMGD=1\r”

OK

错误时返回

AT+CMGD=1

+CMGD ERROR:

短信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: :

0xa1为的符号码,表示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()、关闭串口。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注创新互联行业资讯频道,感谢您对创新互联的支持。


当前文章:如何使用AT命令操作SIM卡进行短信发送
当前路径:http://scyanting.com/article/joeegp.html