在GSM中,短消息(SMS,Short Message Service)有两种发送模式,一个是文本模式(所有字符都以可读的字符发送),一种是PDU模式。文本模式下,SMS字符都依照GSM 03.38标准中的默认的7-bit字符表进行编码(表格如下):
在PDU(Protocol Data Unit)模式下,SMS通过编码成特定的二进制串发送出去,在该模式下,PDU数据不仅包含了消息字符,还包括很多元数据,比如短信中心地址(SMSC),字符编码格式以及时间戳等。根据ETSI标准(GSM 03.40 & GSM 03.38), 单条短信采用7-bit编码时最长可达160个字符,若采用8-bit字符编码则最多包含140个字符,而对于中文、韩文以及日文等东亚文字通常需要16-bit编码,则实际上能发送的文本长度只有70个字符,因此发送长短信时,需要将长短信分割成多个单一的短信(每条短信的长度不超过160个字符)。
那么,如何区分长短信与普通的单条短信了?对于长短信,设置TP-UDHI
bit位,用于标识信息包含了头信息;头信息UDH(User Data Header)中包含了长短信的引用编号(分割后对应的序列号),这样SMS接收端就可以根据该序列号将分割前的短信恢复过来。
下面来看下PDU模式下,GSM如何接受与发送短信?
接收短信
PDU字符串除了文本数据外,还包含了短信中心地址(SMSC)以及时间戳等信息,所有数据均以十六进制/十进制八位字节或者半个八位字节(4-bit)。以下字符串是Nokia 6110
中接收到来自http://www.mtn.co.za/
的一条内容为hellohello
的短信:
1 |
|
这条短信包含了三个部分:(1)标识SMSC长度的八位字节(07
);(2) SMSC(917283010010F5
); (3) SMS_DELIVER部分。
Octets | Description | Format | Meaning |
---|---|---|---|
07 | SMSC长度 | hex-octet | 7个八位字节 |
91 | SMSC地址类型 | hex-octet | 国际号码 |
7283010010F5 | SMSC号码 | semi-octet | +27381000015 |
04 | SMS_DELIVER首个八位字节 | hex-octet | TP-MMS,参考GSM 03.40 |
0B | 地址长度 | hex-octet | 发送方地址长度为11 |
C8 | TOA,发送方地址类型 | hex-octet | 参考GSM 03.40 TypeofAddress |
7238880900F1 | 发送方号码 | semi-octets | 发送方号码 |
00 | TP-PID, Protocol Identifier | hex-octet | 参考GSM 03.40 |
00 | TP-DCS, Data Coding Scheme | hex-octet | 参考GSM 03.38 |
99309251619580 | TP-SCTS, time-stamp | semi-octets | 29/03/99 15:16:59 |
0A | TP-UDL, User Data Length | hex-octets | 长度为10 |
E8329BFD4697D9EC37 | TP-UD, User Data | 8-bit octets表示7-bit数据 | hellohello |
发送短信
以下是用Nokia 6110在PDU模式下发送“hellohello”消息的PDU字符串:
1 |
|
与接收短信PDU格式相似,发送的短信也由3个部分组成: (1)SMSC的长度, 这里实际长度00
表示使用保存在手机里的SMSC地址; (2) SMSC号码, 由于长度为0, 因此该部分不存在; (3) SMS_SUBMIT消息。
Octets | Description |
---|---|
00 | SMSC长度, 该字段是可选的, SMSC可以从手机读取 |
11 | 首个八位字节, 各个bit位的含义见GSM 03.40 |
00 | SMS_SUBMIT计数, 基站每收到一个SMS_SUBMIT都相应的加1, 参考GSM 03.40 |
0B | 地址长度, 11位的号码 |
91 | 地址类型(TOA), 91表示国际号码 |
6407281553F8 | semi-octet字符串(46708251358 ), 由于号码长度为奇数,因此会在尾部添加一个F,实际编码的号码为46708251358 |
00 | TP-PID, protocol identifier |
00 | TP-DCS, 短信文本编码方案,这里00 表示采用的7-bit GSM默认的字符编码 |
AA | TP-Validaty-Period, 该字段可选 |
0A | TP-UDL, 短信文本长度,就是说这个短信数据长度为10*7个bit |
E8329BFD4697D9EC37 | TP-UD, 短信文本 |