sms-pdu TP-User-Data的解析

发布时间 2023-12-03 18:21:49作者: 十七-2020

gsm文档 [[23038-i00.docx]]

sms内容--7bit和ucs2编码方式

在3G TS 23.040中,9.2.2 PDU Type repertoire at SM-TL中,有介绍六种类型的SMS,其中五种都有TP-User-Data的域,这部分的呈现也就是我们看到的SMS内容

在3G TS 23.038中,4 SMS Data Coding Scheme中,会记录内容的三种编码方式

  • 7bit
  • 8bit
  • UCS2

8bit编码工作中很少遇到,也比较简单,这里不做说明。

TP-User-Data域的长度是140 octets。这140个字节如果保存7bit信息,最多可以保存160个7bit字符,如果保存UCS2编码,最多可以保存70个字符。

TP-User-Data包含的字符,除了SMS内容外,还有可能在开始的部分包含Header信息(由TP-UDHI来指示是否携带),Header信息占用的部分,是作为SMS控制使用的,不能呈现给用户。

不带Header信息的7bit TP-User-Data

现在我发送一条短消息给手机,内容为I love you.,如果手机接收后是存在SIM卡上的,你可以在SIM的6F3C域(3G TS 11.11 10.5.3 EFsms(Short messages))查看该消息内容:

01 04 81 21 43 F5 00 0B 81 51 28 39 58 71 F1 00 00 21 11 90 50 03 80 00 0B 49 10 FB 6D 2F 83 F2 EF BA 0B

因为是接收到的信息,可以用3G TS 23.040 9.2.2.1 SMS-DELIVER type来帮助解析:

01 04 81 21 43 F5 00 //前面部分,可不关注,有需要的同学自行研究
0B 81 51 28 39 58 71 F1 //TP-OA,发送SMS的手机号码
00 //TP-PID
00 //TP-DCS, 3G TS 23.038里可以了解这里表示7bit编码方式
21 11 90 50 03 80 00 //TP-SCTS, 时间戳
0B //TP-User-Data-Length,这里为11个字符长度,也就是”I love you.”的字符个数
49 10 FB 6D 2F 83 F2 EF BA 0B //TP-User-Data

对TP-User-Data进行解析,7bit是压缩过的,这里要把11个7bit数据提取出来:

0x49:0100 1001         第一个字符,高位添0,就是0100 1001,0x49,7bit编码表为’I’
0x10:0001 0000         第二个字符,就是0010 0000,0x20,7bit编码表为’ ’
0xFB:1111 1011         第三个字符,就是0110 1100,0x6C,7bit编码表为’l’
0x6D:0110 1101         第四个字符,就是0110 1111,0x6F,7bit编码表为’o’
0x2F:0010 1111         第五个字符,就是0111 0110,0x76,7bit编码表为’v’
0x83:1000 0011         第六个字符,就是0110 0101,0x65,7bit编码表为’e’
0xF2:1111 0010         第七个字符,就是0010 0000,0x20,7bit编码表为’ ’
                       第八个字符,就是0111 1001,0x79,7bit编码表为’y’
0xEF:1110 1111         第九个字符,就是0110 1111,0x6F,7bit编码表为’o’
0xBA:1011 1010         第A个字符,就是0111 0101,0x75,7bit编码表为’u’
0x0B:0000 1011         第B个字符,就是0010 1110,0x2E,7bit编码表为’.’

上面的7bit编码表可以在3G TS 23.038 6.2.1 GSM 7 bit Default Alphabet查阅,看到这里大家就明白了如何把呈现给用户的内容从7bit的PDU数据里解析出来了。

带Header信息的7bit TP-User-Data

01 08 91 68 31 08 20 01 05 F0 44 0D 91 68 51 02 71 82 61 F4 00 D8 21 10 20 71 42 12 00 11 04 01 02 00 01 24 41 EC B7 BD 0C CA BF EB 2E

因为是接收到的信息,可以用3G TS 23.040 9.2.2.1 SMS-DELIVER type来帮助解析:

01 08 91 68 31 08 20 01 05 F0 //前面部分,可不关注
44 //bit 6表示UDHI,这里bit6为1,则表明TP-User-Data有Header信息
0D 91 68 51 02 71 82 61 F4 //TP-OA
00 //TP-PID
D8 //TP-DCS, 3G TS 23.038里可以了解这里表示7bit编码方式
21 10 20 71 42 12 00 //TP-SCTS, 时间戳
11 //TP-User-Data-Length,这里为17个字符长度
04 01 02 00 01 24 41 EC B7 BD 0C CA BF EB 2E //TP-User-Data

对TP-User-Data进行解析:

04 01 02 00 0104表示Header的长度为4个字节(不包含04本身),这里有5个字节,也就是说TP-User-Data的17个字节,包含了5个字节的Header信息,其余的部分为可呈现给用户的内容。

