.net平台手机管理软件开发(12)—— 短信部分 通过RS232发送和接收短信

** (十二) ** ** 短信部分——通过 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>
Published At
Categories with Web编程
Tagged with
comments powered by Disqus