我想将NFC标签ID从一个Android设备交换(或仅读取)到另一个Android设备,但我不知道是否应该使用点对点模式或使用HCE模拟NFC标签。
如果我使用HCE,模拟标签ID是唯一的吗?
什么是更好的选择还是更简单?
答案 0 :(得分:3)
P2P和HCE都不会为您提供唯一的ID,至少在我知道的任何手机上都没有。对于P2P,要求在ATR中交换的ID是随机的。使用HCE,模拟标签ID通常设置为08h加上一个随机数。可能有API调用设置,但我不知道这样。但是很有意义的是,任何人都不能通过阅读来识别手机。
答案 1 :(得分:3)
我假设您在这里谈论防冲突标识符/ 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设备将使用随机生成的UID,这些UID不以随机前缀0x08
开头。
Android不提供影响UID /防冲突标识符的API,因此简短的回答是 no 。但是,如果可以选择生根或创建自定义ROM,则可以更改UID和其他协议参数:
不,你绝对不应该这样做。虽然当您尝试将HCE设备集成到某个遗留系统时,您有时没有太多选择,但您一定要考虑不同的设计。
首先,作为Stephen already wrote,如果NFC设备公开固定/稳定标识符,则可能会引入隐私问题,因为任何人都可以阅读并跟踪ID。
其次,虽然许多系统仍然使用这些ID来验证(!)卡,但UID不一定是唯一的(特别是比那里的卡少4个字节的UID)并且可以很容易地克隆UID。有关详细信息,请参阅this answer。