Android移动平台中NDEF标签的扫描应用研究
2015-03-02朱凤山
朱凤山
摘要:移动终端应用程序的发展,促进了近距离通信技术的应用。NFC以其安全、简单、低功耗等特点成为移动终端主要采用的技术。介绍了NFC技术的基本特点、应用领域,给出了在Android操作系统中,NFC对NDEF标签读写的方法,对NFC应用前景进行了展望。
关键词:NFC;Android移动平台; NDEF标签
DOIDOI:10.11907/rjdk.143641
中图分类号:TP392
文献标识码:A 文章编号文章编号:16727800(2015)001015103
1 NFC与Android平台
NFC被称作“近场通信”,是RFID技术和互联网技术融合的产物,可以实现在单一芯片上,集感应式读卡器、感应式卡片和点对点数据传输功能于一体,在较短的距离(10cm)内与兼容设备进行识别和数据交换。相对于其它无线通信技术,NFC具备更好的安全特性,可以用于机场/车站身份验证、大厦门禁、智能交通卡、信用卡、支付卡等领域,拥有广阔的市场前景。
NFC的数据传输特点,决定了它可以与移动互联网融合,给互联网应用领域带来革命。2011年,基于Android操作系统的首款NFC近场通信应用就已推出,并获得好评,随后,多款采用Android系统的高端手机都将NFC作为标配。
2 NFC应用场景
NFC技术应用领域广泛,以其安全的数据传输特性,弥补了RFID在近距离通信方面的不足。支持NFC技术的设备可以替代非接触式的智能卡片,如公交卡、地铁卡等;支持NFC技术的手机可以充当读卡器,对卡片进行数据的读写操作;兼容NFC的设备之间可以直接进行数据传输,如手机之间进行名片数据的互发。NFC技术应用主要有5种基本类型。
(1) 智能卡片。用NFC标签替代现有的卡片,用户使用感觉友好,携带方便。NFC标签可以直接贴在客户的手机上,实现非接触卡的功能。NFC可以实现大型终端客户身份识别、消费积分、客户特别服务等功能。
(2)扫描码。在商业宣传中,促销的特定信息写在带NFC标签的海报上,当客户使用带有NFC读卡机的手机贴近标签时,瞬间完成一系列设定的功能。
(3)无接触支付。在移动支付、储值消费、积分消费等系统中,NFC标签可以实现带有用户密码安全认证的高安全性商业消费和支付交易操作。
(4) 数据传输。NFC设备之间可以进行数据传输,实现文件传输、识别、交换功能。在设备之间、设备和后台服务器之间完成数据同步功能。
(5) 与移动互联网深度融合。NFC是一个崭新的开放性技术领域,是射频技术、无线通讯技术和最新的网络技术结合的产物,未来2~5年必将给人们的生活带来巨大的变革。
3 NDEF标签
NFC标签分类复杂。简单的NFC标签只提供读写语法,某些时候一次只能以只读的方式读取卡片的可编程区域。复杂一点的NFC标签提供了数学运算能力,并且有加密的硬件来认证扇区的访问。最复杂的NFC标签包含了运算环境,允许在标签上执行复杂的交互代码,存储在标签中的数据也可以用各种格式来编写。
大多数Android框架的API都使用基于NDEF(NFC Data Exchange Format)的标准。Android平台中,NFC的基础应用主要是从NFC标签中读取NDEF数据,把NDEF消息从一个设备发送给另一个设备。除非是在移动设备的设置菜单中NFC被禁用,否则Android设备会在非锁屏的状态下搜索NFC,然后通过标签调度系统来处理被发现的NFC标签,对数据进行适当的分类,并启动对该类数据感兴趣的应用程序。目标应用程序要处理扫描到的NFC标签,需要声明一个Intent过滤器,并请求处理数据。
4 标签调度
当Android设备发现NFC标签时,目标Activity处理该Intent,借助Android提供的特殊标签调度系统,分析扫描到的NFC标签。通过解析数据,在扫描到的信息中查找感兴趣的应用程序。
4.1 映射MIME数据类型和URI
当Android设备扫描到NDEF格式数据的NFC标签时,它会解析该消息,并尝试搞清楚数据的MIME类型或URI标识。系统首先会读取消息(NdefMessage)中的第一条NdefRecord,来判断如何解释整个NDEF消息(一个NDEF消息能够有多条NDEF记录)。在格式良好的NDEF消息中,第一条NdefRecord包含以下字段信息:
(1)3bitTNF——类型名称格式。指示如何解释可变长度类型字段。
(2)可变长度类型——说明记录的类型,如果使用TNF_WELL_KNOWN,那么则使用这个字段来指定记录的类型定义(RTD)。
(3)可变长度ID,对记录进行唯一标识。这个字段不经常使用,但是,如果需要唯一标识一个标记,就可以为该字段创建一个ID。
(4)可变长度负载——读/写的实际数据负载。一个NDEF消息能够包含多个NDEF记录。
标签调度系统使用TNF和类型字段,尝试把MIME类型或URI映射到NDEF消息中。如果成功,它会把信息与实际负载一起封装到ACTION_NEDF_DISCOVERED类型的Intent中。但是,有标签调度系统不能根据第一条NDEF记录来判断数据类型的情况,这样就会有NDEF数据不能映射到MIME类型或URI,或者是NFC标签没有包含NDEF开始数据的情况发生,这种情况下,就会用一个和标签技术信息相关的Tag对象和封装在ACTION_TECH_DISCOVERED类型Intent对象内部的负载来代替。
4.2 NFC标签启动方式
NFC标签的启动依赖于标签调度系统,主要以“隐式Intent”的方式启动应用程序。当标签调度系统创建Intent对象后,需要向Intent中封装相应的标识信息,然后向外发送广播,接收该广播的应用程序需要注册广播接收器,响应该广播。如果多个应用程序都注册了上述Intent的广播接收器,则系统会弹出应用程序选择器,提示用户选择哪一个应用程序响应本次广播。标签调度系统预定义的Intent活动主要有以下3项。
(1)ACTION_NDEF_DISCOVERED活动。封装该种类型活动的Intent会启动包含NDEF的应用程序,这是优先级较高的一种活动,系统会优先尝试启动该种类型的应用程序。
(2)ACTION_TECH_DISCOVERED活动。这种活动比第(1)种活动的优先级低,只在系统发现没有封装了ACTION_NDEF_DISCOVERED活动的Intent时,才会尝试启动该类型的应用程序。有一种例外情况:如果设备在发现NFC标签之后,无法映射到相应的MIME类型,或者没有相应的URI类型,则会直接启动该种类型的应用程序。
(3)ACTION_TAB_DISCOVERED活动。这种活动优先级最低,标签调度系统没有发现上述两种活动时,会启动该种类型的应用程序。
调度系统按照上述3种活动的优先级依次尝试所要启动的应用程序:如果存在封装了ACTION_NDEF_DISCOVERED的Intent,则首先启动该应用程序,如果没有应用程序响应,则尝试启动封装了ACTION_TECH_DISCOVERED的Intent。如果这两种Intent都没有应用程序响应,调度系统会尝试启动封装了ACTION_TAG_DISCOVERED的Intent,如果依然没有应用程序响应,则停止调度工作,系统将不处理所发现的标签。多数应用场合,调度系统都会成功启动封装了ACTION_NDEF_DISCOVERED的Intent,这也是上述3种类型的活动中,最为规范、标准的一种。
4.3 设定系统访问权限
当应用程序需要响应NFC标签调度系统的触发时,需要在配置文件AndroidManifest.xml中声明所需要的权限,以便获得访问手机硬件信息的资格。NFC应用程序通常需要声明的权限信息有:①在
目前,Android操作系统版本众多,各版本之间差异较大。在使用NFC技术时,不同的版本略有不同。在Android API 10中,系统提供了广泛的NFC读写支持,可以实现较为丰富的应用。在Android API 14中,系统增加了Android Beam操作,可以直接创建NDEF记录,这样便可以更加灵活地将消息传送给其它设备。Android的前期版本不完全支持NFC,比如在Android API 9中,系统仅支持ACTION_TAG_DISCOVERED活动,并且只能通过EXTRA_NDEF_MESSAGES来访问NDEF数据。
5 读取NDEF类型的Intent
上述3种类型Intent,都可以响应NFC标签调度系统的触发。如果某个Activity需要响应NFC调度,则需要在过滤器中配置活动信息。可以将3种活动都配置到过滤器中,也可以只配置一种。通常情况下,优先级最高的ACTION_NDEF_DISCOVERED活动需要首先配置。
5.1 配置NDEF过滤器
要过滤ACTION_NDEF_DISCOVERED类型的Intent,就要在清单中与过滤的数据一同声明该类型的Intent过滤器。比如过滤text/plain类型的MIME,ACTION_NDEF_DISCOVERED类型过滤器声明如下:
5.2 扫描目标Intent数据
NFC调度系统在向外广播NDEF时,会将标签中的数据封装在Intent中。当Activity成功响应一个NFC Intent之后,可以从该Intent中读取所需要的数据。这些数据的封装是固定的,可以通过EXTRA_TAG键,获取手机所扫描到的NFC标签对象,这也是最为重要的数据;EXTRA_NDEF_MESSAGES键对应NDEF中的消息数组,EXTRA_ID键对应标签ID值。
检查ACTION_NDEF_DISCOVERED类型的Intent,并从Intent对象的附加信息中获取NDEF消息,可以参考如下代码:
public void onResume() {
super.onResume();
...
if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) {
Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_N DEF_MESSAGES);
if (rawMsgs != null){
msgs = new NdefMessage[rawMsgs.length];
for (int i = 0; i < rawMsgs.length; i++) {
msgs[i] = (NdefMessage) rawMsgs[i];
}}}}
6 结语
Android系统对NFC技术提供了较为全面的支持。所涉及的API主要位于android.nfc和android.nfc.tech两个包中。其中NfcManager类主要用于实例化NfcAdapter,管理Android设备中所有的NFC适配器。NfcAdapter类是一个NFC 适配器类,通过getDefaultAdapter(Context)方法获取对象。NdefMessage 类和NdefRecord类用于封装数据格式。Tag类是NFC标签类,当系统扫描到一个NFC标签时,会创建一个对象,发送到感兴趣的Activity。
目前, NFC技术处于蓬勃发展阶段,各种使用NFC技术实现的应用程序层出不穷。虽然NFC技术只出现在Android操作系统的高端手机中,但由于NFC芯片成本不高,易于贴附于手机电池和外壳上,其发展前景广阔。在手机支付、手机公交、手机门禁等领域,完全可以通过NFC实现。