NFC 与 Windows Phone 的那点事儿

说起NFC这个词儿应该已经不陌生了,在我们的生活中有很多使用场景都是使用的这项技术,例如公交卡,门禁,还有银联的闪付卡等等。并且近些年在移动设备上使用的场景也越来越多,例如 对 NFC TAG 的读写,对 NFC+蓝牙 耳机音响的支持,还有手机和手机之间的数据交换场景。

说起NFC这项技术其实也不算新奇了,许多手机都支持例如,Nokia、三星、SONY、HTC、小米都有机型硬件支持NFC的功能。在应用商店中搜索NFC也可以找到不少 NFC 相关的应用,但是目前来讲使用率还是个问题,不管怎样今天我还是想在这里为大家 分享一下在 Windows Phone 平台中对NFC功能的技术支持情况。对不对的请大家参考一下,多多提些意见。

从NFC在手机上支持的场景上看大致分为三种模式(点对点模式,主动模式,被动模式)

首先说一下点对点模式,点对点模式实际上就是在两台手机上都同时打开NFC后,将手机进行触碰(实现 Touch and Connect就是一个典型场景),通过NFC的数据交换,可以引导不同设备进行连接,例如应用和应用间的 Socket,蓝牙耳机、音响 (基于蓝牙配对)。这部分内容请参考我之前的文章 近场通信 NFC / Bluetooth Proximity

 

主动模式 (读/写 卡模式) 就是在移动设备中NFC模块产生射频场从外部采用相同标准的NFC标签中读写数据。这里面有一个典型的使用场景就是在Android手机上使用支付宝为公交卡充值。

image

或者从应用当中通过NFC读取银行卡的消费记录

image

以上两个场景都是属于主动模式,在 Windows Phone 生态系统中也不乏对NFC前景看好的朋友研究过此类功能。在 Windows Phone 8.0 SL 的框架下开发由于SDK的限制不能使用除了NDEN以外的通信格式。所以不能支持此功能,但是在现在的 Windows Universal 框架下 Windows Phone 8.1 可以通过Windows.Devices.SmartCards.SmartCardReader,Windows.Devices.Enumeration.DeviceInformation等SDK实现此功能,但是要有一点要注意的是和类似公交卡这样的NFC设备进行交互还需要手机硬件NFC芯片的支持,特需NXP PN547芯片 只要配置此种芯片的手机就可以实现 多种协议的NFC卡片交互例如:MIFARE Classic/Ultralight/DESfire 如果我没记错的话 公交卡是第一种。目前在Windows Phone 家族中使用此种芯片的设备有 (Lumia 830 & 73x)

这里我列举一个 Sample Code, 由于本人手上木有这新款设备暂时没有上手测试过,不过凭直觉看上去问题不大。(如果有测试设备或者有开发过Android类似应用的大牛,还请帮忙测试一下,很愿意和大家一起研究这部分功能)这里还有一个CodePlex上的开源项目用于介绍这部分功能:NFC Smart Card Reader PC/SC Library

 public async void TestNFC()
        {
            string selector = SmartCardReader.GetDeviceSelector();
            var deviceInfoCollection = await Windows.Devices.Enumeration.DeviceInformation.FindAllAsync(selector, null);
 
            if (deviceInfoCollection.Count != 0)
            {
                var scReader = await Windows.Devices.SmartCards.SmartCardReader.FromIdAsync(deviceInfoCollection[0].Id);
 
                scReader.CardAdded += async (s, c) =>
                    {
                        SmartCard sc = c.SmartCard;
                        SmartCardStatus scStatus = await sc.GetStatusAsync();
                        if (scStatus == SmartCardStatus.Ready) // This Check is not needed.
                        { 
                            SmartCardConnection scConn = await c.SmartCard.ConnectAsync();
                            scConn.TransmitAsync(/*APDU command*/); // You can send the command and receive the response from Device
                        }
                    };
            }
        }

被动模式(卡模拟 - Card Emulation),顾名思义就是将具备NFC功能的手机模拟成一张消费/会员/银行/等。卡片进行数据(花)交互(钱)。谈到跟钱相关的交互不得不提的一个名词就是 NFC- Secure Element 既: NFC–SE 这个SE我们可以简单的理解成是我们在网上消费时使用网银过程中让我们插入电脑USB接口中的U盾。 这里存有用户支付相关的安全信息,需要由单独的设备保存。目前在所有手机平台中做法分为三种:

第一种,独立存储芯片(全终端的解决方案 - Embedded),例如苹果设备(iP6 用户的指纹等安全信息是保存在独立的芯片当中),提供最高安全级别的权限,并且会开发部分SDK给 MO,银行,及开发者。

第二种,SWP(Single Wire Protocol - UICC)其中还有 eNFC、NFC-SIM 其实都是可以将安全信息写在 SIM 卡中,例如 现在中国移动有一种NFC-SIM卡就是这种解决方案,实现了公交卡刷卡乘坐地铁和公交的功能,其他三方应用需要和中国移动这样的运营商合作才能使用这类的 SE 进行消费验证。

第三种,NFC-SD 如果严格说NFC-SD 也是SWP的一种,为什么把它单独拿出来的原因是他与SIM的SE相比更为灵活。不会受到MO的制约,受到银行的认可(因为每个银行本来就是有自己的U盾么),但是 NFC –SD 的短板也非常明显,首先不是所有所有的手机都支持SD卡的SE,另外面对不同的消费的模拟需要更换不同的SD卡对于用户来说还是太挑战了,所以没有广泛的使用起来。

所以综上所述,手机内独立芯片的场景目前应该是 Apple 在尝试走的路,SWP(NFC-SIM)使用较为多的一种在Windows Phone 中同样也是支持的,对于NFC Emulation的开发内容就会牵扯到手机对UICC SE (Universal Integrated Circuit Card)的操作,这里需要开发者如果要完整SE的支付是需要和 运营商(MO) 的开发者一同完成整个购买流程,另外如果是MO自己的应用有些操作内容是需要MO权限才可以例如:更新部分SE内容。(这部分内容我暂时也没有试过,如果有MO开发者想做WP上的内容欢迎联系,我们一起研究探讨)微软对于如何申请MO权限以及如何UICC SE内容也有一个指导书大家可以参考一下。总的来说还是要申请权限建立信任证书,然后根据MO的信任机制进行开发流程:

参考:App development guide for UICC based NFC card emulation for Windows Phone 8.1

image

从实现场景上看目前中国移动以及和多家进行了合作例如

北京市政公交一卡通

image

银行的闪付

image

今天我在这里只是为大家介绍了一下NFC支付相关内容,在 Windows Phone 8.1 也是具备 读卡,刷卡,支付 等场景的,希望大家了解了这部分内容后可以结合自己好的想法做出更好的应用,相信今后是一定会迎来一个NFC时代的到来大家赶快行动起来吧:)

希望上的总结可以帮助到大家, 同时欢迎大家在这里和我沟通交流或者在新浪微博上 @王博_Nick