我对Android开发和NFC技术都很陌生。
我正在尝试构建一个应用程序,以读取我不知道任何信息的NFC卡(公交卡)的内容,例如查看我还剩下多少张票。
我已经使用各种NFC应用程序扫描了该卡,并知道该卡的类型为:IsoDep和NfcB。
目前,我正在尝试使用IsoDep读取其内容,但没有成功(错误代码6A82、91AE、6E00等)。
我有一个应用程序在等待类型为“ACTION_NDEF_DISCOVERED || ACTION_TECH_DISCOVERED || ACTION_TAG_DISCOVERED”的新意图,它会打开一个新线程(因为不可能在UI线程上进行读取和连接),并尝试读取卡片的内容。
我猜我的问题在于我传递给isoDep.transceive(NATIVE_SELECT_APP_COMMAND)
的字节。
我应该继续在IsoDep上尝试,还是应该尝试NfcB?你们有什么建议吗?
以下是我的代码示例:
final byte[] SELECT = {
(byte) 0x00, // CLA Class
(byte) 0xA4, // INS Instruction
(byte) 0x04, // P1 Parameter 1
(byte) 0x00, // P2 Parameter 2
(byte) 0x08, // Length
(byte) 0x31, (byte)0x54, (byte)0x49, (byte)0x43, (byte)0x2e,
(byte) 0x49, (byte)0x43, (byte)0x41, // AID 315449432e494341
};
Tag tagFromIntent = m_intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
IsoDep isoDep = IsoDep.get(tagFromIntent);
try {
isoDep.connect();
byte[] result = isoDep.transceive(SELECT);
String str = bytesToHex(result);
Log.i("test", "SELECT: " + str);
isoDep.close();
} catch (Exception e) {
String error = e.getMessage();
}
我的字节转十六进制函数:
final protected static char[] hexArray = "0123456789ABCDEF".toCharArray();
public static String bytesToHex(byte[] bytes) {
char[] hexChars = new char[bytes.length * 2];
for ( int j = 0; j < bytes.length; j++ ) {
int v = bytes[j] & 0xFF;
hexChars[j * 2] = hexArray[v >>> 4];
hexChars[j * 2 + 1] = hexArray[v & 0x0F];
}
return new String(hexChars);
}
=============================================================
编辑:
我刚刚了解到这张卡正在使用Calypso身份验证方案。
在这个问题的答案中有些帮助:Read data from NFC tag (IsoDep)。我找到了一个好的SELECT函数,我已经编辑了我的问题以持有新的“SELECT”命令,它正在工作——我得到了这个字符串:“6F228408315449432E494341A516BF0C13C70800000000029780A55307060A07062004019000”,但我不知道它是什么意思。
然后我使用这个命令尝试读取一个字符串:
byte[] GET_STRING = {
(byte) 0x80, // CLA Class
0x04, // INS Instruction
0x00, // P1 Parameter 1
0x00, // P2 Parameter 2
0x10 // LE maximal number of bytes expected in result
};
但是我遇到了6E00错误,有什么建议吗?
91AE
жҲ–9100
еҗ—пјҹеҰӮжһңжҳҜпјҢиҜ·зЎ®дҝқеҚЎзүҮжҳҜNfcBиҖҢдёҚжҳҜNfcAгҖӮ - Michael Roland