我有一个安卓Android平板电脑的Android平板电脑。此平板电脑没有NFC硬件。但是我有一个外部USB读卡器:ACR 1252U,附带Android library。我问了一些关于我的设置here的一般性问题。现在它变得更加具体,我需要问另一个。在上一个问题中,我发现,我可以使用 ACS Android库来访问读者卡模拟功能。
我的第一个目标是让该读者模拟包含URL的NFC标签。任何支持NFC的Android手机都应该能够扫描这个模拟标签并自动打开浏览器。我测试了它,它适用于真实(物理)标签。但不幸的是,我无法正确模仿这个标签......
现在我写了一个Android应用程序,但我被卡住了。根据{{3}},我可以通过发送命令
将其置于卡仿真模式BaseVariationContent
当我这样做时,它给了我答案:
E0 00 00 40 03 01 00 00
这证实它处于卡片仿真模式。使用Android应用程序,我现在可以扫描模拟标签,该标签表示这被认为是" NXP MIFARE Ultralight"标签
我现在的问题是,如何使用网址提供标记。根据阅读器API(第5.10.3节),我需要发送命令:
E1 00 00 00 03 01 01 01
其中E0 00 00 60 13 01 01 00 0F D1 01 0B 55 01 67 6F 6F 67 6C 65 2E 63 6F 6D
是包含网址" readers API (PDF)"的NDEF邮件。我使用这个Android Java代码创建了这个NDEF消息:
D1 01 0B 55 01 67 6F 6F 67 6C 65 2E 63 6F 6D
我的Android手机上的应用程序读取NFC标签,如下所示:
如您所见,URL保存在模拟标记上。
答案 0 :(得分:2)
您正在使用的命令,
E0 00 00 60 <Lc> 01 01 <Byte address> <Length> <Data>
从模拟的NFC论坛类型2标记的块3开始写入数据字节。因此,字节地址0x00
寻址块3的第一个字节。
您面临的问题是您只能从块3(字节0)开始编写NDEF消息。但是,NFC论坛类型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
最后,您应该通过在末尾放置一个终结符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
因此,您可能希望使用以下write命令将数据存储在模拟的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