如何阅读其他Android设备的NFC ID?

时间:2015-12-22 10:24:54

标签: android nfc uniqueidentifier hce nfc-p2p

我想将NFC标签ID从一个Android设备交换(或仅读取)到另一个Android设备,但我不知道是否应该使用点对点模式或使用HCE模拟NFC标签。

如果我使用HCE,模拟标签ID是唯一的吗?

什么是更好的选择还是更简单?

2 个答案:

答案 0 :(得分:3)

P2P和HCE都不会为您提供唯一的ID,至少在我知道的任何手机上都没有。对于P2P,要求在ATR中交换的ID是随机的。使用HCE,模拟标签ID通常设置为08h加上一个随机数。可能有API调用设置,但我不知道这样。但是很有意义的是,任何人都不能通过阅读来识别手机。

答案 1 :(得分:3)

如何阅读其他Android设备的NFC ID?

我假设您在这里谈论防冲突标识符/ UID。在阅读Android设备上,您可以使用reader-mode API以HCE模式访问设备:

nfcAdapter.enableReaderMode(this, new NfcAdapter.ReaderCallback() {
    public void onTagDiscovered (Tag tag) {
        byte[] uid = tag.getId();
        // TODO: do something with the UID ...
    }
}, NfcAdapter.FLAG_READER_NFC_A | NfcAdapter.FLAG_READER_SKIP_NDEF_CHECK, null);

模拟标签ID是唯一的吗?

Stephen's answer。通常,P2P模式和HCE都不应该提供唯一且稳定的ID。但是,这有一些例外,非稳定ID更改的时间点可能会有所不同(另请参阅this answer)。可能是:

  • 设备具有安全元素,并使用该安全元素的静态UID。
  • 设备每次打开时都会生成一个新的随机UID,但在关闭电源之前会继续使用相同的UID。
  • 设备会在每次外部读卡器设备激活时生成新的随机UID。即每当外部HF场应用于Android设备的NFC天线时。

另请注意,某些NFC设备将使用随机生成的UID,这些UID不以随机前缀0x08开头。

我可以强制设备使用固定/稳定的UID吗?

Android不提供影响UID /防冲突标识符的API,因此简短的回答是 no 。但是,如果可以选择生根或创建自定义ROM,则可以更改UID和其他协议参数:

您是否应该使用UID识别(甚至验证)设备?

不,你绝对不应该这样做。虽然当您尝试将HCE设备集成到某个遗留系统时,您有时没有太多选择,但您一定要考虑不同的设计。

首先,作为Stephen already wrote,如果NFC设备公开固定/稳定标识符,则可能会引入隐私问题,因为任何人都可以阅读并跟踪ID。

其次,虽然许多系统仍然使用这些ID来验证(!)卡,但UID不一定是唯一的(特别是比那里的卡少4个字节的UID)并且可以很容易地克隆UID。有关详细信息,请参阅this answer