【发布时间】:2016-03-28 14:00:00
【问题描述】:
我想将 NFC 标签 ID 从一台 Android 设备交换(或仅读取)到另一台设备,但我不知道我应该使用点对点模式还是使用 HCE 模拟 NFC 标签。
如果我使用 HCE,模拟标签 ID 是否唯一?
什么是更好的选择,还是有更简单的选择?
【问题讨论】:
标签: android nfc uniqueidentifier hce nfc-p2p
我想将 NFC 标签 ID 从一台 Android 设备交换(或仅读取)到另一台设备,但我不知道我应该使用点对点模式还是使用 HCE 模拟 NFC 标签。
如果我使用 HCE,模拟标签 ID 是否唯一?
什么是更好的选择,还是有更简单的选择?
【问题讨论】:
标签: android nfc uniqueidentifier hce nfc-p2p
P2P 和 HCE 都不会为您提供唯一 ID,至少在我所知道的任何手机上都不会。对于 P2P,要求在 ATR 中交换的 ID 是随机的。对于 HCE,仿真标签 ID 通常设置为 08h 加上一个随机数。可能需要设置 API 调用,但我不知道。但是,手机不能被任何阅读的人唯一识别,这很有意义。
【讨论】:
我假设您在这里谈论的是防冲突标识符/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);
见Stephen's answer。通常,P2P 模式和 HCE 都不应提供唯一且稳定的 ID。但是,有一些例外情况,并且不稳定的 ID 更改的时间点可能会有所不同(另请参阅this answer)。可能是这样的:
另请注意,某些 NFC 设备将使用不以随机前缀 0x08 开头的随机生成的 UID。
Android 没有提供 API 来影响 UID/防碰撞标识符,所以简短的回答是 no。但是,如果可以选择生根或创建自定义 ROM,则可以更改 UID 和其他协议参数:
不,您绝对不应该这样做。当您尝试将 HCE 设备集成到某些旧系统时,有时您没有太多选择,但您绝对应该考虑不同的设计。
首先,作为Stephen already wrote,如果 NFC 设备暴露了一个固定/稳定的标识符,这可能会引入隐私问题,因为任何人都可以读取和跟踪 ID。
其次,虽然许多系统仍然使用这些 ID 来验证(!)卡,但 UID 不一定是唯一的(特别是 4 字节的 UID 比卡少)并且 UID 很容易被克隆。详情请见this answer。
【讨论】: