离线短信应用无法正常读取

1,505 阅读6分钟

一、短信AT命令

1、AT+CPMS 作用:设置短信存储位置

AT+CPMS=?
+CPMS: ("ME","MT","SM","SR"),("ME","MT","SM","SR"),("ME","MT","SM","SR")

+CPMS: (list of supported <mem1>s),(list of supported<mem2>s),(list of supported<mem3>s)

参数说明:

“SM”(U)SIM信息存储 “ME”移动设备信息存储 “MT”与“ME”存储相同 "SR"在EC20 AT手册也没找到相应说明,暂时置之不理。

mem1:要从该内存存储中读取和删除的消息 mem2:消息将被写入并发送到该内存存储 mem3:接收到的消息将被放置在这个内存存储中(前提没有使用AT+CNMI进行设置)

AT+CPMS="SM","SM","SM"设置短信存储在sim卡中。

2、AT+CNMI

作用:SMS事件报告配置

AT+CNMI=?
+CNMI: (0-2),(0-3),(0,2),(0-2),(0,1)

OK

详细说明,参考:https://blog.csdn.net/chenwr2018/article/details/88313436

3、AT+CMGF

作用:设置短信格式

AT+CMGF=?
+CMGF: (0,1)

OK

参数说明:

0为PDU模式 1为Text模式

注意:在CDMA网络下,只支持Test模式。

4、AT+CMGS

作用:发送短信

(1)先设置Test模式

AT+CMGF=1 不然会出现

AT+CMGS="139000000"

+CMS ERROR: 304

(2)设置终端字符集

AT+CSCS="GSM"

OK

(3)输入号码短信内容

AT+CMGS="13900000000"

> 666
> 
+CMGS: 46

OK

AT+CMGS="13900000000"

回车后出现> 输入完内容回车,接着ctrl + z发送。

5、AT+CMGR

作用:读取短信

AT+CMGR=< index >

参数index 手册翻译内容如下:

关联内存支持的位置号范围内的整数类型值。(后面一大连串的参数说明搞得头晕晕的,感觉暂时也不用关注那么细。)

AT+CMGR=0表示接收到的第一条短信,AT+CMGR=1表示接受到的第二条短信,以此类推。

Test模式

“REC UNREAD” Received unread messages 收到未读消息
“REC READ” Received read messages 收到已读信息
“STO UNSENT”  Stored unsent messages 存储未发送的消息
“STO SENT” Stored sent messages 存储已发送的消息
“ALL”  All messages

PDU模式

0  Received unread messages
1  Received read messages
2  Stored unsent messages
3  Stored sent messages
4  All messages
AT+CMGF=1

OK
AT+CMGR=2

+CMGR: "REC UNREAD","139000000000",,"19/03/07,19:29:33+32",161,36,0,0,"+8613010383500",145,4
2333

OK

6、AT+CMGL

作用:罗列出所有短信

参数:查询对应状态的所有短信

AT+CMGL=?

+CMGL: ("REC UNREAD","REC READ","STO UNSENT","STO SENT","ALL")

OK
AT+CMGL="ALL"

+CMGL: 0,"REC READ","13900000000",,"19/03/07,19:22:15+32",161,2
66
+CMGL: 1,"REC READ","13900000000",,"19/03/07,19:24:38+32",161,3
999
+CMGL: 2,"REC READ","13900000000",,"19/03/07,19:29:33+32",161,4
2333
+CMGL: 3,"REC READ","13900000000",,"19/03/07,19:41:36+32",161,10
chenwr2018

OK

罗列出所有短信内容。

7、AT+CMGD

作用:删除短信

AT+CMGD=?

+CMGD: (0,1,2,3),(0-4)

+CMGD: (list of supported s),(list of supported s)

参数: index指的就是短信索引号,从0开始,3表示第四条短信。

delflag

0  删除索引号指定的短信
1  删除所有从存储器读取的短信
2  删除所有从存储器读取的短信,并发送手机短信
3  删除所有从存储中读取的短信,以及所有发送和未发送的手机短信
4  删除存储器中所有短信
AT+CMGD=1  //删除索引为1的短信
OK
AT+CMGD=1,4  //删除所有短信
OK

8、AT+CSCA

作用:查询短信中心号码。

AT+CSCA?
+CSCA: "+8613010300000",145

OK

二、离线短信问题分析

1、短信作用

(1)短信主要作用用来参数设置与控制设备。 特殊使用场景,发送复位短信。设备每次开机会去读取短信内容。因此必须保证已读的短信删除,否则设备会不断复位。 (2)由于SIM卡只有1万到10万次的读写次数和40-50短消息的存储空间。使用寿命与空间的问题,导致前期设置接收到短信不存储直接通知TE(Terminal Equipment 终端设备)。

问题: 离线发送控制短信,设备重新上电后无法正常接收,应用层没法读取到离线短信的控制命令。

疑问: 离线短信的具体原理是否事先存放在基站中,等手机终端广播告知基站已经驻网然后下发到手机终端上? 如果是这样那么整个短信收发流程跟正常设备在线是一致的?那为何接收不到呢?

2、简单短信原理阐述

(1)手机收发短信流程

源手机-》基站-》短信中心-》基站-》目的手机

(2)基站

基站会不断广播信息 方便手机搜寻到基站 不同基站的广播频率不一致 GSM系统 扫描整个频段,信号最强为合适基站【类比收音机收听广播的原理】 CDMA系统 基站固定使用频率。【控制载频 调谐】

(3)基站如何找到手机

基站不断广播,手机连上时当前基站会发送个位置区。当手机发现自己当前位置区发生变化,会发送自己当前位置,无线网络会记录在数据库里(位置寄存器) 手机周期性告诉无线网络自己当前的位置。

(4)流程说明

  • 源手机发送短信,其实是发送到基站。手机与基站有个专门的通道,控制通道为SMS短信提供通路。
  • 每个手机都有个SMSC(短信业务中心),当其他人给自己手机发送SMS短信时,其实是发送给短信业务中心。这种机制应该类似早期的传呼机原理。
  • 该条短信将以控制通道上小型数据包的形式先通过SMSC(短信业务中心),然后通过基站将短信发送到手机。同理,当自己发送短信时,手机将通过控制通道将短信发送到基站,再由基站传送到SMSC,最后从这个位置到达接收目标。

3、目前的做法

为了保证离线短信能够被应用层正常获取。

  • 不管什么状态下发送的短信,都先保存到sim卡中。
  • 设备初始化之后,等执行程序读取该短信之后再把sim卡的内容删除。

主要的问题依然在sim卡读写寿命问题,不过还好短信控制命令使用频率不是很高!

参考资料:移远EC20 AT指令手册、《大话无线数据通信》