我正在尝试在我的Android应用程序中阅读恩智浦开发的NFC标签。可以使用Android阅读标记:App by NXP和one other正确读取标记。
确切的标签类型是“ICODE SLI-L(SL2ICS50)”,RF技术是“Type V / ISO 15693”(从这些工作应用中获取的数据)。存储器由2个页面组成,每个页面有4个块,每个块有4个字节 - 我只想将整个数据存储在存储器中。
标记必须使用Android的NfcV
类进行处理,标记的数据表为available here,但很难找到使用NfcV
的任何有效代码示例。我尝试了几个由数据表自己总结的东西,我尝试了来自this PDF I found with Google的通信样本,但没有任何作用。
我的活动中的相应方法(我使用NFC Foreground Dispatch)如下所示:
public void onNewIntent(Intent intent) {
android.nfc.Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
NfcV tech = NfcV.get(tag);
try {
tech.connect();
byte[] arrByt = new byte[9];
arrByt[0] = 0x02;
arrByt[1] = (byte) 0xB0;
arrByt[2] = 0x08;
arrByt[3] = 0x00;
arrByt[4] = 0x01;
arrByt[5] = 0x04;
arrByt[6] = 0x00;
arrByt[7] = 0x02;
arrByt[8] = 0x00;
byte[] data = tech.transceive(arrByt);
// Print data
tech.close();
} catch (IOException e) {
// Exception handling
}
}
当我将手机放在标记上时,会正确调用该方法,但transceive()
对象的NfcV
方法始终会抛出IOException:android.nfc.TagLostException: Tag was lost.
。这是我尝试的所有字节数组的结果(上面的那个不太可能是正确的,但是在过去的几天里,我尝试了一堆其他所有这些都导致相同的行为。
根据我在互联网上看到的内容,我得出结论,错误的发生是因为我向标签发送了错误的命令 - 但我无法想出正确的命令。有什么想法吗?
答案 0 :(得分:6)
ISO 15693定义了不同的读命令,制造商也可以定义专有的读命令。所有ICODE标签都支持ISO 15693单块读取命令。您可以按如下方式发送:
public static void processNfcIntent(Intent intent){
Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
if(tag != null){
// set up read command buffer
byte blockNo = 0; // block address
byte[] readCmd = new byte[3 + id.length];
readCmd[0] = 0x20; // set "address" flag (only send command to this tag)
readCmd[1] = 0x20; // ISO 15693 Single Block Read command byte
byte[] id = tag.getId();
System.arraycopy(id, 0, readCmd, 2, id.length); // copy ID
readCmd[2 + id.length] = blockNo; // 1 byte payload: block address
NfcV tech = NfcV.get(tag);
if (tech != null) {
// send read command
try {
tech.connect();
byte[] data = tech.transceive(readCmd);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
tech.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}