長短信未驗證 有興趣的可以試試
根據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