说起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手机上使用支付宝为公交卡充值。

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

以上两个场景都是属于主动模式,在 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 != )
{
var scReader = await Windows.Devices.SmartCards.SmartCardReader.FromIdAsync(deviceInfoCollection[].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

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

北京市政公交一卡通

银行的闪付

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

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

NFC 与 Windows Phone 的那点事儿的更多相关文章

  1. Windows系统版本号判定那些事儿

    v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...

  2. Windows系统版本判定那些事儿

    v:* { } o:* { } w:* { } .shape { }p.MsoNormal,li.MsoNormal,div.MsoNormal { margin: 0cm; margin-botto ...

  3. Windows系统版本判定那些事儿[转]

    Windows系统版本判定那些事儿 转自CSDN,原文链接,我比较不要脸, 全部给复制过来了 前言 本文并不是讨论Windows操作系统的版本来历和特点,也不是讨论为什么没有Win9,而是从程序员角度 ...

  4. 10#Windows注册表的那些事儿

    引言 用了多年的Windows系统,其实并没有对Windows系统进行过深入的了解,也正是由于Windows系统不用深入了解就可以简单上手所以才有这么多人去使用.笔者是做软件开发的,使用的基本都是Wi ...

  5. Windows系统版本判定那些事儿(有图,各种情况,很清楚)

    前言 本文并不是讨论Windows操作系统的版本来历和特点,也不是讨论为什么没有Win9,而是从程序员角度讨论下Windows获取系统版本的方法和遇到的一些问题.在Win8和Win10出来之后,在获取 ...

  6. 系统windows版本修改

    系统基本信息修改 系统windows版本修改 作者:韩梦飞沙 Author:han_meng_fei_sha 邮箱:313134555@qq.com E-mail: 313134555 @qq.com ...

  7. NTDLL未文档化函数RtlGetNtVersionNumbers获取操作系统版本

    作为新手,对获取操作系统版本号好奇过,因为曾经假象过一个场景:自己的程序在windows xp环境下编译,在windows 2003, windows 7,windows 8是否需要提权或者兼容处理, ...

  8. 从windows server 2003中学到的事儿

    2003让我学会了几件事儿, 第一.自己会装系统了. 第二.知道很多选项是可以自己进行设置的.这点很重要,本来xp用得很习惯,然后很多都理所当然得认为,就应该是那个样子,可是,并不是的. 在2003不 ...

  9. Windows读取NXP MiFare Ultralight C类型NFC卡片的信息

    1,读取 我们需要外接一个NFC Reader让Windows可以读取NFC卡片的内容. 因为特殊原因,我们选择了Sony rc-s380 NFC Reader.相关介绍 我们需要下载并安装NFC P ...

随机推荐

  1. C语言 栈 顺序结构 实现

    一个能够自动扩容的顺序结构的栈 ArrStack 实例 (GCC编译). /** * @brief C语言实现的顺序结构类型的栈 * @author wid * @date 2013-10-29 * ...

  2. windows下重启mysql

    其中第二种方法对我这无效,以后再搞清楚! 一.MYSQL服务 我的电脑——(右键)管理——服务与应用程序——服务——MYSQL——开启(停止.重启动) 二.命令行方式 Windows 1.点击“开始” ...

  3. Linux下通过NFS共享文件夹

    测试环境:CentOS 6.7 服务端 # yum -y install nfs-utils rpcbind # 开启服务 service nfs start service rpcbind star ...

  4. 无线客户端框架设计(5.1):将JSON映射为实体对象(iOS篇)

    iOS开发人员已经习惯于将JSON转换为字典或者数组来进行操作了,接下来我要做的事情,可能匪夷所思,但是,对WP和Android开发人员而言,他们更倾向于将JSON转换为实体对象进行操作. 我所设计的 ...

  5. Hibernate.initialize(Obj)用法

    导读:  在使用hibernate进行持久化时,有时需要动态的改变对象的加载,比如在编辑页面里面lazy=true,而在浏览页面lazy=false,这样可以在需要lazy的地方才进行控制.而配置文件 ...

  6. Atitit. 解压缩zip文件 的实现最佳实践 java c# .net php

    Atitit. 解压缩zip文件 的实现最佳实践 java c# .net php 1. Jdk zip 跟apache ant zip 1 2. Apache Ant包进行ZIP文件压缩,upzip ...

  7. paip.Log4j配置不起作用的解决

    paip.Log4j配置不起作用的解决 1.jar包里的log4j配置 看累挂jar,真的有个" webservices-rt.jar\com\sun\org\apache\xml\inte ...

  8. javascript实例——时间日期篇(包含5个实例)

    本来想在网上找一些js实例来练练手,结果发现一本书<突破JavaScript编程实例五十讲>,看了下内容还不错,就下了下来: 后面又下了该书籍的源码,一看才发现这本书编的日期是2002年的 ...

  9. [ZT]Language codes – MFC

    Below is table with all MFC language codes. I think it can be sometimes very useful.  First column c ...

  10. cocos2d-x 2.x版本接入bugly的总结

    最开始项目使用的是自己DIY的很简陋的上报系统,后来改成google breakpad来上报,发现其实都做的不太理想,游戏引擎因为版本历史问题存在一些崩溃问题.后来3.x接入了bugly,我这边抽了几 ...