我正在尝试使用基于主机的卡仿真开发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
答案 0 :(得分:1)
首先是APDU命令/响应对 - 只是二进制字节块,除了有时使用的加密之外没有任何魔法。
要了解APDU命令和响应,请查看ISO 7816规范:
要深入了解支付卡,您应该查看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的样子,请使用此处的实用程序功能构建它们。