** (十二) ** ** 短信部分——通过 RS232 ** ** 发送和接收短信 **
通常,发送和接收短信的终端都是通过串行接口连接电脑,这类设备用得比较多的是 GSM Modem 和手机。这类设备通常都支持 PDU 模式,但仍有少数设备只支持 Text 模式。
设备硬件连接好以后可以通过发送 AT 指令测试设备是否连接正确能否正常通讯。在这里我使用 Windows 自带的“超级终端”工具进行通讯。此工具可以在程序——附件——通讯里面找到,如果没有请确认是否安装了此组件。或者在运行里面输入“ hypertrm ”也可以快速启动“超级终端”。
以下所有范例均以 Siemens M55 手机作为终端,有可能跟你设备返回的不同。具体参数清参阅设备相关 AT 指令集。本手机 AT 指令集在我主页上有下载。
** 准备工作: **
1、 ** 测试连接 ** :“ AT 8 ”测试终端是否连接正确。成功后返回“ OK ”。
2、 ** 设置回显 ** :(此步骤为了测试方便) ATE1 8
3、 ** 查阅及设置字符集: **
AT+CSCS=? 8
+CSCS: ("GSM","UCS2")
说明该终端支持 GSM 与 UCS2 两种字符集。一般对于中文环境设置为 UCS2
AT+CSCS="UCS2" 8
4、 ** 取得短信中心号码:
** AT+CSCA? 8
+CSCA: "+8613800280500",145
5、 ** 查询并设置 SMS ** ** 格式:
** ** 查询 ** : AT+CMGF= 8
** 返回 ** : +CMGF: (0)
0 代表 PDU 模式。你的设备可能有其他的选项,请参考设备的 AT 指令集。
设置: AT+CMGF=0 8
6、 ** 查询并设置短信储存位置: **
** 查询 ** : AT+CPMS=? 8
** 返回 ** : +CPMS: ("MT","SM","ME"),("MT","SM","ME"),("MT","SM","ME")
其中 MT 表示设备所有可用储存位置。 SM 代表 SIM 卡, ME 代表机身。
一般设置为: AT+CPMS= "MT","MT","MT" 8
** 查询短信: **
1、 ** 查询具有相同状态的所有短信
** ** 指令 ** : AT+CMGL=n
其中 n 代表 0-4 的数字。
0 ——未读得短信。执行命令以后自行变为已读取。
1 ——已读短信。
2 ——草稿。
3 ——已发送短信。
4 ——全部
** 返回(例):
** +CMGL: 76,3,,20
0891683108200805F011620D91683194041338F50000FF0530972D8603
76 ——序号
3 ——状态:发送
20 —— PDU 串长度
2、 ** 查询特定序号的短信
** ** 指令 ** : AT+CMGR=n 8
其中 n 代表序号
** 返回(例): **
+CMGR: 3,,20
0891683108200805F011620D91683195041338F50000FF0530972D8603
3 ——状态:发送
20 —— PDU 串长度
** 注意: PDU ** ** 串长度表示 PDU ** ** 中除去短信中心部分剩下的代码的长度的 1/2 ** ** 。例如上述 PDU ** ** 中 PDU ** ** 长度部分为 11620D91683195041338F50000FF0530972D8603 ** ** , 40 ** ** 个字符,表示 20 ** ** 个字节。 **
** 储存 PDU
** ** 指令 ** :
AT+CMGW=[PDU 长度 ] 8
>[PDU 串 ]
** 例如 ** :
AT+CMGW=20 8
> 0891683108200805F011620D91683195041338F50000FF0530972D8603
注意,输入 PDU 后按“ CTRL+Z ”终止。程序中使用 0x 1A , 0x1D 作为终止。
** 返回 ** : +CMGW: 85
85 ——序号
** 发送 PDU ** ** 串 **
1、 发送输入的 PDU 串
** 指令: **
AT+CMGS=[PDU 长度 ] 8
>[PDU 代码 ]
2、 发送指定序号的 PDU 串
** 指令:
** AT+CMSS=[ 序号 ] 8
** 接收短信 **
接收刚收到的短信有两种方法:轮询终端;使用事件
轮询终端可以定期的使用 AT+CMGL=0 指令读取未读取得指令。方法简单,但许多时候都在做无用功,效率低下,一般不建议采用。下面主要讲解事件法:
** 指令:
** AT+CNMI=
1<mode>,<mt>,<bm>,<ds>,<brf>
2
3** 参数:
4mode ** ** : **
5
6** 0 ** ** —— ** 缓存在终端
7
8**1** ** —— ** 直接发送到 TE
9
10** mt ** ** : **
11
12** 0 ** ** —— ** 接收到新的 SMS 不返回事件
13
14** 1 ** ** —— ** 如果接收到的 SMS 存储在 ME ,则返回
15+CMTI:<mem>,<index>
16
17** 2 ** ** —— ** 除了 Class2 SMS ,新的 SMS 直接发送到终端,返回:
18+CMT:<length><cr><lf><pdu>
19
20**3** ** —— ** Class3 SMS 使用 mt=2 的方法返回,其他类型的使用 mt=1 的方法返回。
21
22** bm ** ** : **
23
24** 0 ** ** —— ** 小区广播不通知
25
26** 2 ** ** —— ** 新的小区广播通知,返回
27+CBM:<length><cr><lf><pdu>
28
29**3** ** —— ** Class3 格式的小区广播通知,使用 bm=2 格式
30
31** ds ** ** : **
32
33** 0 ** ** —— ** 状态报告不通知
34
35** 1 ** ** —— ** 新的状态报告通知,返回:
36+CDS:<length><cr><lf><pdu>
37
38**2** ** —— ** 如果新的状态报告存储到 ME ,则返回:
39
40+CDSI:<mem>,<index>
41
42** brf ** ** : **
43
44** 1 ** ** —— ** 始终为 1
45
46** 例: **
47
48一般我们使用 AT+CNMI=1,1,0,2,1
49
50当收到新的短信时终端返回:
51
52+CMTI:ME,5
53
54新的状态报告:
55
56+CDSI:ME,6
57
58程序可以通过判断返回值并使用 AT+CMGR 指令返回新到短信。</index></mem></pdu></lf></cr></length></pdu></lf></cr></length></pdu></lf></cr></length></index></mem></brf></ds></bm></mt></mode>