GSM协议PDU编码长短信方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GSM协议PDU编码长短信方法相关的知识,希望对你有一定的参考价值。

1.GSM协议

GSM协议一共有三种方式来发送和接收SMS信息:Block Mode, Text Mode和PDU Mode。Block Mode已是昔日黄花,目前很少用了。Text Mode是纯文本方式,可使用不同的字符集,从技术上说也可用于发送中文短消息,但国内手机基本上不支持,主要用于欧美地区。PDU Mode被所有手机支持,可以使用任何字符集,是手机默认的编码方式,也是我们在网管系统中使用的编码方式,下面我们来重点介绍一下PDU编码格式

前提条件:发送PDU编码的短消息之前需要输入两个指令

1.GSM设置为PDU模式

AT+CMGF=0 //设置短信编码方式  0为PDU模式 1为TEXT模式 

2.指定将要发送PDU编码后的数据长度

AT+CMGS = LEN //LEN为编码后的数据长度

2.PDU短信编码格式解析

元素

名称

长度

描述

备注

SCA

Service Center Address

1-12

短消息服务中心号码

可为空,用1个字节的00填充

PDU-Type

Protocol Data Unit

1

协议数据单元类型

注意长短信的区别

MR

Message Reference

1

所有成功的短信发送参考数目(0..255)

 

OA

Originator Address

2-12

发送方地址(手机号码)

互斥出现

DA

Destination Address

2-12

接收方地址(手机号码)

PID

Protocol Identifer

1

参数显示消息中心以何种方式处理消息内容(比如FAX,Voice)

 

DCS

Data Coding Scheme

1

参数显示用户数据编码方案

 

SCTS

Service Center Time Stamp

7

消息中心收到消息时的时间戳

发送时无该字段

VP

Validity Period

0,1,7

参数显示消息有效期

 

UDL

User Data Lenghth

1

用户数据长度

 

UD

User Data

0-140

用户数据

 

3.长短信与普通短信

在介绍PDU编码的各个元素之前,需要简单介绍一下长短信与普通短信的区别,因为两者在PDU编码上有一定的区别。

普通短信UD区长度为140字节,超过140字节就得拆分成多条短信,拆分后的短信经过短信网关、短信中心的存储转发后到达终端的顺序可能和原发送顺序不同,这就使得接收方对于信息内容的理解出现困扰,1996年颁布GSM03.40V4.13.0中定义了长短信(Concatenated Short Message),所谓的长短信就是由一组相互独立的不超过普通短信长度的子短信组成,在网络传输中被视为多条普通短信,而在终端上被合并显示。

4.PDU编码元素详解

4.1SCA

SCA = length + type + address

SCA服务中心地址由三部分:第一个分表示服务中心地址长度,第二个部分表示服务中心类型,第三个部分表示服务中心地址。

Lengthtype和address的长度之和(如果Length00则不提供后面部分,发送时终端将自动从SIM卡中读取并填充SCA

Type:短信中心地址的类型(81:国内 91:国际 常用91)

Address:服务中心地址(对原地址做奇偶对调,如果原地址长度为奇位数,则末尾补F后做奇偶对调)

 

SCA示例

短信中心

PDU编码

+8613010452500

0891683110402505F0

13010452500

07813110402505F0

123456

0481214365

 

PDU编码组成部分如下

Lenghth

Type

Address

08

91

683110402505F0

07

81

3110402505F0

04

81

214365

 

注意:SCA的长度不包含在“PDU编码后的数据总长度”,即AT+CMGS = LEN中的LEN当中

4.2PDU-Type

协议数据单元类型是用1个字节表示的8个位图,具体含义如下

Bit No.

7

6

5

4

3

2

1

0

发送方

RP

UDHI

SRR

VPF

VPF

RD

MTI

MTI

接收方

SRI

\

\

MMS

 

其中,长短信与普通短信有区别的位,用粗体表示。

 

RP:应答路径 0-未设置   1-设置

 

UDHI:用户数据头标识(User Data Header Indicator)0-用户数据(UD)部分不包含头信息1-用户数据(UD)开始部分包含用户头信息

 

SRR:请求状态报告(Status Report Request), 0-不需要报告   1-需要报告

 

SRI:状态报告指示(Status Report Indication)

注:此值仅被短消息服务中心设置 0-状态报告将不会返回给短消息实体(SME) 1-状态报告将返回给短消息实体(SME)

 

VPF:有效期格式(Validity Period Format) 00-VP段没有提供(长度为0) 01-保留 10-VP段以整型形式提供(相对的) 11-VP段以8位位组的一半形式提供(绝对的)

 

RD:拒绝复本(Reject Duplicate) 0-通知短消息服务中心(SMSC)接受一个消息(SMS-SUBMIT),即该消息是先前已提交过的,并还存在与SMSC中未发送出去。MS重复的条件是:消息参考(MR)、接收方地址(DA)及发送方地址(OA)相同 1-通知SMSC拒绝一个重复的SMS

 

MMS:有更多的消息需要发送(More Message to Send)

0-在SMSC中有更多的信息等待MS1-在SMSC中没有更多的信息等待MS

 

MTI:信息类型指示(Message Type Indicator) 待查 可填0

 

以上可知

PDU-Type

普通短信

长短信

UDHI标识位

0

1

MMS标识位

1

最后一条为1其余为0

 

4.3UDL用户数据长度

 

 

普通短信

长短信

UDL

短信内容长度

UDH用户数据头长度+SM拆分后短信内容长度

4.4UD用户数据

 

普通短信

长短信

UD

全部为短信内容

UDH用户数据头+SM拆分后短信内容

 

5长短信UD

工程上我们需要判断待发送的短信内容长度,所以长短信的UD编码是一定用的到的,普通短信相对简单,下面重点介绍一下长短信的UD组成。

长短信UD用户数据(User Data)格式

UD = UDH + SM

5.1UDH用户数据头

长短信的UDH固定为67,长度为6的常用。

示例如下:

UDHL

IEI

IEDL

IED

Reference No.

Maximum  No.

Current

No.

05

00

03

C6

02

01

 

看不懂?莫慌,下文对详细介绍每个字节。

UDH = UDHL + IE

UDHL

IE

IE”A”

……

IE”N”

1) UDHL用户数据头长度(User Data Header Length)

