http://www.paper.edu.cn
短消息
PDU
字段分析与实现
赵 波,王振凯
北京邮电大学电信工程学院,北京(100876)
E-mail:zbockham@163.com
摘 要:本文介绍了短消息编解码的原理,论述了短消息服务收发流程,并着重分析
PDU
的
字段含义,为½用
GSM
模块进行短消息应用的开发者提供了详细的协议分析过程,并提出
了编解码流程和
C
语言实现代码。
关键词:短消息;GSM 模块;协议数据单元
1.
引言
短消息服务(SMS),是一种固定电话(如家家易)、移动电话(如小灵通、手机)之
间,½用电信½络、CDMA½络、GSM½络,进行文本信息收发的电信增值服务。在中½,
手机短消息业务大幅增长始于2000年,
此后便成几½倍数增长早已成为手机用户不可缺少的
服务。据½家信息产业部发布数据显示,2006年全年移动短信业务量为4296.7亿条
[1]
。
由于移动蜂窝½络的覆盖范围广,短消息业务具备永远在线、不需拨号、价格便宜等优
势,信息发布平台、远程测控、无人值守设备等嵌入式设备利用短消息方式发布信息、传输
数据,
具有操½性强、
适用范围广、
实用性强等特点,
可以有效的降½人力成本和线路成本,
因此越来越多的受到运营商和系统开发商的重视
[2]
,生产了不同功½与用途的
GSM/GPRS
模块,如:Siemens 公司的
TC35、TC39i,Motorola
公司的
G20,Benq
公司的
M22、M32
等等。
现有的相关文献,一般重点讨论
GSM
模块的硬件接口电路以及
AT
½令的应用
[3]
,而
较少提及收发流程、PDU 字段含义等基本原理,本文将弥补这一缺陷,在论述
SMS
收发流
程的基础上,重点分析
PDU
的字段含义。
2. PDU简介
DTE
与
DCE
之间
SMS
接口协议共有三种:
Block
模式、
Text
模式和
PDU
(Protocol
Data
Unit)模式。PDU
是默认的
DTE-DCE
接口方式,基于
AT
½令,把消息内容看½是一个协
议数据单元进行透明传输。利用
PDU
模式发送的短消息内容可以是任½字符集,并被所有
手机支持,中文短消息,就是在该模式下实现的。
需要强调一下的是,PDU 是基于字符的,由
0~9、A~F
这
16
个数字和字母组成,从表
面上看是一串
ASCII
码,如
0011000D91683118325476F8000800044F60597D,实际上是用两
个字节的字符表示一个字节的数据,如发送字符串
5A
代表一个十六进制数
0x5A。
PDU
不仅包含文本消息本身,
还包含很多其它信息,
SMS
服务中心号码、
如
目标号码、
回复号码、编码方式、服务时间等,并且发送、接收的
PDU
的结构不完全相同的,我们将
在后文中分别进行论述。在此之前,我们有必要了解短消息的发送流程。
3.
短消息收发流程
SMS
是一种存储½发服务,发送者将文本信息编码成为
PDU
后发送到短消息中心
(SMC),短消息中心首先对发送
PDU
进行处理,再将重新编码后的
PDU
½发给接收者。
ETSI
将基于
GSM
½络的
SMS
划分为四层协议
[4]
,由高到½依次是:应用层(SM-AL)、
传输层(SM-TL)、中继层(SM-RL)、½层(SM-LL)。对于应用
GSM
模块的情况,可
-1-
http://www.paper.edu.cn
以½略中继层和½层,以及½发、路由等环节,简化的工½流程如图
1
所示。
图
1
短消息收发路程
① 发送
MS
的应用层将目标手机号码、消息文本交给传输层
② 传输层将信息进行编码,将
PDU
通过空中接口发送给
SMC
③
SMC
收到
PDU
后,向发送
MS
发送报告,表示已收到或者发生错误
④ 发送
MS
收到报告后,通知应用层消息已经发出
⑤
SMC
将
PDU
进行重新编码,发送给目标
MS
⑥ 接收
MS
的传输层将
PDU
解码后,交给应用层显示
⑦ 接收
MS
向
SC
发送一个报告,通知
SC
已接收消息或者发生错误
⑧
SC
收到接收
MS
的报告,如果发送
MS
要求信息报告,则向发送者再发送一个状态
报告,表示消息成功发送
⑨ 发送
MS
收到状态报告后,通知应用层,短消息成功发送
4. PDU字段分析
ETSI
的
GSM03.40
标准详细论述了
PDU
的协议字段,现将发送和接收
PDU
的字段含
义总结如下。
4.1
发送
PDU
字段含义
发送
PDU
字段协议如表
1
所示。
表
1
First Octet
1
字节
TP-MR
1
字节
TP-DA
2~12
字节
发送
PDU
协议字段
TP-DCS
1
字节
TP-VP
0、1
或
7
字节
TP-UDL
1
字节
TP-UD
0~140
字节
TP-PID
1
字节
例如这个
PDU
字符串:0011000D91683118325476F8000800044F60597D,将其字段进
行分解,如表
2
所示。
表
2
字段
00
11
00
0D
91
68 31 18 32 54 76 F8
00
08
00
04
4F 60 59 7D
发送
PDU
示例
含义
短消息中心地址长度
基本参数(First
Octet)
消息参考值(TP-MR)
目标地址数字长度
地址格式(TON/NPI)
目标地址(TP-DA)
协议标识(TP-PID)
用户编码方式(TP-DCS)
有效期(TP-VP)
用户信息长度(TP-UDL)
用户信息(TP-UD)
请注意,SMSC 的地址并不是
PDU
的一部分,½是由于总是在
PDU
之前发送,我们暂
-2-
http://www.paper.edu.cn
且在此处讨论,实际上
First Octet
才是
PDU
的第一个字节。由于
SMSC
已经包含在
SIM
卡
中,因此不必指明,将其长度字段设½为
0
即可。
First Octet
为
0x11,其中 TP-MTI
为
0x01,表示这是一个 SMS-SUBMIT
类型的
PDU,
TP-VPF
为
0x10,表示 TP-VP
字段为相对模式。
TP-MR
用于对
SMS-SUBMIT
进行标示,一般设½为
0。
TP-DA
字段,
目标手机号码为
8613812345678,
长度
13,
用十六进制表示为
0x0D。
0x91
表示½际格式号码,在处理的时候,自动在前面加“+”。目标手机号码长度为
13,需要补
一个
F
将其凑成偶数,然后再将每两个字节进行颠倒,就是我们看到的
683118325476F8。
TP-PID
为
0,表示为普通 GSM
类型,点对点模式。
TP-DCS
为
0x08,表示½用 UCS2
字符集。
TP-VP
为
0,表示最长有效期。
TP-UDL
为
4,表明用户数据为 4
个字节。
TP-UD
表示用户的数据,UNICODE 值
0x4F60
代表“½”,0x597D 代表“½”。
4.2
接收
PDU
字段含义
接收
PDU
字段协议如表
3
所示。
表
3
接收
PDU
协议字段
First Octet
1
字节
TP-OA
2~12
字节
TP-PID
1
字节
TP-DCS
1
字节
TP-SCTS
7
字节
TP-UDL
1
字节
TP-UD
0~140
字节
0891683108100005F0240D91683118325476F8000870104051735423044F60597D,对于这
个
PDU
字符串,我们可以分解如表
4
所示。
表
4
字段
08
91
68 31 08 10 00 05 F0
24
0D
91
68 31 18 32 54 76 F8
00
08
70 10 40 51 73 54 23
04
4F 60 59 7D
接收
PDU
示例
含义
短消息中心地址长度
地址格式(TON/NPI)
短消息中心地址
基本参数(First
Octet)
回复地址长度
地址格式(TON/NPI)
回复地址(TP-OA)
协议标识(TP-PID)
用户编码方式(TP-DCS)
时间戳(TP-SCTS)
用户信息长度(TP-UDL)
用户信息(TP-UD)
此时的
SMSC
地址存在,长度为
8,参考上面对 SMS-SUBMIT
中目标地址的描述,理
解该字段中各个字节的意义。
First Octet
为
0x24,表示 TP-RP
为
0,表示无回复地址;TP-SRI
为
1,表示要求发送者
要求状态报告,TP-MTI 为
0,表示该 PDU
为
SMS-DELIVER
类型。
TP-OA
字段,与
TP-DA
字段类似,请参考前面所述。
TP-PID
为
0,表示为普通 GSM
类型,点对点模式。
TP-DCS
为
0x08,表示½用 UCS2
字符集。
TP-SCTS
字段的意义是,发送时间是
07
年
01
月
04
日
15
点
37
分
45
秒,23 时区。
TP-UDL、TP-UD
字段的含义请参考前面所述。
-3-
http://www.paper.edu.cn
在我们测试中,发现实际接收
PDU
与标准的论述存在两处差异:一是时间戳的最后一
个字节无法正确显示时区信息,二是
First Octet
中
TP-RP
为
0,表示不包含回复地址,½是
实际的
PDU
中,却包含了发送者的地址,似乎有些互相矛盾。
4.3 First Octet
字段含义
First Octet
是
PDU
的第一个字节,
包含了很多含义,
并且发送、
接收
PDU
中的
First Octet
含义不同,下面分别进行讨论。
表
5
是发送
PDU
的
First Octet
含义。
表
5
7
TP-RP
6
TP-UDHI
5
TP-SRR
发送
PDU
的第一个字节
4
TP-VPF
3
TP-VPF
2
TP-RD
1
TP-MTI
0
TP-MTI
TP-MTI,用来区分 PDU
类型,下文详述。
TP-RD,Reject Duplicates,½ 1
表示
SC
拒绝接收重复的、尚未从
SC
½发给目标
MS
的短消息。
TP-VPF,Valid Period Format,½ 1
表示存在
TP-VP
字段
TP-SRR,Status Report Indicator,½ 1
表示要求状态报告。
TP-UDHI,User Data Header Indicator,½ 1
表示用户数据有消息头。
TP-RP,Reply-Path,½ 1
表示
PDU
包含了回信地址。
表
6
是接收
PDU
的
First Octet。
表
6
7
TP-RP
6
TP-UDHI
5
TP-SRI
接收
PDU
的第一个字节
4
未用
3
未用
2
TP-MMS
1
TP-MTI
0
TP-MTI
TP-MTI,用来区分 PDU
类型,下文详述。
TP-MMS,More Message to Send,½ 0
表示
SC
将向
MS
继续发送消息,用于应用层的
短消息合并。
TP-SRI,Status Report Indicator,½ 1
表示要求状态报告。
TP-UDHI,User Data Header Indicator,½ 1
表示用户数据有消息头。
TP-RP,Reply Path,½ 1
表示
PDU
包含了回信地址。
bit4、bit3
未½用,一律½
0。
4.4 PDU
分类
PDU
共分六种类型
[4]
,图
1
中包含了其中的五种,分别是:流程②中的
SMS-SUBMIT,
流 程 ③ 中 的
SMS-SUBMIT-REPORT
, 流 程 ⑤ 中 的
SMS-DELIVER
, 流 程 ⑦ 中 的
SMS-DELIVER-REPORT,
流程⑧中的
SMS-STATUS-REPORT。
此外,
还有
SMS-COMMAND
类型,用于
MS
向
SC
发送½令。
对 于 应 用 层 来 说 , 短 消 息 的 内 容 包 含 在
SMS-DELIVER
和
SMS-SUBMIT
中 。
SMS-STATUS-REPORT
的存在,是为了向发送者提供一次确认,通常情况下,接收者收到
信息后几秒钟,发送者就会收到发送成功的报告,假如
2
天之内
SC
无法将消息½发给
MS,
则返回发送失败的报告,实际应用中可有可无。SMS-COMMAND 很少用到,其它两种是
MS
与
SC
之间进行确认的报文,对应用层来说不可见。
区分
PDU,是通过判断 First Octet
中的
TP-MTI
字段的数值,½用
2
个比特来表示了
6
种类型的
PDU,见表 7。
表
7
PDU
类型
-4-
http://www.paper.edu.cn
TP-MTI
值
00
00
10
10
01
01
11
PDU
类型
SMS-DELIVER
SMS-DELIVER-REPORT
SMS-STATUS-REPORT
SMS-COMMAND
SMS-SUBMIT
SMS-SUBMIT-REPORT
保留
方向
SC->MS
MS->SC
SC->MS
MS->SC
MS->SC
SC->MS
5.
编码流程与实现
根据前面的分析,我们得知
PDU
协议字段存在很多固定的数值,在介绍编解码实现方
法之前,首先定义一个结构½,包含了与发送和接收有关的信息,其它固定的字段在编码的
时候½用常量。
typedef struct SM_INFO {
char SCA[16];
char TPA[16];
char TP_PID;
char TP_DCS;
char TP_SCTS[16];
char TP_UD[161];
char index;
} SM_ INFO;
//
短消息服务中心号码(SMSC 地址)
//
目标号码或回复号码(TP-DA 或
TP-RA)
//
用户信息协议标识(TP-PID)
//
用户信息编码方式(TP-DCS)
//
服务时间戳字符串(TP_SCTS), 接收时用到
//
原始用户信息(编码前或解码后的
TP-UD)
//
短消息序号,在读取时用到
由于编解码½数在不同的平台下有各自的实现方法,例如在
WINDOWS
中,就有两个
WIN32API
可供选择:MultiByteToWideChar、WideCharToMultiByte,而有的平台却没有不
提供
API,为了确保平台无关性,我们½用 GsmEncodeUcs2、GsmDecodeUcs2
来代替。对
于嵌入式应用,需要自行生成½换表以及书写查表算法,读者可参考其它文献
[5]
。
5.1
编码流程图
PDU
编码½数包括以下模块:将十六进制表示的字节½换成
ASCII
字符串,将
GB
编
码的汉字½换为
UCS2
编码。工½流程见图
2。
图
2
编码流程图
图
3
解码流程图
5.2
编码½数实现
限于篇幅,下面仅给出
C
语言编码实现的部分细节。其中
GsmBytesToString
½数完成
字节½字符的工½,
GsmEncodeUcs2
½数完成
GB2312
编码文本到
UCS2
编码的文本的工½。
int GsmEncodePdu(const SM_ INFO *pSrc, char *pDst)
{
int nLength;
int nDstLength;
unsigned char buf[256];
//
内部用的串长度
//
目标
PDU
串长度
//
内部用的缓冲区
-5-
评论