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

4
我有一台安卓平板电脑,使用的是Android 4.2系统。该平板没有NFC硬件设备,但我有一个外置的USB读卡器:ACR 1252U,并配有一个安卓库。我在这里提出了一些关于我的设置的一般问题(链接)。现在问题更加具体了,我需要再问一个问题。在之前的问题中,我发现可以使用ACS Android库来访问读卡器的卡模拟功能。

我的第一个目标是使该读卡器模拟一个包含URL的NFC标签。任何支持NFC的安卓手机都应该能够扫描这个模拟标签并自动打开浏览器。我已经进行了测试,并且使用真正的(物理)标签也可以实现。但不幸的是,我无法正确地模拟这个标签...

现在我编写了一个安卓应用程序,但我卡住了。根据读卡器API(PDF),我可以通过发送命令将其置于卡模拟模式。

E0 00 00 40 03 01 00 00

当我这样做时,它会给我答案:
E1 00 00 00 03 01 01 01

这证实了,它处于卡模拟模式。现在,我可以用一个安卓应用程序扫描模拟的标签,标签上显示识别为“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

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);

我在我的安卓手机上使用读取NFC标签的应用程序,它显示如下:

正如你所见,URL被保存在模拟标签上。

  • 为什么我的手机浏览器不能打开这个URL?
  • 我有遗漏吗?我的命令是错的吗?
  • 为什么有一些“?”字符?
1个回答

3

您使用的命令,

E0 00 00 60 <Lc> 01 01 <Byte address> <Length> <Data>

从模拟的 NFC Forum Type 2 标签的第三个块开始写入数据字节。因此,字节地址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 Message 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

因此,您应该使用以下写入命令将数据存储在模拟的 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: 这是一个十六进制字符串,可能代表着某种二进制数据。

1
非常感谢您的回答!这个问题很久以前就提出了。该项目自那时起就被项目经理放弃了。尽管如此,我会接受它,因为它看起来非常不错。对于未来的读者:请注意,我从未测试过它 ;) - Michael B

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接