2013年1月28日星期一

Linux VPS中可靠的vagex挂机赚钱项目



现在章郎虫有两个vps,一个84主机,另外一个是yardvps的。两个vps的主机内存都是512,总体感觉上性能是yardvps强大些,但唯一缺点就是网络不稳定。所以yardvps这个vps主机基本就是空闲着的。每个月又都要交钱,觉得有些浪费了。所以章郎虫在网上找比较可靠且收益稳定的挂机项目,最后选择了vagex。虽然每个月挂机得的钱不多,但也可以补一下月费。反正空着也是空着的,而且512的vps挂机后内存还剩100M多,流量小的站点访问也完全没有问题。Vagex 是一家提供Youtube浏览次数的公司,只要使用它提供的软件(win平台和firefox插件,支持linux),就可以挂机赚取点数。点数就用来换美金,每天有一个波动的兑换汇率。做的越久,同样的点数可以兑换的美金就越多。经过博主测试,真实可用。

如果你的vps是在国内,那下面就可以略过了。当然,如果你有很多空着的电脑,也可以设置翻墙代理来实现挂机赚钱。不过如果算上电费等其他费用,这种赚钱方式可能有些得不偿失,除非你很无聊。。。
第一步:注册一个账号点击这里注册–>,打开这个网站后点击“Sign Up”。注册很简单,按照提示就可以了。登录后每个账号有一个独一的id号,如“Your User Account ID: #XXXXXX”。
第二步:安装客户端
如果你的vps是windows系统,那么配置就比较简单。先下载挂机客户端,下载地址:http://vagex.com/Vagex.zip,解压缩后运行vagex程序。输入你的id号,点击watch就可以挂机了。
如果你的vps是linux系统,那么你可能需要接着看下面介绍了。
第三步:linux系统中安装远程桌面。这里章郎虫推荐Xfce+VNC,省内存。我在以前的博客中介绍过怎么安装,具体可以参考《在CentOS中搭建远程桌面管理:xfce+VNC》。
第四步:安装后远程登录linux桌面,安装火狐浏览器的flash插件。
第五步:flash插件安装成功后打开浏览器,进入vagex网站,用第一步注册的账号登陆。点击左上角“Earn Free Credits”后可以看到这里有windows挂机、Firefox挂机和Android挂机三种挂机方式。Windows挂机在本文第二步中已经介绍过,这里第二种选择安装火狐插件,如图:
插件安装完后,在如下框中输入id号保存。重启Firefox,下一次打开浏览器时,youtube已经可以自动打开并浏览了。
第六步:全自动挂机优化
以上五步中我们已经把挂机账号注册和设置都已经介绍完了,但挂机时间长了之后可能会出现vagex不记点数了。这里章郎虫结合linux计划任务对挂机进行了下优化。
a.linux重启后自动启动firefox浏览器 ;
1、登录linux桌面,点击左下角小老鼠一样的图标,然后选择settings–>autostarted applications
2、点击add,在name和command中输入firefox,点击ok保存。
设置后重启vps看看,是不是可以看到firefox也一起启动了呢?
b.linux主机每天自动重启 ;

瞻博预计NFC支付总额于2017年超过1800亿美元



根据瞻博研究公司最新的预测报告显示,全球通过NFC手机支付的交易额将于2017年突破1800亿美元。

当NFC技术标准逐步规范并确立,NFC手机迅速普及后,越来越多的用户将使用NFC技术进行店内支付以及交通票购买。

美国和西欧的NFC移动支付运营商以及零售行业巨头认为,2012年到2017年这段时间,基于NFC技术的店内手机支付服务将得到迅速普及,将NFC集成于POS终端实现的”刷机支付”对用户具有很大的吸引力。

不过瞻博这份报告也警告说,NFC支付是集移动、金融、零售、交通等各项技术于一体的复杂体系,NFC服务必须部署一个完全集成的、完整的、安全的客户服务通道。建立这样一套体系需要相关行业的配合甚至需要政府的参与。

“NFC技术正在逐步改变公众的意识及消费习惯,我们预计从2012年起NFC市场将开始迅速的扩展。” 瞻博的温莎霍顿博士如是说。

英国O2手机钱包发布,支持NFC手机支付




英国O2移动运营商(在英国的地位类似中国的移动)于今天(4月27日)正式推出了手机支付钱包-O2钱包。今天就来介绍下这款主打欧洲市场的手机支付应用。



O2手机钱包概况
O2手机钱包提供了诸如信用卡转账,向他人借款、还款,便捷手机购物等服务,还能方便用户管理自己的银行账户并提供一系列的理财服务。O2手机钱包在兼容性方面也做的不错,除了支持主流的Iphone、Android、黑莓等智能手机外,非智能手机也能使用其部分功能-如手机理财功能,只要用户的手机支持网页浏览即可。

O2手机钱包的安全性也非常不错,钱包除了常规的PIN码和密码外,O2将所有与银行账户相关的数据全部存储在专门的服务器上而不是存储在手机终端。同时,钱包内可支付的金额也采用了预充值的形式,这样就保证了用户在手机及密码一并被盗的极端情况下也不会遭受很大的损失。

O2手机钱包具体功能
O2钱包目前包含如下几大功能:

1、银行转账功能

O2钱包的用户能够通过向绑定了手机号的任意银行账户进行转账,只要输入对方的手机号验证发送即可,每日转账的上限为500英镑。

2、线上比价购物

O2钱包还自带一个手机购物引擎,用户能够对网上的上百家商家成千上万的商品进行比价,类似国内的一淘。同时O2钱包还集成了商家优惠券、折扣等额外服务。用户在选定商品和优惠后即可直接进行手机支付,非常的方便。

3、线下到店购买

除了线上购物外,O2手机钱包还支持线下到店购买。O2钱包的用户可在3万家合作的商店挑选完商品后直接用手机支付购买。O2钱包支持最新的NFC近场通信技术,具有NFC功能的手机只要轻轻一碰NFC支付终端即可完成支付。当然,O2钱包也支付普通的二维码支付。

4、手机理财功能

用户在O2钱包上能够随时查看线上和线下的消费记录及账户余额,同时也能查看已绑定的信用卡上的所有账户信息,具备移动银行的所有功能。O2钱包用户还会免费获得一张虚拟现金卡用来管理手机钱包上的金额。而拥有虚拟卡的你就能够在线上和线下购物付款,甚至能够去合作的POS机直接提现。

英国O2移动通信公司发布O2手机钱包的目的很简单,就是通过此款产品在移动支付领域站住脚跟。未来O2手机钱包将会与更多的企业进行合作以增加更多的便民应用如购买机票、在线支付观看视频等等。

