【发布时间】:2014-12-03 11:22:28
【问题描述】:
假设我们有一个自定义芯片,其中包含存储为 NDEF 的数据以及存储在 标准 NDEF 数据之后的自定义数据。我们如何使用 Android 读取这些数据?
【问题讨论】:
标签: android android-intent nfc ndef
假设我们有一个自定义芯片,其中包含存储为 NDEF 的数据以及存储在 标准 NDEF 数据之后的自定义数据。我们如何使用 Android 读取这些数据?
【问题讨论】:
标签: android android-intent nfc ndef
这在很大程度上取决于您使用的标签硬件类型。 NDEF 是一个抽象层,可让您在任何标签硬件上以相同的方式处理数据。在 NDEF 层之后,每个标签平台都有自己的内存组织和自己的一组命令来访问数据。
您可以在NFC Forum's website 上购买每个标准化标签平台的规范作为“X 型标签操作规范”。
例如,如果您有一个类型 2 的标签(它具有扁平的内存结构并使用简单的读/写命令来访问该内存),则将从第 4 页开始存储 NDEF 消息。您可以使用更高的页面来存储专有数据(例如从第 16 页开始)然后您可以使用 NfcA 标签技术从 Android 访问该标签:
Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
NfcA nfcA = NfcA.get(tag);
nfcA.connect();
byte[] result = nfcA.transceive(new byte[] {
(byte)0x30, /* CMD = READ */
(byte)0x10 /* PAGE = 16 */
});
【讨论】:
0x30 与参数地址0x04 直到x0F 将是MIFARE Ultralight ® 的答案。
是的,这是可能的。您可以使用transceive(byte[] data)方法向标签发送RFID命令。
发送哪些命令取决于您使用的标签类型。您应该阅读您的标签类型(ISO14443 或 ISO15693)的命令结构。为了使用这样的命令,您可能需要更深入地研究标准以了解如何创建正确的命令序列。
以 ISO15693 为例,读取单块,命令代码 0x20(未经测试):
byte[] readSingleBlock(int block) throws IOException {
byte[] command = new byte[3];
command[0] = 0x12; // flags
command[1] = 0x20; // read single block command
command[2] = (byte) block;
byte result[] = nfcv.transceive(command);
return result;
}
【讨论】: