当前位置: 首页 > 知识库问答 >
问题:

如何定义用于主机卡仿真的存储数据的APDU?

邓光赫
2023-03-14

我一直在查看全球平台规范,了解如何为我的应用程序定义APDU,该应用程序将使用主机卡模拟(HCE)。我的应用程序应该有一部手机通过HCE像NFC标签一样工作,另一部手机充当NFC阅读器。我试图在手机之间传输的任意数据只是一个包含ID号的简单字符串,但我不确定如何在代码中应用它。我已经了解了不同字节命令的含义,但我真的不知道如何应用它。

我想我需要使用STORE DATA命令,但我不知道如何直观地执行,也不太明白。我目前关注的是HCE方面,而不是读者方面。

这是我到目前为止在HCE方面的代码

public class SecondaryActivity extends HostApduService {

@Override
public void onDeactivated(int reason) {

}

@Override
public byte[] processCommandApdu(byte[] commandApdu, Bundle extras) {
    String inboundApduDescription;
    byte[] responseApdu;

    if (Arrays.equals(AID_SELECT_APDU, commandApdu)) {
        inboundApduDescription = "Application selected";
        Log.i("HCEDEMO", inboundApduDescription);
        byte[] answer = new byte[2];
        answer[0] = (byte) 0x90;
        answer[1] = (byte) 0x00;
        responseApdu = answer;
        return responseApdu;

    }
    return commandApdu;
}

private static final byte[] AID_SELECT_APDU = {
        (byte) 0x00,
        (byte) 0xA4,
        (byte) 0x04,
        (byte) 0x00,
        (byte) 0x07,
        (byte) 0xF0, (byte) 0x39, (byte) 0x41, (byte) 0x48, (byte) 0x14, (byte) 0x81, (byte) 0x00,
        (byte) 0x00
};

private static final byte[] STORE_DATA = {
        (byte) 0x00,
        (byte) 0xA4,
        (byte) 0x04,
        (byte) 0xA5, // forproprietary data according to the spec
        (byte) 0xE2,
        (byte) 0x66, (byte) 0x39, (byte) 0x41, (byte) 0x48, (byte) 0x14, (byte) 0x81, (byte) 0x00,
        (byte) 0x00
};

private static final byte[] INSTALL = {
        (byte) 0x00,
        (byte) 0x00,
};

}

如何将数据从HCE电话发送到阅读器电话?我错过了什么?需要做些什么?

共有1个答案

杨海
2023-03-14

您几乎可以为HCE定义任何APDU命令。只需要初始的SELECT(by AID)命令。之后,您可以创建自己的命令集(或尝试遵循ISO/IEC 7816-4命令),只要您遵守命令/响应APDU结构的ISO/IEC 7816规则,并坚持有效的CLA、INS和状态字值。

由于您只想传输一个ID,您可以直接响应SELECT命令发送这个ID:

private static final String ID = "1234567890"

@Override
public byte[] processCommandApdu(byte[] commandApdu, Bundle extras) {
    byte[] responseApdu = new byte[] { (byte)0x6F, (byte)0x00 };

    if ((commandApdu != null) && (commandApdu.length >= 4)) {
        if ((commandApdu[0] == (byte)0x00) && (commandApdu[1] == (byte)0xA4) && (commandApdu[2] == (byte)0x04) && (commandApdu[3] == (byte)0x00)) {
            Log.i("HCEDEMO", "Application selected");

            byte[] id = ID.getBytes(Charset.forName("UTF-8"));
            responseApdu = new byte[id.length + 2];
            System.arraycopy(id, 0, responseApdu, 0, id.length);
            responseApdu[id.length] = (byte)0x90;
            responseApdu[id.length + 1] = (byte)0x00;
        }
    }
    return responseApdu;
}
 类似资料:
  • 我正在尝试使用ACR1281U NFC标签阅读器在Android设备上进行主机卡仿真。 这就是我想申请的类型。 根据Android文档和示例,需要在Android项目中注册一个AID: 我如何知道我需要在我的Android应用程序中注册哪些AID,以便读者可以阅读HCE Android应用程序? 这里是我发布的另一个关于同样问题的问题:没有找到支持的卡终端ARC1281U nfc读卡器 我参考了以

  • HCE是在Android 4.4中实现的,但是关于如何在模拟卡中写入的信息很少。 我有心肺复苏40.30阅读器 这个读者带来了一些样本NFC卡。我使用NFC读卡应用程序读取这些卡。 与CPR 40.30兼容的NFC卡详细信息 IC制造商:恩智浦半导体 我想写HCE代码,希望我的Android手机像一张卡片一样,可以被CPR 40.30阅读器读取。我假设HCE代码应该模拟具有上述规格的卡,因为读卡器

  • 通过阅读《HCE开发者指南》,这里的《HCE开发者指南》似乎可以将android手机用作阅读器。我把卡片信息放在NFC标签上,然后用手机读。我想让手机充当阅读器。你知道这是否可行吗?我创建了一个示例项目,其中包含以下代码行: 我不知道下一步该去哪里。

  • 我刚刚开始制作一个使用主机卡模拟(HCE)的应用程序,我做了各种各样的工作。我需要该应用程序使手机的行为像一张卡,而另一部手机的行为像一个NFC阅读器,并扫描它,反之亦然,以便交换一个非常小的信息-身份证号码。 我已经完成了一些功能单元,如ProcessDirecdApdu和定义AID,但我并不真正理解它是如何工作的。 这是我目前的代码。。。 @TargetApi(19)公共类主要活动扩展Host

  • translated_page: https://github.com/PX4/Devguide/blob/master/en/simulation/sitl.md translated_sha: b522243efef9deb5e2d3ae7bd03ae9ed0eee3418 Multi-Vehicle Simulation This tutorial explains how to simul

  • 我正在本地运行Azure CosmosDB模拟器,我希望使用Python中的表接口。Microsoft提供azure cosmosdb table python sdk以连接到表API[1]。我无法成功连接到模拟器,即使我能够连接到云中的实际CosmosDB帐户。 版本号等: Windows 10 Python 3.6(CPython) azure-cosmosdb-table 1.0.5 我用于