标签:O2钱包, 手机

五件关于NFC手机钱包你需要知道的事情



使用NFC手机支付对消费者来说是快捷和方便的,但该技术仍面临着一些重大的安全问题.

1. NFC很便宜而且使用便捷

近场通信是一种短距离无线传输技术,他能让智能手机进行连接、接收和传输数据。NFC的巨大潜力是在移动支付,他非常方便而且节约成本,因此他们对用户和公司都是有吸引力的。 Gartner的分析师桑迪·沈说,NFC有无比广阔的前景,因为“他支持任何需要的数据传输和认证的服务。”

2. NFC普及似乎不可避免

Altimeter集团的分析师克里斯·席尔瓦说,NFC无疑是智能手机的下一步。未来他会像WIFI/蓝牙、扩展卡一样成为智能手机的标配。不过目前他仍然需要更多设备的支持,包括支持其支付使用的技术和更多采用该项技术的商户。如今,智能手机用户占整个移动市场的比例还低于50%,苹果和大部分Android手机还没有提供的NFC,不过预计今后都将配备。

3.对于企业来说这是一个烫手山芋

目前在欧美地区,信用卡公司和手机供应商都在争论到底由谁来处理帐单。“如果你通过手机购买了一杯咖啡,到底由谁来负责收单?” 供应商和信用卡公司之间的计费协议引起的冲突。同时企业需要制定因为设备原因导致支付失败的赔偿责任。

4.日本NFC普及率最高

NFC海外发展较快。甚至在欧洲和美国以外的地区发展同样迅速。 例如,在日本,人们使用名为FeliCa的服务,用自己的手机进行NFC形式的支付,并购买相关产品。研究公司的分析师托马斯·胡森指出,NFC在日本发展迅猛,原因在于当地移动运营商向消费者提供NFC手机支付的折扣服务。

5. 潜在的安全风险

人们丢失了手机该怎么办?这是NFC手机支付最大的安全隐患。同时也是消费者采用NFC技术的一大障碍。

从O2O出发谈谈手机支付以及NFC技术



最近o2o之路写了比较多的nfc应用相关的文章,不过对于什么是nfc技术,nfc有什么作用,o2o与nfc之间有什么联系,大家可能还不怎么清楚,今天小编就来答疑解惑一下。

o2o模式除了需要规范的市场、强大的线下资源外,如何流畅的打通线上线下环节尤其是商家结算环节是o2o非常重要的一环。而结算过程中最重要的就是支付实现。手机支付作为继信用卡支付和网络PC端支付之后最便捷的支付方式俨然已成为未来几年支付领域的新宠。而NFC作为一种安全便捷的近场通信技术自然而然的成为了手机支付领域的宠儿。



其实手机支付还有诸如WAP、SMS等形式的支付方式。不过出于安全性和便捷性考虑,这些均会被基于安全芯片的硬件型支付方案所代替。而目前主流的基于芯片的手机支付技术有3个,即RFSIM、SIMPASS以及NFC。

RFSIM是目前中国移动主推的手机支付技术,全称射频识别SIM卡,通过在手机SIM卡中集成近场支付芯片来实现手机支付。其优点在于可识别距离比较远(5-10m),无需更换手机,不过缺点也比较明显。首先是不能运行JAVA card,这对于运行目前主要以java环境开发的应用程序无疑是致命的。另外一点是POS机改装难度大(需要调整POS机功率),与最主要的支付终端对接很成问题。

而SIMPASS是较早的手机支付技术,俗称双面SIM卡。拥有此技术的SIM卡一面是常规SIM芯片,另一面是用于支付处理的CPU芯片。其优点是使用过程与一般SIM一样,缺点是需要改造手机,但偏偏该方案没有获得手机制造商的支持,因此此方案是3大技术方案里最冷门的。

NFC同RFSIM一样脱胎于RFID技术,是由飞利浦公司发起并联合nokia、sony等巨头主推的一种新的近场通信技术。NFC技术能够在近距离与相关设备进行对接和数据交换,其优点有很多,如安全性高,独立于SIM卡,可以无源使用,程序兼容性好(eclipse已经推出了NFC程序开发插件NDEF),支持的大厂商多等等,是目前中国银联主推的手机支付技术。当然缺点也有,主要是需要普及全新的NFC芯片手机,不过由于三星、诺基亚、苹果等大的手机制造商都在积极推出具备NFC功能的手机,普及只是一个时间问题。当然如果普及缓慢的话还有与SIM卡集成这一折中的方案(如采用SWP接口规范),因此采用NFC技术标准是未来手机支付领域必然的趋势。

当然NFC与O2O的关系还不止手机支付这一项,NFC还能实现许多符合O2O模式的有用的功能。比如用NFC实现移动超市,nfc提供定制服务,NFC提升超市购物体验等等,具体的应用还有很多,o2o之路会陆续为您介绍。

NFC支付的困局



最近有传言称谷歌正准备放弃基于NFC支付的谷歌钱包,虽然说放弃还为之过早,但从另一个侧面也反映了目前NFC支付的困局。今天o2o之路就试着来分析下NFC支付技术陷入困局的原因。

NFC是手机支付技术的一种,用户购物、吃饭、乘坐交通工具,均可通过此项技术轻松实现支付。虽然NFC的便捷性和安全性让其在非接触支付领域拥有很大的优势,但谷歌钱包的境遇又一次证明了任何技术的商业化并不仅仅是有优势就行。

NFC支付的困局主要原因在于整个支付环节涉及了电信运营商、手机制造商、银行金融机构以及线下商户,每一环节都是各自领域的巨头,利益协调非常的困难。由于NFC可以无需绑定SIM实现支付,银行机构可以通过此项技术涉足电信领域。反之,电信运营商也可以通过手机支付进入金融领域。每一领域的巨头都想在这个潜力巨大的未来领域占据主导地位,可以说,NFC支付从来不是技术问题,而是利益协调问题。

政治因素也是一大原因,由于牵涉的领域太广,参与的巨头太多,单靠市场自发的协调进展会非常的缓慢,加速NFC普及的最有效方案就是政府参与,各领域巨头也清楚这一点,以寡头为背景的两党制美国在这一方面的斗争自然会非常激烈。国内则更为复杂,除了巨头角逐外,政策的滞后和相关法律的不完善也导致各方利益难以协调或者说无从入手进行协调。

