Java 当我在小程序中收到二进制格式的短信时,如何获取短号码

Java 当我在小程序中收到二进制格式的短信时,如何获取短号码,java,javacard,sim-card,Java,Javacard,Sim Card,我有一个java卡小程序,可以接收二进制短信并处理它们。现在我需要检查它们是否来自特定的短号码 我就是这么做的 case EVENT_FORMATTED_SMS_PP_ENV:{ final EnvelopeHandler eh = EnvelopeHandler.getTheHandler(); short sd_len = eh.getSecuredDataLength(); short sd_offset = eh.getSecuredDataOffset(); b

我有一个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;
                }
我成功地收到了地址,但它不同于发送二进制短信的短号码
也许可以用其他方式获得短号码?

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;

地址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;

发送方的地址在ETSI术语中称为TPOA(表示传输协议的原始地址)。请尝试查找此标记。@takumar谢谢您的评论,我使用sim.toolkit包,并且此包中没有类似于TPOA的常量。地址与预期值有何差异?这不是编码的问题吗?有时编码会让人不安。我的短号码是1945,但地址标签上的号码是919761。正如我在3GPP TS 31.130 Address TLV中发现的,该值是最后更新记录EFSMS apdut的TS服务中心地址(RP-OA)。发送方的地址在ETSI术语中称为TPOA(代表传输协议发起地址)。请尝试查找此标记。@takumar谢谢您的评论,我使用sim.toolkit包,并且此包中没有类似于TPOA的常量。地址与预期值有何差异?这不是编码的问题吗?有时编码会让人不安。我的短号码是1945,但地址标签上的号码是919761。正如我在3GPP TS 31.130地址TLV中发现的,该值是上次更新记录EFSMS APDUTNKS的TS服务中心地址(RP-OA),我会在有时间时尝试谢谢,我会在有时间时尝试