GSM短信编码与协议分析
1 短信基本原理
由ESTI制订的SMS规范中,一共有三种方式来发送和接收SMS信息:Block Mode, Text Mode和PDU Mode。Block Mode已很少使用。Text Mode是纯文本方式,可使用不同的字符集,从技术上说也可用于发送中文短消息,但国内手机基本上不支持,主要用于欧美地区。PDU Mode被所有手机支持,可以使用任何字符集,这也是手机默认的编码方式。 PDU串表面上是一串ASCII码,由‘ 0’-‘9’、 ‘A’-‘F’这些数字和字母组成。它们是8位字节的十六进制数,或者BCD码十进制数。PDU串不仅包含可显示的消息本身,还包含很多其它信息,如SMS服务中心号码、目标号码、回复号码、编码方式和服务时间等。在PDU Mode中,可以采用三种编码方式来对发送的内容进行编码,它们是7-bit、8-bit和UCS2编码。7-bit编码用于发送普通的ASCII字符,它将一串7-bit的字符(最高位为0)编码成8-bit的数据,每8个字符可“压缩”成7个。我们通常在短信中所说的ASCII编码方式,实际上是指7-bit编码,而7-bit编码方式不仅能表示普通的ASCII字符,还可以表示一些特殊字符,因此7-bit编码和ASCII编码实际上是两个完全不同的概念,它们仅仅在一些普通的ASCII字符上编码相同;8-bit编码通常用于发送数据消息,比如图片和铃声等;而UCS2编码用于发送字符。PDU串的用户信息(TP-UD)段最大容量是140字节,所以在这三种编码方式下,可以发送的短消息的最大字符数分别是160、140和70。这里,将一个英文字母、一个汉字和一个数据字节都视为一个字符。
2 短信协议栈
GSM定义的短信基本架构如下图:
短信协议栈如下图:
SM-AL: Short Layer
SM-TL: Short Layer
SM-RL: Short Relay Layer
其它术语请参考《GSM 03.40》相关文档
3、短信PDU格式
参考上图,我们着重讨论在SM-TL层的PDU结构。在SM-TL层,定义了以下六种PDU类型: SMS-:从SC到MS传递短信 SMS-- SMS-:从MS到SC传递短信 SMS-- SMS-- SMS- 不同的PDU类型,定义了不同的字段要求,比如SMS-定义了TP-MTI, TP-MMS, TP-RP, TP-UDHI, TP-OA, TP-PID, TP-DCS, TP-SCTS, TP-UDL, TP-UD,这些字段有些只占用一个位,有些占用多个位或一个字节或多个字节。图示布局如下:
4、长短信分析
随着手机终端的飞速发展,对长短信的支持越来越灵活,长短信应用也越来越广泛。比如现在很多手机已经支持自动拆分长短信为多条短信发送。在此我们详细研究长短信的编码方式。
在以上章节举例的PDU字段中,需要特别留意几个字段:TP-UDHI, TP-UDL,TP-UD,对于一般非超长的普通短信,TP-UDHI字段是可选的,除非特殊的WAP Push等应用。但是对于超长短信,这个字段必须要设置为1,才能构造成功的超长短信让手机自动合并。
TP-UDHI(TP?User?Data??)字段在第一个字节的第7 bit位(bit 6),占用一个bit,用来标识该短信是否拥有一个头信息,当TP-UDHI=0时,表示在TP?UD中没有头信息,当TP-UDHI=1时,表示在TP?UD中含有头信息。长短信必须要在TP-UD中构造特殊的头部信息。
短信消息体中的头部信息的结构可参考如下:
FIELD
of User Data 1 octet
?? "A" 1 octet
of ? "A" 1 octet
? "A" Data 0 to "n"
?? "B" 1 octet
of ? "B" 1 octet
? "B" Data 0 to "n"
?? "X" 1 octet
of ? "X" 1 octet
? "X" Data 0 to "n"
头信息的作用有很多,其中之一就是用来标识超长短信(集联短信)。下面用一个实际的例子来说明头信息的含义。
这是一条实际发送的8bit编码超长短信内容(TP_UD)的16进制编码:
05 00 03 1D 02 01 31 31 31 31 31 31 31……
05 : UDHL(User Data ) 头信息长度,表示头信息中剩下数据的长度是5个字节;
00 : ??,当它取值为00时,表示此短信是采用8-bit 的超长短信;
03 : of ?,表示剩下数据的长度是3个字节;
1D: ? Data,这里表示超长短信头信息中的 值, 用来标识一条唯一的超长短信,它通过一个算法来自动生成;
02: ? Data, 这里表示超长短信头信息中的 值,即一条超长短信一共由几段组成;
01: ? Data, 这里表示超长短信头信息中的 值,即该条短信属于整个超长短信中的第几段;
以上便是超长短信中头信息的内容,后面的内容即为短消息的内容本身,这里的内容全是数据“1” 。
需要注意的是,PDU串的用户信息长度(TP-UDL),在各种编码方式下意义有所不同。7-bit编码时,指原始短消息的字符个数,而不是编码后的字节数。8-bit编码时,就是字节数。UCS2编码时,也是字节数,等于原始短消息的字符数的两倍。如果用户信息(TP-UD)中存在一个头(基本参数的TP-UDHI为1),在所有编码方式下,用户信息长度(TP-UDL)都等于头长度与编码后字节数之和。如果采用GSM 03.42所建议的压缩算法(TP-DCS的高3位为001),则该长度也是压缩编码后字节数或头长度与压缩编码后字节数之和。
5、移动短信协议分析
中国移动关于短信的应用协议包括:CMPP/SMPP,这些应用层的协议最终传递到手机终端,均需要进行协议的映射或转换。以下着重探讨短信在各种协议下的编码对应关系。
格式编码字段字段说明
在CMPP协议规范中定义信息格式:
0:ASCII串;
3:短信写卡操作;
4:二进制信息;
8:UCS2编码;
15:含GB汉字
(SMPP v3.4协议定义)Bits
7 6 5 4 3 2 1 0
0 0 0 0 0 0 0 0 SMSC
0 0 0 0 0 0 0 1 IA5(CCITT T.50)/ASCII
0 0 0 0 0 0 1 0 Octet (8-bit )
0 0 0 0 0 0 1 1 Latin 1(ISO-8859-1)
0 0 0 0 0 1 0 0 Octet (8-bit )
0 0 0 0 0 1 0 1 JIS (X 0208-1990)
0 0 0 0 0 1 1 0 (ISO-8859-5)
0 0 0 0 0 1 1 1 Latin/(ISO-8859-8)
0 0 0 0 1 0 0 0 UCS2
0 0 0 0 1 0 0 1
0 0 0 0 1 0 1 0 ISO-2022-JP(Music Codes)
0 0 0 0 1 0 1 1
0 0 0 0 1 1 0 0
0 0 0 0 1 1 0 1 Kanji JIS
0 0 0 0 1 1 1 0 KS C 5601
0 0 0 0 1 1 1 1
...
1 0 1 1 1 1 1 1
1 1 0 0 x x x x GSM MWI
1 1 0 1 x x x x GSM MWI
1 1 1 0 x x x x
1 1 1 1 x x x x GSM class
GSM PDUTP-DCS在GSM03.40, GSM03.38规范中定义具体定义请参考下表Data (TP-DCS)
6、闪信/免提短信分析
在某些手机上(所有的,某些, , 等等..)class 0信息将被显示为一种flash SMS信息。这些信息只要一到达,将立即显示在屏幕上,而不需要按任何按钮。如果数据的编码方式是设置成16-bit (ucs2), 而且信息以"0001"开头,那么它将作为一个闪烁的flash 显示。
Octet Value
TP-DCS 18 16 bits (UCS2), class 0
TP-VP AA
TP-UDL 0C User Data , 12
TP-UD 00 01 00 41 00 6C 00 65 00 72 00 74 User Data, "Alert"
这个表显示了Flash SMS中的相关信息。
第一个字符("00 01")使能闪烁。这样的消息最长就是69个字符。