有人说,NFC难以推广的原因在于并没有给消费者带来实质性的价值。实际上,NFC的便捷性就是最明显,最具实质性的价值。现代科技的迅猛发展一大部分原因就是由于人类天生的惰性,汽车、飞机、计算机、手机的出现都是因为能给人类带来极大的便利。因此,NFC的价值毋庸置疑,欠缺的是一个足够充分的实例来体现其价值。

也有人说,NFC支付的安全性是限制其发展的主因。安全性的确是手机支付的关键因素,这个因素分为2方面,即技术的安全性和民众意识的安全性。在技术安全性方面NFC反而具有很大优势,而且其安全性是禁得住实战考验的。在日本,使用NFC手机刷卡是家常便饭的事,而且似乎日本这个国家的民众很喜欢“刷机”,无论购物、吃饭、看广告都要”刷上一刷”。是的,他们现在连看个广告都要刷一下…

而民众意识的安全性问题我们可以用网银来做参考。在中国,目前仍有很大一部分人对使用网银进行网购缺乏安全感,每年也依然有成千上万的新人加入到网购队伍当中,中国网购发展了十几年才有了目前的规模。跟让民众信任网银并使用一样,让民众信任手机支付并习惯使用它也是一个循序渐进的过程,也需要一段很长的时间,不过这并不影响手机支付成为支付领域的新宠。

综上所述,NFC技术目前的困境主要还是利益的角逐,其技术本身并不是制约其发展的因素。NFC未来的发展前景还是要看各国政府在手机支付领域的动向以及相关政策支持。

NFC技术常见5大安全问题分析



同其他信息技术一样,NFC技术的出现为我们开发新的应用提供了很多可能性,但同时也面临各种各样的安全问题。本文将介绍并分析NFC系统常见的5大安全问题。

1、窃听

窃听是指在NFC链路层通讯不加密的情况下,如果我们不在链路层之上做一些加密处理,攻击者很容易偷听到我们传输的内容,这样攻击者可以轻易地获得NFC标签中的信息,所以利用标签来传输敏感数据是极度不安全的。由此引发另一个问题是我们随身携带的标签或智能卡的ID号是唯一的,攻击者只需要一个隐藏的读卡器就可以不断获取ID号从而确定我们的位置。同时假设这个标签是存在于我们身份证或护照中,那么攻击者甚至可以盗用我们的隐私。

NFC的优势是两个通信设备之间的距离很短(10cm范围内)。前文说NFC是一种轻松、安全、迅速而自动的私密通信,但在实际应用中仍需要依据大量的因素对通信范围内的设备进行检测,来识别是否存在攻击者。

2、数据损坏

数据损坏是指攻击者通过干扰交易数据而造成它的损坏。通过与原服务器的备份信息对比来检测损坏,但是如果它做磁盘操作系统拒绝服务的攻击,将会导致整个NFC应用服务系统无法提供服务,例如一个买票系统,检索信息系统,支付应用等。在这种情况下,NFC终端设备将会失去作用,或者被攻击者误导发生错误交易,造成损失。

3、数据篡改

由于在链路层或其他各层缺少安全保护,攻击者可以随意修改我们的数据。当一个NFC读卡器正在读一个被动标签内容,这时修改数据就是一种攻击。阻止这种攻击的方法是在没有正确写权限的情况下,逻辑上不能进行数据修改;另一个方法就是让该NFC标签只读。但事实上对标签的身份若不能有效的识别,攻击者还可以通过一些方法来修改标签数据。

4、克隆

克隆是根据有效NFC标签的内容复制一张一模一样的新标签。由于很多标签设置了逻辑保护不让全部的数据被读到,这样想要得到一个正确的标签是很难的。故攻击者对克隆标签兴趣不大,但是我们仍不能在一个标签中放置太多可信信息。以超市利用标签支付商品为例,克隆卡的存在意味着它拥有和该超市有效标签一样的外观,一样的权限,一样的数据。这种情况下,如果某些商品的标签不小心脱落,攻击者可以将自己的克隆标签贴上去,顾客将支付修改后的标签。解决这个问题的方法是针对不提供读保护的卡或一个存在已知攻击的卡可以通过设置后台黑名单来识别克隆卡。

5、网络钓鱼

网络钓鱼是指攻击者伪装成某个真实机构,向顾客发送欺骗性垃圾邮件或Web网址,从而诱导顾客给出自己的敏感信息,例如用户名、密码、身份证信息、银行卡信息等。如果一个智能海报标签被修改,用户将会被蒙蔽而浏览一个看起来相似而有恶意导向的网页,例如一个智能海报通过点击订票网页来初始化车票的预定。该网址前台是车票预定系统,后台可能是一个个人转账应用,用户被其表面信息所欺骗而无法识别,造成财产损失。另外,如果用户的手机界面上出现类似网络钓鱼的错误或缺陷同样会误导用户。

手机支付之近场脱机支付


近场脱机支付是手机支付技术中比较热门的一个模式,与o2o相关的手机应用许多都使用的是此类支付模式。该模式主要利用了智能卡脱机交易技术,关键是移动支付与终端的结合。目前整个近场脱机交易中,主要技术创新集中于:卡片、移动终端、近场交互通信技术、受理终端。相关参与方的关系如图1所示。



一、卡账户

由于卡账户可能属于银行、运营商,也可能属于第三方支付机构,因此在卡片介质上和功能选择上,有着一定的重复性,也有一定的特性要求,需要在技术上进行满足:

1、 账户载体的安全要求

作为金融支付账户及支付应用的安全载体,要求其符合国际CC EAL4+认证和EMVCO认证。该类芯片应具备如下的安全特性:加密的存储空间、抗SPA/DPA攻击、抗SEMA/DEMA攻击、抗时序攻击、有源屏蔽层、总线加密、高低电压传感器、高低频率传感器、光照传感器、真随机数发生器、硬件3DES/RSA/ECC协处理器等。

2、账户载体的封装和表现形式

智能卡芯片可以封装进多种形式的介质中。但与移动支付结合,安全芯片存在的方式主要依赖移动终端的支持能力,目前主流的形式有:

(1)全终端,直接固化在手机芯片中,或存放在独立的卡片槽。

(2)智能SD卡,存放在移动终端的SD卡槽。

(3)SIM卡模式,复用SIM卡的功能。

(4)终端附件,如通过音频口或者USB口与移动终端结合。

不管是哪种存在形式,都应采用成熟、可靠的硬件封装技术,从而无法拆解出安全芯片直接访问,也无法通过逻辑分析仪器探测安全芯片的通信,保证支付账户的安全。

3、卡片内容管理

