NFC-SIM (SWP) on Nexus 5

如果你懒得看前因后果,只想找使用方法的话,请直接跳到总结

作为一名联通的老用户,我一直比较关注联通。突然有一天,我在沃派南京的微信里收到一条广告:手机当卡刷,感觉萌萌哒。这条广告引起了我极大的兴趣,心里想着:期待已久的东西终于来了。于是,我顺利成为南京联通NFC-SIM的首批内测用户。
第二天,营业厅通知我去换卡,我带上取卡针,拿着我心爱的Nexus 5去了营业厅,换了卡,重启了手机,打开了NFC,准备充值。这时候问题来了,手机放到充值的机器上显示:未检测到卡片。然后我就开始怀疑是否需要装什么软件,可是当我看到一个个小米、索尼、三星的手机都是换了卡就直接可以充值,我就开始郁闷了,我堂堂Nexus居然会不支持,这是几个意思呀。

好吧,我不得不求助于Google了,关键词也就是标题中出现的几个词了,其中”SWP”是我在SIM卡上发现的关键词。很快,我找到几个讨论帖,一个是XDA上的帖子:[Q] SWP activation on Nexus 5 ?,一个是机锋论坛上的帖子:Nexus5的NFC支持北京移动的NFC公交sim卡吗?。后来,我还在机锋论坛上看到一个总结的帖子:nexus4,5 nfc公交刷卡。我仔细看了这些帖子,又另外查阅了部分资料,整理如下。
这里用的技术是NFC硬件卡模拟,主要需要两个硬件:NFC芯片和NFC SE(Secure Element)安全芯片。其中,SE可以放在3个物理位置:SIM, Phone 或者 SD。
把SE放在SIM卡中就是国内联通移动等用的方法,所用的协议叫做 SWP(Single Wire Protocol),这个协议用于NFC和SIM卡之间进行通信。
把SE放在Phone中就是指手机本身内置了加密模块,Nexus就是采用的这个方案,据说部分三星手机也用了这个方案。
把SE放在SD这种方案用的很少,不多说。
于是,主流的NFC方案就产生了两种分歧,一种把SE放在SIM卡中,一种把SE放在手机中。把SE放在SIM卡中又称为UICC(Universal Integrated Circuit Card),把SE放在手机中又称为HCE(Host card emulation)。
Google在Nexus中缺省使用了HCE(据说是为了推广自己的Google Wallet),禁用了UICC,于是就导致了前面提到的不能用联通NFC-SIM的情况。好吧,那就是想办法禁用HCE,启用UICC喽。幸运的是,Google没有彻底封掉UICC,下面就是详细的修改方法:
前提:手机已经root
系统:我测试的系统为4.4.4,下面的具体修改方法也都是针对4.4.4的。不过从论坛中的信息来看,4.4.3是完全相同的,4.4.2有些许出入。
型号:我测试的Nexus 5为美版(D820),国际版并未测试,理论上应该是一样的。
提醒:修改之前最好先进行备份
需要修改的文件有两个:
/system/etc/libnfc-brcm.conf:
line 78,在开头加#,也就是注释掉这句话,也就是禁用HCE

1
#NFA_MAX_EE_SUPPORTED=0

line 91,在开头加#

1
#ACTIVE_SE=0x0

line 94,去掉开头的#,也就是启用UICC

1
ACTIVE_SE=0xF3

在文件最后加上3行:

1
###############################################################
# Route technologies to UICC
DEFAULT_ISODEP_ROUTE=0xF3

继续修改第二个文件
/system/etc/libnfc-brcm-20791b05.conf:
line 29,在开头加#

1
#NFA_DM_START_UP_CFG={45:CB:01:01:A5:01:01:CA:17:00:00:00:00:06:00:00:00:00:0F:00:00:00:00:E0:67:35:00:14:01:00:00:10:B5:03:01:02:FF:80:01:01:C9:03:03:0F:AB:5B:01:00:B2:04:E8:03:00:00:CF:02:02:08:B1:06:00:20:00:00:00:12:C2:02:00:C8}

line 32,去掉开头的#

1
NFA_DM_START_UP_CFG={45:CB:01:01:A5:01:01:CA:17:00:00:00:00:06:00:00:00:00:0F:00:00:00:00:E0:67:35:00:14:01:00:00:10:B5:03:01:03:FF:80:01:01:C9:03:03:0F:AB:5B:01:02:B2:04:E8:03:00:00:CF:02:02:08:B1:06:00:20:00:00:00:12:C2:02:01:88}

其实这两个配置文件中的注释写得非常清楚,这些配置也都是Google事先保留在这里的。不过,仔细阅读这两个文件的话,就会发现我这里修改的并不完整,还有部分UICC的配置并没有启用,但是这样的配置我用联通的NFC-SIM测试成功了。
附上我改好的两个文件:libnfc-brcm.conflibnfc-brcm-20791b05.conf
注意:如果是用改好的文件进行替换的话,记得修改文件的权限为 rw-r-r- (这个权限是这两个文件本来的缺省权限),也就是所有者可读可写,组可读,其他可读。如图:
由于Nexus 5缺省只在屏幕已经解锁的情况下启用NFC,当关屏或者是屏幕未解锁的情况下是刷不了公交卡的,如果需要在关屏或者屏幕未解锁的情况下刷卡的话需要修改系统里NfcNci.apk。我为了省点电,并没有做这个测试,具体的修改方法见下面的总结,有这个需求的可以尝试。
好了,这样就改好了,关闭NFC,重启之后再开启NFC,拿去公交地铁上测试吧。

总结

  1. Nexus 5, Android 4.4.4 (其它系统请自行对照上面的说明进行修改)
  2. root
  3. 备份/system/etc/libnfc-brcm.conf 和 /system/etc/libnfc-brcm-20791b05.conf
  4. 修改以上两个文件,或者将这两个文件替换为我修改好的:libnfc-brcm.conflibnfc-brcm-20791b05.conf
  5. 修改以上两个文件的权限为 rw-r-r- (上面有图示)
  6. 可选。如果只需要在屏幕解锁的情况下使用NFC,可跳过此步;如果需要在屏幕关闭或者未解锁的情况下使用NFC,请完成此步。
    6.1 备份/system/app/NfcNci.apk 和 /system/app/NfcNci.odex
    6.2 删除/system/app/NfcNci.odex
    6.3 下载NfcNci.apk,替换掉系统里的/system/app/NfcNci.apk
    6.4 修改/system/app/NfcNci.apk文件的权限为 rw-r-r-
  7. 关闭NFC,重启手机,打开NFC。

后记:昨天我按照上面所写的改好之后,跑到联通校园营业厅,要求给公交卡充值。然后我把手机放上去,卡机读出来余额为50,瞬间感觉自己萌萌哒~

后记2:2014-10-25,我外出坐公交,迫不及待地拿着手机,轻触刷卡机,滴….原来刷卡的声音也可以如此美妙~

最后,感谢论坛以及论坛中喜欢探索的朋友们。