长短信未验证 有兴趣的可以试试
根据python的方法改写的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
|
/**
* PDU短信解析
*
*
* @param pduPayload
* @return
*/
public static String retrieveSMSInfo( byte [] pduPayload) throws UnsupportedEncodingException {
int startPos = 3 ;
//#Originator address
int mRP_OA_len = pduPayload[startPos];
byte [] mRP_OA = new byte [mRP_OA_len];
System.arraycopy(pduPayload, startPos + 1 , mRP_OA, 0 , mRP_OA_len);
startPos = startPos + 1 + mRP_OA_len;
int mTPDU_len = pduPayload[startPos];
//#BIT No. 7 6 5 4 3 2 1 0
//#uplink TP-RP TP-UDHI TP-SPR TP-VPF TP-RD TP-MTI
//#downlink TP-RP TP-UDHI TP-SRI TP-MMS TP-MTI
byte TP_Header = pduPayload[startPos + 1 ];
byte TP_Msg_Ref = pduPayload[startPos + 2 ];
int TP_UDHI = (TP_Header >> 6 ) & 1 ; //#短信内容是否包含协议头信息,0 不包含, 1 包含(长短信,push短信)
int TP_VPF = (TP_Header >> 3 ) & 3 ; //#是否包含有效期字节,0 不包含, 其他 包含
// #00表示无有效期,TP-VP设置为00。
// #10表示相对格式,TP-VP占用1字节。
// #01表示增加格式,TP-VP占用7字节。
// #11表示绝对格式,TP-VP占用7字节
int TP_MMS = (TP_Header >> 2 ) & 1 ; //# TP-MMS(TP-More-Message-to-Send):1 短信中心没有更多的消息发送
startPos = startPos + 3 ;
//#对方号码
byte smsNumberLen = pduPayload[startPos];
int mTP_DA_len = (smsNumberLen + 1 ) / 2 + 1 ;
byte [] mTP_DA = new byte [mTP_DA_len];
System.arraycopy(pduPayload, startPos + 1 , mTP_DA, 0 , mTP_DA_len * 1 );
byte mTP_DA_format = mTP_DA[ 0 ];
byte [] smsNumberRaw = new byte [mTP_DA.length - 1 ];
System.arraycopy(mTP_DA, 1 , smsNumberRaw, 0 , mTP_DA.length - 1 );
String smsNumber = "" ;
int j = 0 ;
for ( int i = 0 ; i < smsNumberLen; i++) {
if ((i & 1 ) == 0 ) {
smsNumber = smsNumber + ( int ) (smsNumberRaw[j] & 0xF );
} else {
smsNumber = smsNumber + ( int ) ((smsNumberRaw[j] & 0x0FF ) >> 4 );
j++;
}
}
startPos = startPos + 1 + mTP_DA_len;
byte mTP_PID = pduPayload[startPos];
byte mTP_DCS = pduPayload[startPos + 1 ]; //#“00”表示使用7位编码,设置为“02”使用8位编码,设置为“08”使用UCS2编码。
startPos = startPos + 2 ;
if (TP_VPF == 2 ) {
startPos = startPos + 1 ;
} else if (TP_VPF == 1 || TP_VPF == 3 ) {
startPos = startPos + 7 ;
}
//# 长短信:内容前面需要增加6个字段
//# 1、 字节一:包头长度,固定填写0x05;
//# 2、 字节二:包头类型标识,固定填写0x00,表示长短信;
//# 3、 字节三:子包长度,固定填写0x03,表示后面三个字节的长度;
//# 4、 字节四到字节六:包内容:
//# a) 字节四:长消息参考号,每个SP给每个用户发送的每条参考号都应该不同,可以从0开始,每次加1,最大255,便于同一个终端对同一个SP的消息的不同的长短信进行识别;
//# b) 字节五:本条长消息的的总消息数,从1到255,一般取值应该大于2;
//# c) 字节六:本条消息在长消息中的位置或序号,从1到255,第一条为1,第二条为2,最后一条等于第四字节的值。
//# 例子:
//# 05 00 03 00 02 01
//# 05 00 03 00 02 02
int smsPayloadLen = pduPayload[startPos];
startPos = startPos + 1 ;
String smsContent = "" ;
if (TP_UDHI == 1 ) {
//#长短信--未验证 可能需要转无符号
byte smsTotal = pduPayload[startPos + 4 ];
byte smsIdx = pduPayload[startPos + 5 ];
startPos = startPos + 6 ;
smsContent = "长短信(" + byteToHex(smsIdx) + "/" + byteToHex(smsTotal) + "}" ;
smsContent = new String(smsContent.getBytes( "gbk" ));
smsPayloadLen = smsPayloadLen - 6 ;
}
byte [] smsPayload = new byte [pduPayload.length - startPos];
System.arraycopy(pduPayload, startPos, smsPayload, 0 , pduPayload.length - startPos);
if (mTP_DCS == 0 ) {
//#7位编码--已验证
smsPayloadLen = (smsPayloadLen * 7 + 7 ) / 8 ;
int asciiData = 0 ;
int lastByteRemain = 0 ;
for ( int i = 0 ; i < smsPayloadLen; i++) {
asciiData = asciiData + ((smsPayload[i] & 0x0FF ) << lastByteRemain);
smsContent = smsContent + ( char ) ((asciiData & 0x0FF ) & 0x7f );
asciiData = asciiData >> 7 ;
lastByteRemain = lastByteRemain + 1 ;
if (lastByteRemain >= 7 ) {
smsContent = smsContent + ( char ) ((asciiData & 0x0FF ) & 0x7f );
asciiData = asciiData >> 7 ;
lastByteRemain = lastByteRemain - 7 ;
}
}
} else if (mTP_DCS == 8 ) {
//# UCS-2 --已验证 可正常解析
for ( int i = 0 ; i < smsPayloadLen; i = i + 2 ) {
int cc1 = (smsPayload[i] & 0x0FF ) * 256 ;
int cc2 = smsPayload[i + 1 ] & 0x0FF ;
smsContent = smsContent + ( char ) (cc1 + cc2);
}
}
return smsNumber + ":" + smsContent;
}
|
以上所述是小编给大家介绍的Java pdu短信解码全面解析,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!
原文链接:http://www.cnblogs.com/Camel2016/archive/2016/10/27/6003765.html