访问 USB-NFC 读卡器上的卡模拟模式

Mic*_*l B 5 android nfc mifare ndef hce

我有一台运行 Android 4.2 的 Android 平板电脑。此平板电脑没有 NFC 硬件。不过,我有一个外部 USB 读卡器:ACR 1252U,附带Android 库我在这里问了一些有关我的设置的一般性问题。现在事情变得更具体了,我需要问另一个人。在上一个问题中,我发现我可以使用ACS Android 库来访问读卡器卡模拟功能。

我的第一个目标是让该阅读器模拟包含 URL 的 NFC 标签。任何支持 NFC 的 Android 手机都应该能够扫描此模拟标签并自动打开浏览器。我已经测试过它,它可以与真实的(物理)标签一起使用。但不幸的是我无法正确模拟这个标签......

现在我写了一个Android应用程序,但我陷入困境。根据读者API(PDF),我可以通过发送命令使其进入卡模拟模式

E0 00 00 40 03 01 00 00
Run Code Online (Sandbox Code Playgroud)

当我这样做时,它给了我答案:

E1 00 00 00 03 01 01 01
Run Code Online (Sandbox Code Playgroud)

这确认它处于卡模拟模式。现在,通过 Android 应用程序,我可以扫描模拟标签,该标签被识别为“NXP MIFARE Ultralight”标签。

我现在的问题是,如何向标签提供 URL。根据阅读器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
Run Code Online (Sandbox Code Playgroud)

其中D1 01 0B 55 01 67 6F 6F 67 6C 65 2E 63 6F 6DNDEF 消息包含 URL“ http://www.google.com ”。我使用以下 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);
Run Code Online (Sandbox Code Playgroud)

我的 Android 手机上的一个读取 NFC 标签的应用程序显示以下内容:

如您所见,URL 保存在模拟标签上。

  • 那么为什么我的手机浏览器打不开该网址呢?
  • 我错过了什么吗?我的命令有错吗?
  • 为什么有一些“?” 人物?

Mic*_*and 3

您正在使用的命令,

E0 00 00 60 <Lc> 01 01 <字节地址> <长度> <数据>

从模拟 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 论坛标签的幻数,10指的是 NFC 论坛类型 2 标签操作规范定义的数据映射版本 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         

0xFE最后,您应该通过在末尾放置终止符 TLV(标记,无长度)并将剩余字节填充为零 ( 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

因此,您需要使用以下写入命令将数据存储在模拟的 Type 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