如何创建APDU消息

时间:2015-10-29 17:15:50

标签: java android nfc apdu hce

我正在尝试使用基于主机的卡仿真开发Android应用程序,并对APDU消息感到困惑。

我一直在尝试遵循一些示例(底部为2),但仍然不知道如何格式化我自己的APDU消息。我正在开发HCE应用程序和阅读器应用程序,因此我认为这两者都需要完成。

以零售店会员卡为例,需要转移的会员号码,如何创建APDU消息?

http://www.slideshare.net/ChienMingChou/hce-tutorialv-v1 http://www.javaworld.com/article/2076450/client-side-java/how-to-write-a-java-card-applet--a-developer-s-guide.html?page=3

2 个答案:

答案 0 :(得分:1)

首先是APDU命令/响应对 - 只是二进制字节块,除了有时使用的加密之外没有任何魔法。

要了解APDU命令和响应,请查看ISO 7816规范:

  • 第3部分:描述APDU命令和响应的内容和类
  • 第4部分:(以及其他一些)描述了基本命令。

要深入了解支付卡,您应该查看EMV规范。

不能说这里提到的规格很容易理解,但是如果你觉得开发卡片很有用,那么这个规格最好知道或掌握在你的手中以便澄清和最佳实践。

还请记住,卡制造商可以实现自己的APDU命令以及Java卡应用程序。在这种情况下,您应该查看特定的卡或卡应用手册。

您的零售商店卡可能使用ISO或卡制造商的标准APDU或实施自己的(javacard)命令。如果不查看零售卡规范或分析APDU跟踪,就不容易说出命令真正起作用。

答案 1 :(得分:0)

只需使用您的APDU命令创建一个String,通过一个函数运行它以将其转换为字节数组并返回它。没什么了不起的。

以下是进出String / byte []的函数。

public static String byteArrayToHex(byte[] bytes) {
    StringBuilder sb = new StringBuilder();
    for (byte b : bytes) {
        sb.append(String.format("%02X", b));
    }
    return sb.toString();
}

public static byte[] hexToByteArray(String hexString) {
    int len = hexString.length();
    byte[] data = new byte[len / 2];
    for (int i = 0; i < len; i += 2) {
        data[i / 2] = (byte) ((Character.digit(hexString.charAt(i), 16) << 4)
                | Character.digit(hexString.charAt(i + 1), 16));
    }
    return data;
}

就您发送会员号码的确切用例而言,我不确定该命令的格式,但如果您的格式是String的样子,请使用此处的实用程序功能构建它们。