1 PDU编码协议
1.1 PDU编码规则
目前,发送短信消息常用Text和PDU(Protocol Data Unit,协议数据单元)模式。使用Text模式收发短信代码简单,实现起来容易,但最大的缺点是不能收发中文短信;而PDU模式不仅支持中文短信,也能发送英文短信。PDU模式收发短信可以使用3种编码:7-bit、8-bit和UCS2编码。7-bit编码用于发送普通的ASCII字符,8bit编码通常用于发送数据消息,UCS2编码用于发送Unicode字符。一般的PDU编码由A B C D E F G H I J K L M十三项组成。
A:短信息中心地址长度,2位十六进制数(1字节)
B:短信息中心号码类型,2位十六进制数。
91是TON/NP,遵守International/E.164标准,指在号码前需加“+”号;此外还>有其它数值,但91最常用。
91 1 0 0 1 0 0 0 1 BIT No. 7 6 5 4 3 2 1 0 7:1
6 5 4 :数值类型
3 2 1 0:号码鉴别
数值类型:000-未知,001-国际,010-国内,111-留作扩展;
号码鉴别:0000-未知,0001-ISDN/电话号码(E.164/E.163),1111-留作扩展
C:短信息中心号码,B+C的长度将由A中的数据决定。
D:文件头字节,2位十六进制数。
接收
No 7 6 5 4 3 2 1 0 Name TP-RP TP-UDHI TP-SPI - - TP-MMS TP-MTI TP-MTI 应答路径TP-RP(TP-Reply-Path):0-不设置;1-设置
用户数据头标识TP-UDHL(TP-User-Data-Header-Indicator):0-不含任何头>信息;1-含头信息
状态报告要求TP-SRR(TP-Status-Report-Request):0-需要报告;1-不需要>报告
状态报告标识-TP-SPI:0-不需要状态返回到移动设备;1-需要。默认为0
有效期格式TP-VPF(TP-Validity-Period-Format):00-不提供;10-整型(标准);01-预留;11-提供8位字节的一半
拒绝复制TP-RD:0-接受复制;1-拒绝复制
短消息服务中心短消息等待移动台TP-MMS:1-有;0-无
信息类型提示TP-MTI(TP-Message-Type_Indicator):00-读出;01-提交
E:信息类型,2位16进制数
F:被叫号码长度,2位16进制数
G:被叫号码类型,2位16进制数,取值同B
H:被叫号码,长度由F中的数据决定
I:协议标识,2位16进制数。
BIT No 7 6 5 4 3 2 1 0
Bit No.7与Bit No.6:
00-如下面定义的分配Bit No.0-Bit No.5;
01-参见GSM03.40协议标识完全定义;
10-预留
11-为服务中心(SC)特殊用途分配Bit No.0-Bit No.5。
一般将这两位置为00Bit No.5
0-不使用远程网络,只是短消息设备之间的协议
1-使用远程网络Bit No.0-Bit No.4:
00000-隐含
00001-电传
00010-group 3 telefax
00100-语音
00101-欧洲无线信息系统(ERMES)
00110-国内系统
10001-任何基于X.400的公用信息处理系统
10010-Email
J:数据编码方案,2位16进制数
Bit No 7 6 5 4 3 2 1 0
Bit No.7与Bit No.6一般设置为00
Bit No.5:
0-文本未压缩
1-文本用GSM标准压缩算法压缩Bit No.4:
0-表示Bit No.1、Bit No.0为保留位,不含信息类型信息
1-表示Bit No.1、Bit No.0含有信息类型信息Bit No.3与Bit no.2:
00-默认的字母表
01-8bit
10-USC2
11-预留Bit No.1与Bit No.0:
00-Class 0:短信息直接显示到用户终端
01-Class 1:短信息存储在SIM卡上
10-Class 2(Sim卡特定信息):短信息必须存储在SIM卡上,禁止直接传输到终端
11-Class 3:短信息存储在用户设备上
K:有效期,2位16进制数
如31808061349523,
31:13年
80:08月
80:08日
61:16时
34:43分
95:59秒
23:时区
L:用户数据长度,2位16进制数
M:用户数据,其长度由L中的数据决定
1.2 PDU编码协议示例
例1 发送:SMSC号码是+8613800250500,对方号码是13693092030,消息内容是“Hello!”。从手机发出的PDU串可以是08 91 68 31 08 20 05 05 F0 11 00 0D 91 68 31 96 03 29 30 F0 00 00 00 06 C8 32 9B FD 0E 01对照规范,具体分析如下:
分段 | 含义 | 说明 |
---|---|---|
08 | SMSC地址信息的长度 | 共8个字节(包括91) |
91 | SMSC地址格式(TON/NPI) | 国际格式号码(在前面加“+”) |
68 31 08 20 05 05 F0 | SMSC地址 | 8613800250500,补“F”凑成偶数个 |
11 | 基本参数(TP-MTI/VFP) | TP-VP用相对格式 |
00 | 消息基准值(TP-MR) | 0 |
0D | 目标地址数字个数 | 共13个10进制数(不包括91和“F”) |
91 | 目标地址格式(TON/NPI) | 用国际格式号码(在前面加“+”) |
68 31 96 03 29 30 F0 | 目标地址(TP-DA) | 8613693092030,补“F”凑成偶数个 |
00 | 协议标识(TP-PID) | 普通GSM类型,点到点方式 |
00 | 用户信息编码方式(TP-DCS) | 7-bit编码 |
00 | 有效期(TP-VP) | 5分钟 |
06 | 用户信息长度(TP-UDL) | 实际长度6个字节 |
C8 32 9B FD 0E 01 | 用户信息(TP-UD) | "Hello!" |
例2 接收:SMSC号码是+8613800250500,对方号码是13693092030,消息内容是“你好!”。手机接收到的PDU串可以是08 91 68 31 08 20 05 05 F0 84 0D 91 68 31 96 03 29 30 F0 00 08 30 30 21 80 63 54 80 06 4F 60 59 7D 00 21对照规范,具体分析:
分段 | 含义 | 说明 |
---|---|---|
08 | 地址信息的长度 | 共8个字节(包括91) |
91 | SMSC地址格式(TON/NPI) | 国际格式号码(在前面加“+”) |
68 31 08 20 05 05 F0 | SMSC地址 | 8613800250500,补“F”凑成偶数个 |
84 | 基本参数(TP-MTI/VFP) | 接收,无更多消息,有回复地址 |
0D | 目标地址数字个数 | 共13个10进制数(不包括91和“F”) |
91 | 回复地址格式(TON/NPI) | 用国际格式号码(在前面加“+”) |
68 31 96 03 29 30 F0 | 回复地址(TP-RA) | 8613693092030,补“F”凑成偶数个 |
00 | 协议标识(TP-PID) | 普通GSM类型,点到点方式 |
08 | 用户信息编码方式(TP-DCS) | UCS2编码 |
30 30 21 80 63 54 80 | 时间戳(TP-SCTS) | 2003-03-12 08:36:45 +8时区 |
06 | 用户信息长度(TP-UDL) | 实际长度6个字节 |
4F 60 59 7D 00 21 | 用户信息(TP-UD) | "你好!" |
若基本参数的最高位(TP-RP)为0,则没有回复地址的三个段。从Internet上发出的短消息常常是这种情形,则PDU如下所示:
pdu = 0891683108200505F004000830302180635480064F60597D0021
注意号码和时间的表示方法,不是按正常顺序顺着来的,而且要以“F”将奇数补成偶数。
在PDU模型中,可以采用三种编码方式来对发送的内容进行编码,它们是7-bit,8-bit和UCS2编码。7-bit编码用于发送普通的ASCII字符,它将一串7bit的字符(最高位为0)编码成8-bit的数据,每8个字符可以压缩成7个;8-bit编码通常用于发送数据消息,比如图片和铃声灯;而UCS2编码用于发送Unicode字符。PDU串的用户信息(TP-UD)段最大容量时140字节,所以在这三种编码方式下,可以发送的短消息的最大字符分别是160,140,和70.这里,将一个英文字母,一个汉字和一个数据字节都视为一个字符。
需要注意的是,PDU串的用户信息长度(TP-UDL),在各种编码方式下意义有所不同。7-bit编码时,指原始短消息的字符个数,而不是编码后的字节数。8-bit编码时,就是字节数。UCS2编码时,也是字节数等于原始短消息字符数的2倍。如果用户信息(TP-UD)中存在一个头(基本参数的TP-UDHI为1),在所有编码方式下,用户信息长度(TP-UDL)都等于头长度与编码后字节数之和。如果采用GSM03.42所建议的压缩算法(TP-DCS的高3位为001),则该长度也是压缩编码后字节数或头长度与压缩编码后字节数之和。
1.3 7-bit编码
7-bit编码实际上是一种压缩编码,因为ASCII码(不包括扩展的ASCII)其值都是小于0x80的,也就是说其最高位为0,那么最高位信息也就是说没有意义的,可以被忽略。而7-bit编码也正是关注到了这一点,利用最高位也来存储数据,其编码时一次将下7位编码的后几位逐次移到前面,形成了新的8位编码。
上述例1里面C8 32 9B FD 0E 01用的是7-bit编码,编码步骤如下
H | e | l | l | o | ! |
---|---|---|---|---|---|
1001000 | 1100101 | 1101100 | 1101100 | 1101111 | 100001 |
11001000 | 110010 | 1101100 | 1101100 | 1101111 | 100001 |
11001000 | 00110010 | 11011 | 1101100 | 1101111 | 100001 |
11001000 | 00110010 | 10011011 | 1101 | 1101111 | 100001 |
11001000 | 00110010 | 10011011 | 11111101 | 110 | 100001 |
11001000 | 00110010 | 10011011 | 11111101 | 00001110 | 1 |
11001000 | 00110010 | 10011011 | 11111101 | 00001110 | 00000001 |
解码过程如下
C8 | 32 | 9B | FD | 0E | 01 |
---|---|---|---|---|---|
11001000 | 00110010 | 10011011 | 11111101 | 00001110 | 00000001 |
1001000 | 1100101 | 1101100 | 1101100 | 1101111 | 0100001 |
1.4 UCS-2编码
UCS-2编码发送的是Unicode字符,中文字符的Unicode编码为2个字节。上述例2接收的信息就是Unicode编码,“你好!”中文字符的Unicode编码为:4F60 597D 0021
2 PDU协议数据单元详细介绍
PDU相当于一个数据包,它由构成消息(SMS)的信息组成。作为一种数据单元,它必须包含源/目的地址、保护(有效)时间、数据格式、协议类型和正文,正文长度可达140字节,它们都以16进制表示。PDU结构根据短消息由移动终端发起或以移动终端为目的而不同。
3 subId、slotId、SubscriptionInfo、SubscriptionManager
subId
是数据库telephony.db的表siminfo的主键递增项,其中telephony.db在“/data/user_de/0/com.android.providers.telephony/databases”下。该值从1开始,每插入一个新卡,subId的值就会加1,插入双卡后数据库中就会有subId值为1和2的两条数据条目,拔卡插卡交换卡槽后,数据库并不会增加新项,只有插入一张新的SIM卡才会增加一条id为3的数据条目。slotId
slotId指的是卡槽Id,一般手机都只有两个卡槽,卡槽1的slotId值为0,卡槽2的slotId的值为1,依次类推。Subscription
每张SIM卡都对应一个Subscription,用谁家的Sim卡就相当于订阅(Subscription)谁家的业务。SubscriptionInfo包含了Sim卡的相关信息,如ICCID、MNC、MCC等,多张SIM卡就有多个SubscriptionInfo。一张SIM卡,里面有ICCID,也有IMSI。ICCID是卡的标识,IMSI是用户的标识。
ICCID:Integrate circuit card identity,集成电路卡识别码,ICCID为IC卡的唯一识别号码,共有20位数字组成。分别介绍如下:前6位运营商代码:中国移动的为:898600;中国联通的为:898601;中国电信:898603
IMSI:International Mobile SubscriberIdentification Number,国际移动用户识别码,是区别移动用户的标志,储存在SIM卡中,可用于区别移动用户的有效信息。其总长度不超过15位,同样使用0-9的数字。
MCC:是移动用户所属国家代号,占3位数字,中国的MCC规定为460
MNC:是移动网号码,最多由两位数字组成,用于识别移动用户所归属的移动通信网
MSIN:是移动用户识别码,用以识别某一移动通信网中的移动用户。例如开头是46000是中国移动用户,46001是联通用户,46003是电信用户