如何以编程方式检测NFC芯片的内存大小/页码

问题描述 投票:0回答:2

除了探测特定页码并检查它们是否存在之外,以编程方式检测NFC芯片(MIFARE Ultralight或NTAGxxx)的内存大小或页数的最简单方法是什么?

ATR中是否有特定字节返回或存储在芯片内存的受保护区域中的某个字节,告知它是特定的NTAGxxx芯片,还是页数或字节数?

tags nfc rfid mifare fingerprinting
2个回答
3
投票

通常,您只能通过广泛的指纹识别和使用读取命令进行探测来确定这一点。

  1. 指纹识别:这意味着您需要拥有一个特定于制造商特征的数据库(例如从数据表中收集而且 - 更不经常的是 - 从经验测试中收集,因为这些信息不是(公开的,或根本没有)记录的对于大多数标签,您可以检查您的标签。
  2. 探测: 从第0页开始 阅读页面 成功时:将读取地址增加4页并重新开始 失败时:将读取地址递减1并尝试再次读取,直到找到可读地址 在行业末端:从下一个行业开始 这样你就可以找到最后一个可读的页面地址,它不一定是标签内存的“真实”端(例如,最后可能有受保护的页面)。

如果您的Ultralight和NTAG标签是EV1标签(即它们实现了Ultralight EV1命令集),则公开GET_VERSION命令,您可以使用该命令检索存储大小信息。版本信息与所有现有标签指纹的数据库(您可以从Ultraight / NTAG数据表中获取该信息)结合使用,可以可靠地确定标签类型,从而确定内存大小。

1)除了作为“NTAG”出售的一些假冒芯片模仿真实NTAG芯片的参数,但似乎有内存大小,缺乏命令支持等,与模仿参数的芯片不匹配。

对于遵循NFC论坛类型2标签操作规范的NFC标签,您还可以依赖编码到功能容器中的标签内存大小。但是,此内存大小不一定是物理内存大小。


0
投票

我认为,从接受的答案中,下面的代码是有道理的,

int numberOfPages = 0;
int tagType = ulTag.getType();
if(tagType == MifareUltralight.TYPE_ULTRALIGHT) {
    numberOfPages = 16;
} else if(tagType == MifareUltralight.TYPE_ULTRALIGHT_C) {
    numberOfPages = 47;
}

getMaxTransceiveLength()用于检索可以通过收发(byte [])发送的最大字节数。 Transceive命令分别使用Flags,Command和Page编号的前3个字节。

我们需要检查以下代码是否有效?

int totalBytes = ulTag.getMaxTransceiveLength() + 3;
int totalPages =  totalBytes / ulTag.PAGE_SIZE;
© www.soinside.com 2019 - 2024. All rights reserved.