一个字节,表示用户数据头的字节数,不包含本字节,UDHL+1=整个用户数据头长度

2) IE用户数据头信息单元(Information Element)

       IE中可以包含IE”A”、IE”B”、……、IE” N”等多个信息单元,每个信息单元又分为

   IEI   

  IEDL  

  IED  

 

a) IEI信息单元标识(Information Element Identifier)

       00:Concatenated short messages

       01:Special SMS Message Indication

       02:Reserved

       03:Value not used to avoidmisinterpretation as <LF> character

       04:Application port addressing scheme,8bit address

       05:Application port addressing scheme,16 bit address

       06:SMSC Control Parameters

       07:UDH Source Indicator

       08:Concatenated short message [16-bit reference number]

       09:Wireless Control Message Protocol

       0A-6F:Reserved for future use

       70-7F:SIM Toolkit Security Headers

       80- 9F:SME to SME specific use

       A0– BF:Reserved forfuture use

       C0– DF:SC specificuse

       E0– FF:Reserved forfuture use

0008都表示长短信,区别在于00是用一个字节表示“参考编号”,而08用两个字节表示“参考编号”(IED组成说明)。

 

b) IEDL信息单元数据长度(Length of Information Element)

一个字节,表示信息单元长度,也就是IED的字节数,不包含本字节IED信息单元数据(Information Element Data)

 

c) 长短信的IED由3字节组成

IEI0008时的IED如下

第一字节:参考编号(Reference Number),参考编号相同的为同一长短信

第二字节:总条数(Maximum number),长短信拆分后的总条数

第三字节:当前短信序号,当前短信是长短信中的第几条

 

现在再看开头的UDH示例就能看懂了吧,附上一个总长度为7个字节的长短信UDH示例:

UDHL

IEI

IEDL

IED

Reference No.

Maximum  No.

Current

No.

06

08

03

C6 C6

02

01

 

5.2SM短消息

SM Short Message用户短信内容文本有三种编码方式

编码(无压缩)

单条字短信长度(字节)

特点

7-bit

153

只能发送ASCII字符

8-bit

140-UDHL = 134

流数据(图信号等)

16-bit USC2

(140-UDHL)/2 = 67

Unicode字符(中文常用)

 

在压缩模式下单条子短信长度最多134字节,其中包含压缩头(Compression Header)、压缩尾(Compression Footer)在内。

SM内容格式化的编码方式这里就不再赘述了,最后,有两个临界值需要注意一下:判断是否拆分短信的长度是140字节或70个编码后的Unicode字符;而判断拆分为多少条的长度是67(需要去除UDHL)。

 

以上是关于GSM协议PDU编码长短信方法的主要内容,如果未能解决你的问题,请参考以下文章

长短信 PDU编码

SMS短信PDU编码

使用python实现短信PDU编码

OpenHarmerny 短彩信之Framework系统源码解析

如何构建串联的短信 pdu?获取垃圾字符

python GSM 7bit 编码