在 USB-NFC-Reader 上访问卡仿真模式
Accessing card-emulation mode on USB-NFC-Reader
我有一台 Android 平板电脑 Android 4.2。此平板电脑没有 NFC 硬件。但是我有一个外部 USB reader: ACR 1252U, that came with an Android library. I have asked some general questions of my setup 。现在它变得更具体了,我需要再问一个。在上一个问题中我发现,我可以使用 ACS Android 库 访问 readers 卡仿真 能力。
我的第一个目标是让 reader 模拟包含 URL 的 NFC 标签。任何支持 NFC 的 Android phone 都应该能够扫描这个模拟标签并自动打开浏览器。我已经对其进行了测试,并且它适用于真实(物理)标签。但不幸的是我无法正确模拟这个标签...
现在我写了一个 Android 应用程序,但我卡住了。根据readers API (PDF),我可以通过发送命令
让它进入卡模拟模式
E0 00 00 40 03 01 00 00
当我这样做时,它给了我答案:
E1 00 00 00 03 01 01 01
这确认它处于卡模拟模式。使用 Android 应用程序,我现在可以扫描模拟标签,它表示,这被识别为 "NXP MIFARE Ultralight" 标签。
我现在的问题是,如何为标签提供 URL。根据reader API(第5.10.3节),我需要发送命令:
E0 00 00 60 13 01 01 00 0F D1 01 0B 55 01 67 6F 6F 67 6C 65 2E 63 6F 6D
其中 D1 01 0B 55 01 67 6F 6F 67 6C 65 2E 63 6F 6D
是包含 URL“http://www.google.com”的 NDEF 消息。我使用此 Android Java 代码创建了此 NDEF 消息:
String target_url = "http://www.google.com";
Uri uri = Uri.parse(target_url);
NdefRecord recordNFC = NdefRecord.createUri(uri);
NdefMessage message = new NdefMessage(recordNFC);
我的 Android phone 上的一个应用程序读取 NFC 标签如下:
如您所见,URL 保存在模拟标签中。
- 那么为什么我的 phone 的浏览器打不开 url?
- 我错过了什么吗?我的命令有误吗?
- 为什么会有一些“?”字符?
您正在使用的命令,
E0 00 00 60 <Lc> 01 01 <Byte address> <Length> <Data>
从模拟 NFC 论坛类型 2 标签的块 3 开始写入数据字节。因此,字节地址 0x00
寻址块 3.
的第一个字节
您面临的问题是您只从块 3(字节 0)开始编写 NDEF 消息本身。但是,NFC Forum Type 2 标签需要更多的元数据。具体来说,块3是能力容器块。对于ACR1252U所呈现的特定内存布局,CC块需要填充值
E1 10 06 00
(如果允许写访问)或
E1 10 06 0F
(如果其他 NFC 设备应将标签视为只读)。
E1
是表示这是一个NFC Forum标签的幻数,10
指的是NFC Forum Type 2 Tag Operation定义的数据映射的1.0版本(当前版本)规格,06
表示该标签共有12个数据块。
此外,您需要将 NDEF 消息包装到 NDEF 消息 TLV 块中。 NDEF 消息 TLV 块具有标签 0x03
。因此,包装的 NDEF 消息将如下所示:
03 0F D1010B5501676F6F676C652E636F6D
因此,您需要写入的标签内存如下所示:
E1 10 06 00
03 0F D1 01
0B 55 01 67
6F 6F 67 6C
65 2E 63 6F
6D
最后,您应该通过在末尾放置终止符 TLV(标签 0xFE
,无长度)并将剩余字节填充为零 (0x00
) 来将标签内存填满。这也适用于数据已经与完整块对齐但在数据末尾之外还有更多(空)块的情况。
E1 10 06 00
03 0F D1 01
0B 55 01 67
6F 6F 67 6C
65 2E 63 6F
6D FE 00 00
因此,您可能希望使用以下写入命令将数据存储在模拟的 2 类标签上:
E0 00 00 60 1C 01 01 00 18 E1 10 06 00 03 0F D1 01 0B 55 01 67 6F 6F 67 6C 65 2E 63 6F 6D FE 00 00
我有一台 Android 平板电脑 Android 4.2。此平板电脑没有 NFC 硬件。但是我有一个外部 USB reader: ACR 1252U, that came with an Android library. I have asked some general questions of my setup
我的第一个目标是让 reader 模拟包含 URL 的 NFC 标签。任何支持 NFC 的 Android phone 都应该能够扫描这个模拟标签并自动打开浏览器。我已经对其进行了测试,并且它适用于真实(物理)标签。但不幸的是我无法正确模拟这个标签...
现在我写了一个 Android 应用程序,但我卡住了。根据readers API (PDF),我可以通过发送命令
让它进入卡模拟模式E0 00 00 40 03 01 00 00
当我这样做时,它给了我答案:
E1 00 00 00 03 01 01 01
这确认它处于卡模拟模式。使用 Android 应用程序,我现在可以扫描模拟标签,它表示,这被识别为 "NXP MIFARE Ultralight" 标签。
我现在的问题是,如何为标签提供 URL。根据reader API(第5.10.3节),我需要发送命令:
E0 00 00 60 13 01 01 00 0F D1 01 0B 55 01 67 6F 6F 67 6C 65 2E 63 6F 6D
其中 D1 01 0B 55 01 67 6F 6F 67 6C 65 2E 63 6F 6D
是包含 URL“http://www.google.com”的 NDEF 消息。我使用此 Android Java 代码创建了此 NDEF 消息:
String target_url = "http://www.google.com";
Uri uri = Uri.parse(target_url);
NdefRecord recordNFC = NdefRecord.createUri(uri);
NdefMessage message = new NdefMessage(recordNFC);
我的 Android phone 上的一个应用程序读取 NFC 标签如下:
如您所见,URL 保存在模拟标签中。
- 那么为什么我的 phone 的浏览器打不开 url?
- 我错过了什么吗?我的命令有误吗?
- 为什么会有一些“?”字符?
您正在使用的命令,
E0 00 00 60 <Lc> 01 01 <Byte address> <Length> <Data>
从模拟 NFC 论坛类型 2 标签的块 3 开始写入数据字节。因此,字节地址 0x00
寻址块 3.
您面临的问题是您只从块 3(字节 0)开始编写 NDEF 消息本身。但是,NFC Forum Type 2 标签需要更多的元数据。具体来说,块3是能力容器块。对于ACR1252U所呈现的特定内存布局,CC块需要填充值
E1 10 06 00
(如果允许写访问)或E1 10 06 0F
(如果其他 NFC 设备应将标签视为只读)。
E1
是表示这是一个NFC Forum标签的幻数,10
指的是NFC Forum Type 2 Tag Operation定义的数据映射的1.0版本(当前版本)规格,06
表示该标签共有12个数据块。
此外,您需要将 NDEF 消息包装到 NDEF 消息 TLV 块中。 NDEF 消息 TLV 块具有标签 0x03
。因此,包装的 NDEF 消息将如下所示:
03 0F D1010B5501676F6F676C652E636F6D
因此,您需要写入的标签内存如下所示:
E1 10 06 00 03 0F D1 01 0B 55 01 67 6F 6F 67 6C 65 2E 63 6F 6D
最后,您应该通过在末尾放置终止符 TLV(标签 0xFE
,无长度)并将剩余字节填充为零 (0x00
) 来将标签内存填满。这也适用于数据已经与完整块对齐但在数据末尾之外还有更多(空)块的情况。
E1 10 06 00 03 0F D1 01 0B 55 01 67 6F 6F 67 6C 65 2E 63 6F 6D FE 00 00
因此,您可能希望使用以下写入命令将数据存储在模拟的 2 类标签上:
E0 00 00 60 1C 01 01 00 18 E1 10 06 00 03 0F D1 01 0B 55 01 67 6F 6F 67 6C 65 2E 63 6F 6D FE 00 00