和上面不带Header信息的7bit TP-User-Data的内容同为”I love you.”,为什么这里除去Header后的TP-User-Data剩余部分,和上面不一致呢?

不带Header的”I love you.” 7bit编码:

49 10 FB 6D 2F 83 F2 EF BA 0B

带Header的”I love you.” 7bit编码:

24 41 EC B7 BD 0C CA BF EB 2E

原因是不带Header,则7bit是从第一个字节的第0位开始填充;而带Header的内容要和早期不允许带Header的7bit编码兼容,那么Header之后的部分,要留给bit位填充0值来padding保证兼容性。这里比较绕口,下面实例解释:

例如:这里Header的总长为5bytes,呈现给用户的数据时从第6bytes开始的,则第6bytes留出的bit位个数为:7 – (5*8%7) = 7 – 5 = 2

也就是说为兼容不带header信息的老版本:那么前面5个字节可以容纳5个7bit数据,并有5个bit位供下一个7bit数据使用,则第6个字节需要留出2bit和前面5bit组成一个7bit数据。

下面解析这部分内容:

0x24:0010 0100         这2个bit为padding位,用0填充
0x41:0010 0001         第一个字符,就是0100 1001,0x49,7bit编码表为’I’
                       第二个字符,就是0010 0000,0x20,7bit编码表为’ ’
0xEC:1110 1100         第三个字符,就是0110 1100,0x6C,7bit编码表为’l’
0xB7:1011 0111         第四个字符,就是0110 1111,0x6F,7bit编码表为’o’
0xBD:1011 1101         第五个字符,就是0111 0110,0x76,7bit编码表为’v’
0x0C:0000 1100         第六个字符,就是0110 0101,0x65,7bit编码表为’e’
0xCA:1100 1010         第七个字符,就是0010 0000,0x20,7bit编码表为’ ’
0xBF:1011 1111         第八个字符,就是0111 1001,0x79,7bit编码表为’y’
0xEB:1110 1011         第九个字符,就是0110 1111,0x6F,7bit编码表为’o’
                       第A个字符,就是0111 0101,0x75,7bit编码表为’u’
0x2E:0010 1110         第B个字符,就是0010 1110,0x2E,7bit编码表为’.’

不带Header信息的UCS2 TP-User-Data

现在我发出一条短消息,内容为”我爱你。”,如果手机接收后是存在SIM卡上的,你可以在SIM的6F3C域(3G TS 11.11 10.5.3 EFsms(Short messages))查看该消息内容:

05 00 11 00 0B 81 51 28 39 58 72 F1 00 08 FF 08 62 11 72 31 4F 60 30 02

因为是接收到的信息,可以用3G TS 23.040 9.2.2.2 SMS-SUBMIT type来帮助解析:

05 00 11 00 //前面部分,可不关注,有需要的同学自行研究
0B 81 51 28 39 58 72 F1 //TP-OA,接收SMS的手机号码
00 //TP-PID
08 //TP-DCS, 3G TS 23.038里可以了解这里表示UCS2编码方式
FF //TP-VP
08 //TP-User-Data-Length,这里为8个字符长度,也就是”我爱你。”的2倍
62 11 72 31 4F 60 30 02 //TP-User-Data
对TP-User-Data进行解析,UCS2两个字节表示一个UCS2字符,组合如下:
0x6211,第一个字符,UCS2为“我”
0x7231,第二个字符,UCS2为“爱”
0x4F60,第三个字符,UCS2为“你”
0x3002,第四个字符,UCS2为“。”

查询Unicode编码(UCS2在这里可等同为Unicode,有一点区别可以网上查询)

带Header信息的UCS2 TP-User-Data

上图用Now SMS发送下面消息给15829385171的手机,最终保存在SIM卡上的数据如下所示:

01 08 91 68 31 08 20 01 05 F0 44 0D 91 68 51 02 71 82 61 F4 00 E8 21 10 20 71 52 22 00 0D 04 01 02 00 01 62 11 72 31 4F 60 30 02

因为是接收到的信息,可以用3G TS 23.040 9.2.2.1 SMS-DELIVER type来帮助解析:

01 08 91 68 31 08 20 01 05 F0 44
0D 91 68 51 02 71 82 61 F4
00
E8 //TP-DCS, 3G TS 23.038里可以了解这里表示UCS2编码方式
21 10 20 71 52 22 00
0D //TP-User-Data-Length,这里为13个字符长度
04 01 02 00 01 62 11 72 31 4F 60 30 02 //TP-User-Data

对TP-User-Data进行解析:

04 01 02 00 01,为Header部分

之后为可呈现给用户的数据部分:

62 11 72 31 4F 60 30 02
0x6211,第一个字符,UCS2为“我”
0x7231,第二个字符,UCS2为“爱”
0x4F60,第三个字符,UCS2为“你”
0x3002,第四个字符,UCS2为“。”