基于智能卡的移动支付,一个最大的特点就是可以支持“多应用”,即一张智能卡里面能够加载和运行多个与支付相关的应用,来满足用户多方面的需求,真正地方便用户。为了达到这个目的,国内外越来越多的企业正在建设和运营开放的可信服务管理(Trusted ServiceManagement,TSM)平台,力争向更多的用户提供透明的、可交叉的TSM服务,从而实现用户群体和服务内容的最大化共享。其主要服务包括:

(1)负责应用的管理和应用生命周期管理,如远程应用下载、个人化和更新等操作。

(2)负责智能卡管理和智能卡生命周期管理,如远程锁卡及销卡。

(3)应用的合法性和安全性验证和检查。可以预见,中国未来的TSM生态环境一定是一个市场化、多元化、个性化,不断创新、不断发展变化的环境。

二、 移动终端

理论上讲,在脱机支付交易中,移动终端也是载体,只要具备NFC/蓝牙/RFID等近场通信功能,即可交易,与终端的操作系统无关。但从用户的便利性角度来看,移动终端最好能协助用户实现常见的功能,如余额查询、历史交易查询、圈存等功能。在支持脱机支持的移动终端方面,技术演进将在两个方面:

1、近场通信技术,把对近场通信(Near Field Communication,NFC)的支持做得更完美。

2、卡片管理技术,安全的对卡片的读写,逐步丰富终端对卡片的控制力,提供内容丰富、操作方便的人机交互界面。

三、近场通信交互方式

移动支付的近场通信方式选择主要取决于两个关键需求:速度、安全。尽管借助于移动终端,智能卡可以通过多种方式基于2.4G技术的无线传输协议(如蓝牙、RFID等)与外部进行交互,但基于13.56MHZ的NFC技术由于识别快、交易符合安全距离等特征,已经成为脱机交易的主流选择。
目前国际国内金融支付体系普遍采用基于13.56MHz国际标准的非接触式近场通信技术,基于这个工作频率已有比较成熟、完备的国际国内技术标准,并在电子支付领域得到了广泛应用。

四、 受理终端

受理终端相对来说,关键技术要求主要有:受理的性能,如NFC接受能力,支持各种多应用等。目前部分应用建立在智能卡上,使用时需要终端的支持,因此受理终端支持特殊应用也是关键。如部分受理终端存在计价、计算优惠折扣等功能。与云技术的结合,由于业务内容更新较快,根据受理终端的理念,这种业务处理逻辑可以通过云端实现,从而减轻终端的压力。

NFC相关技术及手机架构分析



 
一、NFC手机硬件架构

实现NFC功能的手机终端硬件架构至少包含NFC控制器、安全模块、天线、应用处理器等模块。

1、控制器(NFCControUer):NFC控制器集成在终端的主板上,负责将数字信号转换为射频信号,并通过13.56MHz天线发送;同时负责接收射频信号,并将其转为数字信号,与终端应用处理器和安全模块进行通信。

2安全模块:用于存储用户的敏感数据(如密钥、余额等)和卡模拟模式下相关的NFC应用,通过NFC控制器与外界读写设备进行通信,实现数据存储及交易过程的安全性。

3天线:集成在终端内部,与NFC控制器相连接,实现13.56M射频信号的发射与接收。

4应用处理器:NFC终端的主控模块,实现对NFC控制器的控制和操作及与SIM卡间的数据交互。应用处理器中运行NFC协议栈软件及各种应用程序,实现NFC应用的处理与展现。

二、NFC手机软件架构

NFC手机软件架构是由NFC的协议栈、NFCAPI及应用组成。

1、NFC协议栈

实现NFC相关协议的分析处理。包括硬件抽象层(HAL),操作系统抽象层(OSAL),传输控制层(TCL)和NFC核心功能(NFCCore)。

硬件抽象层(HAL):对不同的硬件接口进行抽象封装,并向上层提供统一的接口。

操作系统抽象层(OSAL):对不同平台的05资源进行抽象封装,并向整个协议栈提供统一的接口,如内存管理、消息处理等。

传输控制层(TCL):架构于HAL硬件抽象层之上,包括逻辑链路控制、数据传输等功能。

NFC核心功能(NFCCore):实现NFC核心协议,并向上层提供统一的接口。包括格式分析处理,发现注册机制等。

2、NFCAPI

根据不同的操作系统及中间件,向上层应用提供接口。在JAVA虚拟机上使用JSR257及相应扩展,在Android操作系统上使用Andro记NFCAPI及相应扩展。

3、NFC应用

NFC终端应用,包括卡模拟应用,读写器应用,点对点应用三种工作模式。

卡模式:是指用于非接触移动支付,如商场、交通等应用中,用户只需要将手机靠近读卡器,然后用户只需输入密码确认交易或者直接接收交易即可。例如门禁管制,车票,门票等等。这种方式下,卡片通过非接触读卡器的即域来供电,即便是手机没电也可以工作。卡模式如

读卡器模式:即作为非接触读卡器使用,比如从海报或者展览信息电子标签上读取相关信息

点对点模式:即实现无线数据交换,将两个具备NFC功能的设备链接,能实现数据点对点传输,如下载音乐,交换图片或者同步设备地址薄。因此多个设备比如数字相机、PDA、计算机及手机之间都可以通过NFC来无线连通,交换资料或者服务。

工作模式中的通信模式分为了主动模式和被动模式。卡模式是主动模式,读卡器模式是被动模式。

三、NFC与手机的结合方式

1、与手机SIM卡结合

NFC可以说是手机内SIM(subseriberIdentityModule)卡的另一个延伸介面,SIM卡本体性质上是一种接触性的智能卡且仅与手机接触连接,而NFC技术却让SIM卡从原有的接触介面再延伸出另一个非接触的无线感应介面。但是这个技术涉及到与不同的SIM卡运营商标准化的问题。

2、硬件NFC芯片

直接将NFC芯片焊接在手机主板上,成本低,不涉及统一标准的问题。

Android NFC 开发教程概述(转载)



Near  Field Communication (NFC) 为一短距离无线通信技术,通常有效通讯距离为4厘米以内。NFC工作频率为13.65 兆赫兹,通信速率为106 kbit/秒到 848kbit/秒。
NFC通信总是由一个发起者(initiator)和一个接受者(target)组成。通常initiator 主动发送电磁场(RF)可以为被动式接受者(passive target)提供电源。其工作的基本原理和收音机类似。正是由于被动式接受者可以通过发起者提供电源,因此target 可以有非常简单的形式,比如标签,卡,sticker 的形式。
NFC 也支持点到点的通信(peer to peer) 此时参与通信的双方都有电源支持。
和其它无线通信方式如Bluetooth相比,NFC 支持的通信带宽和距离要小的多,但是它成本低,如价格标签可能只有几分钱,也不需要配对,搜寻设备等,通信双方可以在靠近的瞬间完成交互。
在Android NFC 应用中,Android手机通常是作为通信中的发起者,也就是作为NFC 的读写器。Android手机也可以模拟作为NFC通信的接受者且从Android 2.3.3起也支持P2P通信。
Android对NFC的支持主要在 android.nfc 和android.nfc.tech 两个包中。
android.nfc 包中主要类如下:

