使用固定卡ID的基于主机的卡模拟

Android 4.4引入了基于主机的卡仿真(HCE)。 如您所知,所有NFC卡都带有一个固定的卡号( NfcAdapter.EXTRA_ID )。

我的办公室门禁通常会检测授权的NFC卡ID。 将手机闪烁到KitKat后,我尝试用接入阅读器扫描手机。 但是,每当屏幕closures和再次打开,我得到一个不同的卡ID。

我曾尝试保持电话屏幕,并将模拟卡ID注册到门禁系统。 它设法授予访问开门。 但是在屏幕closures和再次打开之后,这将不起作用。

自从KitKat推出HCE模式以来,我一直在用我的手机来模拟我的门禁卡。

任何想法使电话模拟卡ID固定?

这是(至less在官方的API)不可能的:

在交换的第一部分,HCE设备将呈现其UID; 假设HCE设备具有随机的UID。 这意味着在每个水龙头中,呈现给读者的UID将是随机生成的UID。 因此,NFC阅读器不应该依赖HCE设备的UID作为authentication或识别的forms。

http://developer.android.com/guide/topics/connectivity/nfc/hce.html#ProtocolParams

根据负责HCE的Google开发者之一:

对不起,我意识到很多人想要这个,但在官方版本中是不可能的。 (你当然可以用一些AOSP黑客来做)。 原因是HCE是围绕后台运行而devise的。 如果我们允许应用程序设置UID,则每个应用程序都可能要设置自己的UID,而且无法解决冲突。 我们希望通过HCE,NFC基础设施将移动到更高层次的协议栈上进行身份validation,而不依赖于UID(无论如何都很容易克隆)。

至lessBroadcom的NFC控制器(例如在Nexus 5中使用)支持设置防冲突标识符(UID),ATQA和SAK字节的任意值。 但是,没有改变它们的API,所以唯一的方法就是修改libnfc-nci库。

NFC-A的相关代码位于文件nfa_dm_discover.c (从第322行开始):

 UINT8_TO_STREAM (p, NFC_PMID_LA_BIT_FRAME_SDD); UINT8_TO_STREAM (p, NCI_PARAM_LEN_LA_BIT_FRAME_SDD); UINT8_TO_STREAM (p, 0x04); UINT8_TO_STREAM (p, NFC_PMID_LA_PLATFORM_CONFIG); UINT8_TO_STREAM (p, NCI_PARAM_LEN_LA_PLATFORM_CONFIG); UINT8_TO_STREAM (p, platform); UINT8_TO_STREAM (p, NFC_PMID_LA_SEL_INFO); UINT8_TO_STREAM (p, NCI_PARAM_LEN_LA_SEL_INFO); UINT8_TO_STREAM (p, sens_info); 

此代码当前设置ATQA(值平台和0x04的组合)和SAK字节(sens_info的值)。

为了更改NFC-A防冲突期间使用的UID,您可以添加添加参数NFC_PMID_LA_NFCID1:

 UINT8_TO_STREAM (p, NFC_PMID_LA_NFCID1); UINT8_TO_STREAM (p, 4); // length of NFCID1 in bytes UINT8_TO_STREAM (p, 0x12); UINT8_TO_STREAM (p, 0x34); UINT8_TO_STREAM (p, 0x56); UINT8_TO_STREAM (p, 0x78); 

你可以在这里find一个更可定制的libnfc-nci版本(尽pipe如此,还在工作)。