在Android中同时读取多个NFC标签

18
新的2.3.3 SDK增强了NFC支持,我想写一个依赖于此的应用程序。最终,我希望能够从同时进入场域的多个标签中读取数据,但Android似乎只会在第一个进入场域的标签上触发 - 后续的标签则被忽略。
从我使用的标签(Mifare Classic)的NFC规范(ISO/IEC 14443-3)中可以看出,我应该能够向标签发送“挂起”命令,这将导致它停止响应,并允许我读取场域中的下一个标签。Android在任何子类中都不直接支持halt命令,所以我尝试直接使用transceive(new byte[] {0x50, 0x00})来发送它。这引发了一个IOException,消息是“transceive失败”。
诚然,我正在主线程中完成所有这些操作,我知道这是不好的主意,但我只是想尽可能轻松地测试概念。
是否可能同时与场域中的多个标签进行通信?我做错了什么?
3个回答

8
很遗憾,目前您想要的还不可能实现,除非您进行一些相当高级的黑客操作,但这几乎从来不是一个好主意 :)
也许如果您在transceive()中发送正确的字节,就可以停止卡片,就像您现在尝试做的那样。但由于停止(或者更确切地说,HLTA,即您正在尝试发送的ISO14443-3A命令)是一种ISO14443-3A命令,所以这在MifareClassic接口上是行不通的——该接口使用了“加密”管道。直接通过NfcA接口传输也不起作用。
即使您能让卡片停止,这也不会自动导致手机中的NFC芯片恢复轮询新标签,因为您是“绕过”了堆栈。

感谢您的明确答复! - Nick Johnson

1

根据我的短暂经验,您无法使用多个标签进行工作。 如果字段中有两个标签,则无法从标签接收ID,它是二进制零。 因此,我猜测,在这一点上,您只能访问一个标签,并且不能在字段中放置超过一个标签。


RF协议支持冲突解决和解决多个标签的问题,但是问题是,当我尝试对已经读取的标签发出停止命令时,为什么会出现错误? - Nick Johnson
仅仅因为SDK不支持碰撞或同时读取多个标签。 我不知道错误是什么,但此时当一个标签进入场域时,你会收到一个Intent,这个Intent只是针对单个标签的。 根据标签协议,你现在无法找到其他标签的UID,因为SDK过于有限。一个干净的解决方案将涉及更新支持多个标签的SDK。 当然,我可以想象一些“黑科技”或使用NDK来克服当前的限制。 - Nolife
既然看起来这似乎是我们能得到的最接近答案的东西,那么你能否更新你的问题并附加额外信息? - Nick Johnson

0

你是否成功地使用transceive发送了其他命令,例如读取块(0x30,0x(块))或身份验证扇区命令?只是想让你确保首先正确使用transceive。


好的,没错。我还没有尝试过直接使用transcieve做其他事情;我会试一下的。 - Nick Johnson
在身份验证后调用readBlock()函数是正常的;使用与readBlock()输出相同的字节调用transceive()函数也是正常的。但尝试停止卡片仍会产生IOException异常。 - Nick Johnson

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