NfcManager 可以用来管理Android设备中指出的所有NFC Adapter,但由于大部分Android设备只支持一个NFC Adapter,可以直接使用getDefaultAapater 来获取系统支持的Adapter。
NfcAdapter 为一NFC Adapter 对象,可以用来定义一个Intent使系统在检测到NFC Tag时通知你定义的Activity,并提供用来注册forground tag 消息发送的方法等。
NdefMessage 和NdefRecord NDEF 为NFC forum 定义的数据格式。


Tag 代表一个被动式Tag对象,可以代表一个标签,卡片,钥匙扣等。当Android设备检测到一个Tag时,会创建一个Tag对象,将其放在Intent对象,然后发送到相应的Activity。

android.nfc.tech 中则定义了可以对Tag进行的读写操作的类,这些类按照其使用的技术类型可以分成不同的类如:NfcA, NfcB, NfcF,以及MifareClassic 等。
常见的Tag为Mifare ,后面的例子将以这种Tag 为例介绍NFC读写方法。

本例参考ApiDemos中NFC的ForegoundDispatch来介绍编写Android NFC 的基本步骤,因为手边只有MifareClassic 类型的Tag ,需要对ForegoundDispatch的代码做些修改来检测MifareClassic 的类型的NFC Tag,读写其他类型的NFC Tag的基本步骤是一致的。

1.  在Android manifest 文件中申明和NFC相关的权限和功能选项:
权限申明:
<uses-permission android:name=”android.permission.NFC” />
最低版本要求,NFC是指Android2.3 (Level 10) 才开始支持的,因此最低版本要求必须指定为10.
<uses-sdk android:minSdkVersion=”10″/>
如果需要在Android Market上发布,需要指定手机支持NFC 功能。
<uses-feature android:name=”android.hardware.nfc” android:required=”true” />
为Activity申明它支持处理NFC Tag
比如我们的示例Activity 在Manifest 的申明如下:

<activity android:name=”.NFCDemoActivity”
android:label=”@string/app_name”
android:launchMode=”singleTop”>
<intent-filter>
<action android:name=”android.intent.action.MAIN” />
<category android:name=”android.intent.category.LAUNCHER” />
</intent-filter>
<intent-filter>
<action android:name=”android.nfc.action.NDEF_DISCOVERED”/>
<data android:mimeType=”text/plain” />
</intent-filter>
<intent-filter>
<action
android:name=”android.nfc.action.TAG_DISCOVERED”
>
</action>
<category
android:name=”android.intent.category.DEFAULT”
>
</category>
</intent-filter>
<!– Add a technology filter –>
<intent-filter>
<action android:name=”android.nfc.action.TECH_DISCOVERED” />
</intent-filter>
 
<meta-data android:name=”android.nfc.action.TECH_DISCOVERED”
android:resource=”@xml/filter_nfc”
/>
 
</activity>



三种Activity NDEF_DISCOVERED ,TECH_DISCOVERED,TAG_DISCOVERED 指明的先后顺序非常重要, 当Android设备检测到有NFC Tag靠近时,会根据Action申明的顺序给对应的Activity 发送含NFC消息的 Intent.

2. Android NFC 消息发送机制
当Android设备检测到有NFC Tag时,理想的行为是触发最合适的Activity来处理检测到的Tag,这是因为NFC通常是在非常近的距离才起作用(<4m) ,如果此时需要用户来选择合适的应用来处理Tag,很容易断开与Tag之间的通信。因此你需要选择合适的Intent filter 只处理你想读写的Tag类型。

Android系统支持两种NFC消息发送机制:Intent 发送机制和前台Activity 消息发送机制。

Intent 发送机制 当系统检测到Tag时,Android系统提供manifest 中定义的Intent filter 来选择合适的Activity来处理对应的Tag,当有多个Activity可以处理对应的Tag类型时,则会显示Activity选择窗口由用户选择:



前台Activity 消息发送机制 允许一个在前台运行的Activity在读写NFC Tag 具有优先权,此时如果Android检测到有NFC  Tag ,如果前台允许的Activity可以处理该种类型的Tag则该Activity具有优先权,而不出现Activity 选择窗口。

这两种方法基本上都是使用Intent-filter 来指明Activity可以处理的Tag类型,一个是使用Android的Manifest 来说明,一个是通过代码来申明。
下图显示当Android检测到Tag,消息发送的优先级:




本例 NFCDemoActivity 支持两种NFC消息发送机制,上面的XML指明了Intent 消息发送机制,其中
<meta-data android:name=”android.nfc.action.TECH_DISCOVERED”
android:resource=”@xml/filter_nfc”/>
的filter_nfc 指明了支持处理的NFC Tag类型,filter_nfc.xml 定义如下:

<resources xmlns:xliff=”urn:oasis:names:tc:xliff:document:1.2″>
<!– capture anything using NfcF –>
<tech-list>
<tech>android.nfc.tech.NfcA</tech>
<tech>android.nfc.tech.MifareClassic</tech>
<tech>android.nfc.tech.MifareUltralight</tech>
 
</tech-list>
 
</resources>


因为我只有MifareClassic 类型的Tag,所以只定义了MifareClassic相关的Tag类型,如果你可以处理所有Android支持的NFC类型,可以定义为:

<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<tech-list>
<tech>android.nfc.tech.IsoDep</tech>
<tech>android.nfc.tech.NfcA</tech>
<tech>android.nfc.tech.NfcB</tech>
<tech>android.nfc.tech.NfcF</tech>
<tech>android.nfc.tech.NfcV</tech>
<tech>android.nfc.tech.Ndef</tech>
<tech>android.nfc.tech.NdefFormatable</tech>
<tech>android.nfc.tech.MifareClassic</tech>
<tech>android.nfc.tech.MifareUltralight</tech>
</tech-list>
</resources>



有了这个Manifest中的申明,当Android检测到有Tag时,会显示Activity选择窗口,如上图中的Reading Example。
当NFCDemoActiviy在前台运行时,我们希望只有它来处理Mifare 类型的Tag,此时可以使用前台消息发送机制,下面的代码基本和ApiDemos中的NFC示例类似:

