JasonWang's Blog

GSM短信的发送与接收

字数统计: 1k阅读时长: 4 min
2017/10/15

GSM中,短消息(SMS,Short Message Service)有两种发送模式,一个是文本模式(所有字符都以可读的字符发送),一种是PDU模式。文本模式下,SMS字符都依照GSM 03.38标准中的默认的7-bit字符表进行编码(表格如下):

GSM3.38 charsets

在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-UDHIbit位,用于标识信息包含了头信息;头信息UDH(User Data Header)中包含了长短信的引用编号(分割后对应的序列号),这样SMS接收端就可以根据该序列号将分割前的短信恢复过来。

下面来看下PDU模式下,GSM如何接受与发送短信?

参考文章: http://www.gsm-modem.de/sms-pdu-mode.html

接收短信

PDU字符串除了文本数据外,还包含了短信中心地址(SMSC)以及时间戳等信息,所有数据均以十六进制/十进制八位字节或者半个八位字节(4-bit)。以下字符串是Nokia 6110中接收到来自http://www.mtn.co.za/的一条内容为hellohello的短信:

1
2
3

07 917238010010F 5 040BC87238880900F100009930925161958003C160 10

这条短信包含了三个部分:(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
2
3

00 11 00 0B 91 6407281553F8 00 00 AA 0A E8329BFD4697D9EC37

与接收短信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, 短信文本

参考文献

原文作者:Jason Wang

更新日期:2022-03-22, 20:10:27

版权声明:本文采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可

CATALOG
  1. 1. 接收短信
  2. 2. 发送短信
  3. 3. 参考文献