2013-11-27 15 views
1

我有一個可以接收二進制短信並處理它們的java卡小程序。現在我需要檢查他們是否來自特定的短號碼。當我在小程序中收到二進制格式的短信時,如何獲得短號碼

這就是我所做的

case EVENT_FORMATTED_SMS_PP_ENV:{ 
final EnvelopeHandler eh = EnvelopeHandler.getTheHandler(); 
    short sd_len = eh.getSecuredDataLength(); 
    short sd_offset = eh.getSecuredDataOffset(); 
    byte[] tmpData = new byte[10]; 
    short dataLen = 0; 
    if (eh.findTLV(ToolkitConstants.TAG_ADDRESS, (byte) 1) != ToolkitConstants.TLV_NOT_FOUND) { 
     dataLen = eh.getValueLength(); 
     eh.copyValue((short)0,tmpData,(short)0,(short)dataLen); 
    } 

    actions.showNumberBuffer(tmpData, (short)dataLen);  
        break; 
       } 

我成功接收地址,但它會從短號碼,發送二進制SMS 也許一些其他的方式來獲得短號碼不同?

+0

發件人的地址稱爲TPOA在ETSI的說法(代表傳輸協議的起始地址)。嘗試尋找這個標籤。 – takumar

+0

@takumar感謝您的評論,我使用sim.toolkit包,並且在此包中沒有像TPOA這樣的常量 – Greenisha

+0

地址與預期值有什麼不同?這不是編碼問題嗎?有時編碼會令人不安。 – takumar

回答

1

地址TLV是服務中心地址。

發送者的地址是SMS-TPDU TLV內的TP-OA。 因此,您需要手動解析它。

下面是一個例子:

// Format of data under first SMS TPDU TLV, taken using EnvelopeHandler.findTLV() 
// ----------+-----+---------+---------+--------+--------+---------+--------+-------+ 
//  1  | 1 |  1 | 0~10 | 1 | 1 | 7 | 1 | 0~140 | 
// ----------+-----+---------+---------+--------+--------+---------+--------+-------+ 
//   | Len | TON/NPI | Address |  |  |   |  |  | 
// TP-MTI... |  TP-OA   | TP-PID | TP-DCS | TP-SCTS | TP-UDL | TP-UD | 
// ----------+-----+---------+---------+--------+--------+---------+--------+-------+ 

// Get received TPOA 
EnvelopeHandler envHdlr = EnvelopeHandler.getTheHandler(); 
envHdlr.findTLV(ToolkitConstants.TAG_SMS_TPDU, (byte) 1); 

// Assign TPOA to a buffer [0] for bytes-length [1..12] for the value as coded in 3GPP TS 23.040 
envHdlr.copyValue((short) 1, tpdaBuf, (short) 1, (short) 12); 
byte lengthTPOA = (byte) ((tpdaBuf[1] + 5)/2); 
tpdaBuf[0] = lengthTPOA; 
+0

謝謝,當我有時間的時候,我會試試它 – Greenisha