public class NFCDemoActivity extends Activity { 
private NfcAdapter mAdapter; 
private PendingIntent mPendingIntent; 
private IntentFilter[] mFilters; 
private String[][] mTechLists; 
private TextView mText; 
private int mCount = 0; 
 
@Override
public void onCreate(Bundle savedState) { 
super.onCreate(savedState); 
 
setContentView(R.layout.foreground_dispatch); 
mText = (TextView) findViewById(R.id.text); 
mText.setText("Scan a tag"); 
 
mAdapter = NfcAdapter.getDefaultAdapter(this); 
 
// Create a generic PendingIntent that will be deliver 
// to this activity. The NFC stack 
// will fill in the intent with the details of the 
//discovered tag before delivering to 
// this activity. 
mPendingIntent = PendingIntent.getActivity(this, 0, 
new Intent(this, 
getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0); 
 
// Setup an intent filter for all MIME based dispatches 
IntentFilter ndef 
= new IntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED); 
try { 
ndef.addDataType("*/*"); 
} catch (MalformedMimeTypeException e) { 
throw new RuntimeException("fail", e); 
mFilters = new IntentFilter[] { 
ndef, 
}; 
 
// Setup a tech list for all MifareClassic tags 
mTechLists 
= new String[][] { new String[] { MifareClassic.class.getName() } }; 
 
@Override
public void onResume() { 
super.onResume(); 
mAdapter.enableForegroundDispatch(this, 
mPendingIntent, mFilters, mTechLists); 
 
@Override
public void onNewIntent(Intent intent) { 
Log.i("Foreground dispatch", 
"Discovered tag with intent: " + intent); 
mText.setText("Discovered tag " + 
++mCount + " with intent: " + intent); 
 
@Override
public void onPause() { 
super.onPause(); 
mAdapter.disableForegroundDispatch(this); 
}



只改了一行,将处理NfcF类型的Tag 改为处理MifareClassic 类型的NFC Tag。
mTechLists = new String[][] { new String[] { MifareClassic.class.getName() } };
运行该示例,每靠近一次Tag,计数加1。


前面例子介绍了检测,读写NFC TAG开发的一般步骤,本例针对常用的Mifare Tag 具体说明。

Mifare Tag 可以有1K ,2K, 4K,其内存分区大同小异,下图给出了1K字节容量的Tag的内存分布:


数据分为16个区(Sector) ,每个区有4个块(Block) ,每个块可以存放16字节的数据,其大小为16 X 4 X 16 =1024 bytes
每个区最后一个块称为Trailer ,主要用来存放读写该区Block数据的Key ,可以有A,B两个Key,每个Key 长度为6个字节,缺省的Key值一般为全FF或是0. 由 MifareClassic.KEY_DEFAULT 定义。
因此读写Mifare Tag 首先需要有正确的Key值(起到保护的作用),如果鉴权成功
auth = mfc.authenticateSectorWithKeyA(j,
MifareClassic.KEY_DEFAULT);
然后才可以读写该区数据。

本例定义几个Mifare相关的类 MifareClassCard ,MifareSector, MifareBlock 和MifareKey 以方便读写Mifare Tag.
Android 系统来检测到NFC Tag, 将其封装成Tag类,存放到Intent的NfcAdapter.EXTRA_TAG Extra 数据包中,可以使用MifareClassic.get(Tag) 获取对象的 MifareClassic类。


Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); // 4) Get an instance of the Mifare classic card from this TAG // intent MifareClassic mfc = MifareClassic.get(tagFromIntent); 



下面为读取Mifare card 的主要代码:

// 1) Parse the intent and get the action that triggered this intent 
String action = intent.getAction(); 
// 2) Check if it was triggered by a tag discovered interruption. 
if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(action)) { 
// 3) Get an instance of the TAG from the NfcAdapter 
Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); 
// 4) Get an instance of the Mifare classic card from this TAG 
// intent 
MifareClassic mfc = MifareClassic.get(tagFromIntent); 
MifareClassCard mifareClassCard=null; 
 
try { // 5.1) Connect to card 
mfc.connect(); 
boolean auth = false; 
// 5.2) and get the number of sectors this card has..and loop 
// thru these sectors 
int secCount = mfc.getSectorCount(); 
mifareClassCard= new MifareClassCard(secCount); 
int bCount = 0; 
int bIndex = 0; 
for (int j = 0; j < secCount; j++) { 
MifareSector mifareSector = new MifareSector(); 
mifareSector.sectorIndex = j; 
// 6.1) authenticate the sector 
auth = mfc.authenticateSectorWithKeyA(j, 
MifareClassic.KEY_DEFAULT); 
mifareSector.authorized = auth; 
if (auth) { 
// 6.2) In each sector - get the block count 
bCount = mfc.getBlockCountInSector(j); 
bCount =Math.min(bCount, MifareSector.BLOCKCOUNT); 
bIndex = mfc.sectorToBlock(j); 
for (int i = 0; i < bCount; i++) { 
 
// 6.3) Read the block 
byte []data = mfc.readBlock(bIndex); 
MifareBlock mifareBlock = new MifareBlock(data); 
mifareBlock.blockIndex = bIndex; 
// 7) Convert the data into a string from Hex 
// format. 
 
bIndex++; 
mifareSector.blocks<i> = mifareBlock; 
 
mifareClassCard.setSector(mifareSector.sectorIndex, 
mifareSector); 
} else { // Authentication failed - Handle it 
 
ArrayList<String> blockData=new ArrayList<String>(); 
int blockIndex=0; 
for(int i=0;i<secCount;i++){ 
 
MifareSector mifareSector=mifareClassCard.getSector(i); 
for(int j=0;j<MifareSector.BLOCKCOUNT;j++){ 
MifareBlock mifareBlock=mifareSector.blocks[j]; 
byte []data=mifareBlock.getData(); 
blockData.add("Block "+ blockIndex++ +" : "+ 
Converter.getHexString(data, data.length)); 
String []contents=new String[blockData.size()]; 
blockData.toArray(contents); 
setListAdapter(new ArrayAdapter<String>(this, 
android.R.layout.simple_list_item_1, contents)); 
getListView().setTextFilterEnabled(true); 
 
} catch (IOException e) { 
Log.e(TAG, e.getLocalizedMessage()); 
showAlert(3); 
}finally{ 
 
if(mifareClassCard!=null){ 
mifareClassCard.debugPrint(); 
}
 
</i>

Android中NFC功能流程图解析及代码演示


Android中NFC功能流程图解析及代码演示

在Android4.0推出的时候,一个非常引人注目的功能就是NFC(Near Field Communication).
Near Field Communication (NFC) is a set of short-range wireless technologies, typically requiring a distance of 4cm or less to initiate a connection. NFC allows you to share small payloads of data between an NFC tag and an Android-powered device, or between two Android-powered devices.
翻译:
近场通讯(NFC)是一系列短距离无线技术,一般需要4cm或者更短去初始化连接。近场通讯(NFC)允许你在NFC tag和Android设备或者两个Android设备间共享小负载数据。
典型的应用为刷卡应用,如刷信用卡,公交车卡,吃饭的饭卡之类。腾讯2011年1月份文章“Android首款NFC近场通信应用推出”,说明了基于Android的NFC应用目前已经有了,得益于日本在手机刷卡的应用氛围。据2011年7月网易文章“PayPal推出Android系统NFC移动支付服务”报道,PayPal已经做了尝试了,相信这股风很快要刮到中国。

下面我们从技术的层面来分析一下这个技术。相关的类代码有:NfcAdapter,NdefMessage, NdefRecord,ACTION_TAG_DISCOVERED.
在功能层面上,涉及到了NFC的读写功能。下面我们分别来做总结。
在代码层上面:
使用的时候,需要在AndroidManifest.xml里面加一些权限以及属性。
<uses-permission android:name="android.permission.NFC"/>
<uses-feature android:name="android.hardware.nfc" android:required="true"/>
<uses-sdk android:minSdkVersion="10"/>
这里注意,在Android Version 9的时候仅仅支持了ACTION_TAG_DISCOVERED,对于其他的需要10以上。
在上面的基础上,还需要增加intent-filter的支持。
<intent-filter>
    <action android:name="android.nfc.action.NDEF_DISCOVERED"/>
    <category android:name="android.intent.category.DEFAULT"/>
    <data android:mimeType="text/plain"/>
</intent-filter>
获取NfcAdapter的代码为
复制代码
public static String getStatusNfcDevice () {
    NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter();
    if (nfcAdapter.isEnabled()) {
         String status = "enabled";
         return status;
    }
    else {
        String status = "disabled";
        return status;
    }
}
复制代码
处理函数为
复制代码
public void onResume() {
    super.onResume();
    if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) {
        Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
        if (rawMsgs != null) {
            msgs = new NdefMessage[rawMsgs.length];
            for (int i = 0; i < rawMsgs.length; i++) {
                msgs[i] = (NdefMessage) rawMsgs[i];
            }
        }
    }
    //process the msgs array
}
复制代码
完整的一个操作代码摘自Google Android NFC Guide代码(略加注释):
复制代码
package com.example.android.beam;
 
import android.app.Activity;
import android.content.Intent;
import android.nfc.NdefMessage;
import android.nfc.NdefRecord;
import android.nfc.NfcAdapter;
import android.nfc.NfcAdapter.CreateNdefMessageCallback;
import android.nfc.NfcEvent;
import android.os.Bundle;
import android.os.Parcelable;
import android.widget.TextView;
import android.widget.Toast;
import java.nio.charset.Charset;
 
//继承并实现接口CreateNdefMessageCallback方法createNdefMessage
public class Beam extends Activity implements CreateNdefMessageCallback {
    NfcAdapter mNfcAdapter;
    TextView textView;
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        TextView textView = (TextView) findViewById(R.id.textView);
        // Check for available NFC Adapter
        //检测是否有NFC适配器
        mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
        if (mNfcAdapter == null) {
            Toast.makeText(this, "NFC is not available", Toast.LENGTH_LONG).show();
            finish();
            return;
        }
        // Register callback
        //注册回调函数
        mNfcAdapter.setNdefPushMessageCallback(this, this);
    }
 
    @Override
    public NdefMessage createNdefMessage(NfcEvent event) {
        String text = ("Beam me up, Android!\n\n" +
                "Beam Time: " + System.currentTimeMillis());
        //回调函数,构造NdefMessage格式
        NdefMessage msg = new NdefMessage(
                new NdefRecord[] { createMimeRecord(
                        "application/com.example.android.beam", text.getBytes())
         /**
          * The Android Application Record (AAR) is commented out. When a device
          * receives a push with an AAR in it, the application specified in the AAR
          * is guaranteed to run. The AAR overrides the tag dispatch system.
          * You can add it back in to guarantee that this
          * activity starts when receiving a beamed message. For now, this code
          * uses the tag dispatch system.
          */
          //,NdefRecord.createApplicationRecord("com.example.android.beam")
        });
        return msg;
    }
 
    @Override
    public void onResume() {
        super.onResume();
        // Check to see that the Activity started due to an Android Beam
        //得到是否检测到ACTION_NDEF_DISCOVERED触发
        if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) {
            processIntent(getIntent());
        }
    }
 
    //重载Activity类方法处理当新Intent到来事件
    @Override
    public void onNewIntent(Intent intent) {
        // onResume gets called after this to handle the intent
        setIntent(intent);
    }
 
    /**
     * Parses the NDEF Message from the intent and prints to the TextView
     */
    //关键处理函数,处理扫描到的NdefMessage
    void processIntent(Intent intent) {
        textView = (TextView) findViewById(R.id.textView);
        Parcelable[] rawMsgs = intent.getParcelableArrayExtra(
                NfcAdapter.EXTRA_NDEF_MESSAGES);
        // only one message sent during the beam
        NdefMessage msg = (NdefMessage) rawMsgs[0];
        // record 0 contains the MIME type, record 1 is the AAR, if present
        textView.setText(new String(msg.getRecords()[0].getPayload()));
    }
 
    /**
     * Creates a custom MIME type encapsulated in an NDEF record
     */
    public NdefRecord createMimeRecord(String mimeType, byte[] payload) {
        byte[] mimeBytes = mimeType.getBytes(Charset.forName("US-ASCII"));
        NdefRecord mimeRecord = new NdefRecord(
                NdefRecord.TNF_MIME_MEDIA, mimeBytes, new byte[0], payload);
        return mimeRecord;
    }
}
复制代码
上面代码还需要在AndroidManifest.xml文件里面添加
复制代码
<intent-filter>
  <action android:name="android.nfc.action.NDEF_DISCOVERED"/>
  <category android:name="android.intent.category.DEFAULT"/>
  <data android:mimeType="application/com.example.android.beam"/>
</intent-filter>
复制代码

在对NFC设备进行写操作的时候,相关代码:

复制代码
private void enableTagWriteMode() {
    mWriteMode = true;
    IntentFilter tagDetected = new IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED);
    mWriteTagFilters = new IntentFilter[] { tagDetected };
    mNfcAdapter.enableForegroundDispatch(this, mNfcPendingIntent, mWriteTagFilters, null);
}
复制代码
复制代码
@Override
protected void onNewIntent(Intent intent) {
    // Tag writing mode
    if (mWriteMode && NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction())) {
        Tag detectedTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
        if (NfcUtils.writeTag(NfcUtils.getPlaceidAsNdef(placeidToWrite), detectedTag)) {
            Toast.makeText(this, "Success: Wrote placeid to nfc tag", Toast.LENGTH_LONG)
                .show();
            NfcUtils.soundNotify(this);
        } else {
            Toast.makeText(this, "Write failed", Toast.LENGTH_LONG).show();
        }
    }
}
复制代码
复制代码
/*
* Writes an NdefMessage to a NFC tag*/
public static boolean writeTag(NdefMessage message, Tag tag) {
    int size = message.toByteArray().length;
    try {
        Ndef ndef = Ndef.get(tag);
        if (ndef != null) {
            ndef.connect();
            if (!ndef.isWritable()) {
                return false;
            }
            if (ndef.getMaxSize() < size) {
                return false;
            }
            ndef.writeNdefMessage(message);
            return true;
        } else {
            NdefFormatable format = NdefFormatable.get(tag);
            if (format != null) {
                try {
                    format.connect();
                    format.format(message);
                    return true;
                } catch (IOException e) {
                    return false;
                }
            } else {
                return false;
            }
        }
    } catch (Exception e) {
        return false;
    }
}
复制代码
相关的AndroidManifest.xml文件配置如下:
复制代码
<activity android:name=".CheckInActivity">
    <intent-filter>
      <action android:name="android.nfc.action.NDEF_DISCOVERED"/>
      <data android:mimeType="application/vnd.facebook.places"/>
      <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>
</activity>
复制代码

参考文章:
参考文章:
http://developer.android.com/guide/topics/nfc/nfc.html
http://stackoverflow.com/questions/5078649/android-nfc-sample-demo-reads-only-fake-information-from-the-tag
http://developer.android.com/guide/topics/nfc/index.html
http://money.163.com/11/0714/09/78TPVJOL00253CVK.html
http://www.cnblogs.com/jfttcjl/archive/2011/11/09/2242045.html
http://www.jessechen.net/blog/how-to-nfc-on-the-android-platform/
另外有几个专门推动NFC技术的联盟:
http://open-nfc.org/wp/nfchal/
http://www.classic.nxp.com/theme/nfc/
http://www.nfc-forum.org/home/
官方关于NFC的翻译文档见:
http://blog.csdn.net/nicebooks/article/details/6223956
参考库:
http://code.google.com/p/guava-libraries/

Android 2.3加入了NFC(近场通讯)的支持


Android 2.3加入了NFC(近场通讯)的支持。官网developer.android.com的英文介绍如下:
Near Field Communications (NFC)
Android 2.3 includes an NFC stack and framework API that lets developers read NDEF tags that are discovered as a user touches an NFC-enabled device to tag elements embedded in stickers, smart posters, and even other devices.
The platform provides the underlying NFC services that work with the device hardware to discover tags when they come into range. On discovering a tag, the platform notifies applications by broadcasting an Intent, appending the tag's NDEF messages to the Intent as extras. Applications can create Intent filters to recognize and handle targeted tags and messages. For example, after receiving a tag by Intent, applications extract the NDEF messages, store them, alert the user, or handle them in other ways.


The NFC API is available in the android.nfc package. The key classes are:
NfcAdapter, which represents the NFC hardware on the device.
NdefMessage, which represents an NDEF data message, the standard format in which "records" carrying data are transmitted between devices and tags. Applications can receive these messages from ACTION_TAG_DISCOVERED Intents.
NdefRecord, delivered in an NdefMessage, which describes the type of data being shared and carries the data itself.
NFC communication relies on wireless technology in the device hardware, so support for the platform's NFC features on specific devices is determined by their manufacturers. To determine the NFC support on the current device, applications can call isEnabled() to query the NfcAdapter. The NFC API is always present, however, regardless of underlying hardware support.


To use the NFC API, applications must request permission from the user by declaring <uses-permission android:name="android.permission.NFC"> in their manifest files.
Additionally, developers can request filtering on Android Market, such that their applications are not discoverable to users whose devices do not support NFC. To request filtering, add <uses-feature android:name="android.hardware.nfc" android:required="true"> to the application's manifest.


NFC的应用场景有很多,但Android 2.3目前API只提供了电子标签阅读器的功能。相信随着Android的版本升级,后续会增加很多应用场景和 API。
功能是少一点,但从无到有的第一步总是不容易的。从架构上看,至少有以下几部分的改动:
Android Framework层,为应用开发增加了相关API(即英文中的framework API)。
协议层,增加NFC的协议栈(即英文中的NFC Stack)。
硬件适配层,为硬件生产商提供适配接口,此层应该与NFC硬件的 Linux驱动通讯(实现方式待验证)。
工作流程是当支持NFC功能的手机或其他电子终端(后面简称手机)在用户开启NFC功能的时候,如果手机内置的NFC扫描器(相当于类NfcAdapter的功能)扫描到电子标签后,就会向相关用户程序发送ACTION_TAG_DISCOVERED的Intent,Itent的 extras架构中会包含NDEF(NFC Data Exchange Format)消息。如何处理此NDEF消息,就是用户程序的事情了。
NFC的API在android.nfc的包中提供,这个包主要提供三个大类,其中:NfcAdapter描述的就是手机中的NFC硬件,Android 2.3中可以暂时理解为电子标签扫描器。电子标签和扫描器中的消息通过NdefMessage来表示,这个类很简单,只是封装了NdefRecord。每个NdefMessage中可以包含多个NdefRecord,通过类NdefMessage的方法getRecords() 可以查询到消息的所有NdefRecord。NdefRecord才是信息的真正载体,正确理解这个类是理解NFC技术的一个重点。NFC的技术规范[url=link.php?url=http://www.nfc-forum.org%2Fspecs%2Fspec_list%2F]http://www.nfc-forum.org/specs/spec_list/[/url]是理解这个类不可或缺的资料。
应用程序的编程思路是:
通过android.nfc.NfcAdapter.getDefaultAdapter() 取得手机的objNfcAdapter
通过objNfcAdapter.isEnabled()查询该手机是否支持NFC
如果手机支持NFC,就申请接收ACTION_TAG_DISCOVERED 的Intent
如果接收到ACTION_TAG_DISCOVERED,就提取NdefMessage,并在此基础上进而提取 NdefRecord,整个是一个消息解析过程