其他分享
首页 > 其他分享> > android – 在USB-NFC-Reader上访问卡仿真模式

android – 在USB-NFC-Reader上访问卡仿真模式

作者:互联网

我有一个安卓Android平板电脑的Android平板电脑.此平板电脑没有NFC硬件.但是我有一个外部USB读卡器:ACR 1252U,附带一个Android library.我已经问了一些关于我的设置here的一般性问题.现在它变得更具体,我需要问另一个.在上一个问题中我发现,我可以使用ACS Android库来访问读卡器仿真功能.

我的第一个目标是让该读者模拟包含URL的NFC标签.任何支持NFC的Android手机都应该能够扫描这个模拟标签并自动打开浏览器.我测试了它,它适用于真实(物理)标签.但不幸的是,我无法正确模拟这个标签……

现在我写了一个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提供标记.根据阅读器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手机上的应用程序读取NFC标签,说明如下:

如您所见,URL保存在模拟标记上.

>那为什么我手机的浏览器没有打开网址?
>我错过了什么吗?我的命令错了吗?
>为什么有一些“?”字符?

解决方法:

您正在使用的命令,

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

标签:android,nfc,ndef,hce,mifare
来源: https://codeday.me/bug/20190702/1357103.html