Java pdu簡訊解碼全面解析_java

來源:互聯網
上載者:User

長簡訊未驗證 有興趣的可以試試

根據python的方法改寫的

/*** PDU簡訊解析*** @param pduPayload* @return*/public static String retrieveSMSInfo(byte[] pduPayload) throws UnsupportedEncodingException {int startPos = 3;//#Originator addressint 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簡訊解碼全面解析,希望對大家有所協助,如果大家有任何疑問請給我留言,小編會及時回複大家的。在此也非常感謝大家對雲棲社區網站的支援!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.