GSM短信编码方式有三种,Block,Text和PDU模式,Block模式现在已经很少采用,Text模式用来进行ASCII码的短信发送,因为ASCII码是8位字符码,所以主要用来进行单字节信息-拼音或字母的短消息发送,从技术上讲,Text模式也可以用来进行中文短信的发送。但是在发送和接收时需要采样软件编码方式进行额外的处理,由于现在的手机内置短信都没有增加从Text模式到中文的转换方式,所以在手机上无法使用该方法进行中文短信收发。PDU模式采用多种编码方式,既可以使用ASCII格式,也可以采用Unicode方式编码,因此,可以用来进行以Unicode为编码方式的中文处理。
PDU模式是一种比较复杂的编码方式,它将编码信息,收发地址,短消息内容,短消息附加信息统一进行了编码,采用二进制方式进行收发,因此,终端用户在使用AT指令前需要将用户输入的字符串进行转换后才能使用相关AT指令进行处理。
由于PDU模式下发送和接收短消息解码方式略有不同,因此通过发送来进行讲解
AT+CMGF=0
AT+CMGS=
AT+CMGF=0用来设置发送短信的模式,0为PDU模式,也是默认工作模式,系统重启后便是默认该工作模式。
AT+CMGS为GSM发送短信的AT命令,length为发送短信TPDU的长度而不是短消息的长度,PDU则是AT发送的信息,二进制方式,包括目标地址信息,发送地址信息和短信内容。
PDU内容分为以下几个部分:
1. SMSC地址信息
PDU部分为二进制编码方式,采用字节信息方式。首先起始的一个字节,用来存储SMSC地址信息和类型信息总长度,以字节为计算单位。
第二个字节为地址类型信息。
该地址表示地址类型,0x91代表国际,此时需要在地址前加国际号86;当为0x81时,表示为国内电话。
接下来为地址的数值具体字节长度根据用户输入的号码来确定,由于采用的是字节对齐的方式,所以如果输入的数字为奇数时需要添加一个标识字符来填充。值得注意的是该编码方式输入数字的相邻位进行了交换,例如,13026565456,由于是奇数,需要填充一个F,编码最终结果是3120565654F6
2. TPDU部分
这一部分是短信的主要信息部分,AT+CMGS=
First-Octet与地址信息部分相似,第一个字节为短信基本信息,包括短信是否发送,短信中心是否拒绝同一短信,短信中心是否回复,是否包含信息头,是否包括有效日期等信息,
发送短信时,TP-MTI位必须设置为0x01,表示提交发送短信。
TP-MR第二个字节为短消息参考信息值。表示当前短消息重复发送的次数。
TP-DA为目标地址信息,与上述地址信息相同,包括目标地址长度和地址内容,整个部分的最大长度为12个字节。
目标地址长度,以半字节为单位进行计算。比如13995452345的长度按这个标准计算长度值为11。
接下来是目标地址,编码方式与短信控制中心的地址编码方式相同,长度为目标地址长度中存储的字节表示的数值的一半,当目标地址为奇数时,填充F,编码也是采用半字节高低位交换方式。
TP-PID为协议标识,长度为一个字节,默认bit7~bit6为0,bit5为1时,由bit0~bit4来表示SC按何种方式进行处理短消息,比如0x12表示采用传真方式,0x14表示采用语音处理。当bit5为0时,bit4~bit0位无效,表示采样点对点协议。通常该字节默认值为0,表示使用点对点的GSM协议处理。
TP-DCS:一个字节长度,表示短消息的编码方式。通常有以下三种
0x08表示为UCS2编码方式,按照Unicode编码方式,两个字节表示一个字符编码。
0x04表示为8bit编码方式,按照ASCII编码方式,一个字节表示一个字符。
0x00表示为7bit编码方式,按照GSM字符编码表进行编码。
TP-VP:用来表示短信有效时间。由First-obtet中TP-VPF来决定,当TP-VPF为0x10,表示相对当前的时间,当为0x11时,表示为绝对时间,用7个byte表示年月日时分秒信息。
TP-UDL:有效的信息长度,以字节为计算单位。当该位为0时,后面不带任何用户数据。
TP-UD:用户的有效信息。以TP-DC规定的编码方式进行编码。当TP-VDL为0时,该数据段无效。
读PDU模式的短消息。
AT+CMGF=0;
AT+CMGR=
+CMGR=
OK
PDU的内容包括SMSC的地址和TPDU两部分。Length为TPDU的长度。
1.
SMSC地址
该部分内容与发送短信时相同,因此省略该部分解释。
2.TPDU
First-Octet为一个字节长度,包含短信基本信息
其中TP-MTI必须为0x00,表示为接收短信。其他各位标识根据GSM03.04第9节内容来确定。其中TP-UDHI位不为0的话,表明在TP-UD还包括相应头信息。
TP-OA:该信息为发送该条短信的设备地址。地址解析方式与发送短信的TPDU中的TP-DA解析方法完全一致。
TP-PID:表示短信以何种方式进行默认为0x00,表示采用点对点的GSM传送协议。
TP-DCS:短信内容编码模式,通过读取该位内容,可以确定接收的短信编码方式,从而能够正确的读取并显示短信内容。
TP-SCTS:为短信中心的时间标记,长度为7个字节,分别代表年月日时分秒时区七个信息。
通过分析这七字节能够得到短消息的接收时间。
TP-UDL:表示短消息内容的长度,以字节为计算单位。
TP-UD:读出的短消息内容,根据TP-DCS的编码方式,可以解析出相应的字符。然后提供给终端单元给用户进行显示。
--------------------------------------------------------------------------------------------------
PDU 模式 |
*********************************************************************************************************************************************************************
发送短消息常用Text和PDU(Protocol Data Unit,协议数据单元)模式。使用Text模式收发短信代码简单,实现起来十分容易,但最大的缺点是不能收发中文短信;而PDU模式不仅支持中文短信,也能发送英文短信。PDU模式收发短信可以使用3种编码:7-bit、8-bit和UCS2编码。7-bit编码用于发送普通的ASCII字符,8-bit编码通常用于发送数据消息,UCS2编码用于发送Unicode字符。一般的PDU编码由A B C D E F G H I J K L M十三项组成。
A:短信息中心地址长度,2位十六进制数(1字节)。
B:短信息中心号码类型,2位十六进制数。
C:短信息中心号码,B+C的长度将由A中的数据决定。
D:文件头字节,2位十六进制数。
E:信息类型,2位十六进制数。
F:被叫号码长度,2位十六进制数。
G:被叫号码类型,2位十六进制数,取值同B。
H:被叫号码,长度由F中的数据决定。
I:协议标识,2位十六进制数。
J:数据编码方案,2位十六进制数。
K:有效期,2位十六进制数。
L:用户数据长度,2位十六进制数。
M:用户数据,其长度由L中的数据决定。J中设定采用UCS2编码,这里是中英文的Unicode字符。
实际应用:
本文以一个实例来解说AT指令发送PDU短信的全过程,假如我要发送下面的短信:
接收号码:+8613602433649
短信内容:abc你好!
短信中心号码:+8613800546500
一、短信中心号码处理:用字符串 addr 表示
1、将短信息中心号码去掉+号,看看长度是否为偶数,如果不是,最后添加F
即 addr = "+8613800200500"
=> addr = "8613800546500F"
2、将奇数位和偶数位交换。
=> addr = "683108506405F0"
3、将短信息中心号码前面加上字符91,91是国际化的意思
=> addr = "91683108200005F0"
4、算出 addr 长度,结果除2,格式化成2位的16进制字符串,16 / 2 = 8 => "08"
=> addr = "0891683108200005F0"
二、手机号码处理:用字符串 phone
1、将手机号码去掉+号,看看长度是否为偶数,如果不是,最后添加F
即 phone = "+8613602433649"
=> phone = "8613602433649F"
2、将手机号码奇数位和偶数位交换。
=> phone = "683106423346F9"
三、短信息部分处理:用字符串 msg 表示
1、转字符串转换为Unicode代码,例如“abc你好!”的unicode代码为 0061006200634F60597DFF01,
2、将 msg 长度除2,保留两位16进制数,即 0061006200634F60597DFF01 = 24 / 2 => "0C",再加上 msg
=> msg = "0C0061006200634F60597DFF01"
四、组合
1、手机号码前加上字符串 11000D91(1100:固定,0D:手机号码的长度,不算+号,十六进制表示,91:发送到手机为91,发送到小灵通为81。但是我用81也能往手机上发送成功),
即 phone = "11000D91" + phone
=> 11000D91683106423346F9
2、手机号码后加上 0008A7 和刚才的短信息内容,0008A7也写死就可以了,具体含义我也不太清楚!
即 phone = phone + "0008A7" + msg
即 11000D91683106423346F9 + 0008A7 + 0C0061006200634F60597DFF01
=> phone = 11000B815160066703F10008A70C0061006200634F60597DFF01
3、phone 长度除以2,格式化成2位的十进制数
即 11000B815160066703F10008A70C0061006200634F60597DFF01 => 52位 / 2 => 26
五、所以要发送的内容为
AT+CMGF=0 <回车><换行>
OK
AT+CMGS=26<回车><换行>
> 891683108506405F011000B815160066703F10008A70C0061006200634F60597DFF01
****************************************************发送和接收举例*********************************************************************
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个十进制数(不包括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 地址信息的长度 个八位字节(包括91)
91 SMSC地址格式(TON/NPI) 用国际格式号码(在前面加‘+’)
68 31 08 20 05 05 F0 SMSC地址 8613800250500,补‘F’凑成偶数个
84 基本参数(TP-MTI/MMS/RP) 接收,无更多消息,有回复地址
0D 回复地址数字个数 共13个十进制数(不包括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-3-12 08:36:45 +8时区
06 用户信息长度(TP-UDL) 实际长度6个字节
4F 60 59 7D 00 21 用户信息(TP-UD) “你好!”
-
若基本参数的最高位(TP-RP)为0,则没有回复地址的三个段。从Internet上发出的短消息常常是这种情形。
注意号码和时间的表示方法,不是按正常顺序顺着来的,而且要以‘F’将奇数补成偶数。
-
在PDU Mode中,可以采用三种编码方式来对发送的内容进行编码,它们是7-bit、8-bit和UCS2编码。7-bit编码用于发送普通的ASCII字符,它将一串7-bit的字符(最高位为0)编码成8-bit的数据,每8个字符可“压缩”成7个;8-bit编码通常用于发送数据消息,比如图片和铃声等;而UCS2编码用于发送Unicode字符。PDU串的用户信息(TP-UD)段最大容量是140字节,所以在这三种编码方式下,可以发送的短消息的最大字符数分别是160、140和70。这里,将一个英文字母、一个汉字和一个数据字节都视为一个字符。
-
需要注意的是,PDU串的用户信息长度(TP-UDL),在各种编码方式下意义有所不同。7-bit编码时,指原始短消息的字符个数,而不是编码后的字节数。8-bit编码时,就是字节数。UCS2编码时,也是字节数,等于原始短消息的字符数的两倍。如果用户信息(TP-UD)中存在一个头(基本参数的TP-UDHI为1),在所有编码方式下,用户信息长度(TP-UDL)都等于头长度与编码后字节数之和。如果采用GSM 03.42所建议的压缩算法(TP-DCS的高3位为001),则该长度也是压缩编码后字节数或头长度与压缩编码后字节数之和。