NFC手机相比普通手机来说,有以下3个附加功能:
1.可以当成POS机来用,也就是“读取”模式
2.可以当成一张卡来刷,也就是NFC技术最核心的移动支付功能
3.可以像蓝牙、Wi-Fi一样做点对点通信
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 等。
NFC技术在国内发展如何?
NFC之所以光明原因在于以下四点:
第一、NFC芯片的价格已经在逐步的降低,为NFC功能的普及降低了门槛。具体的资料已经找不到了,我记得在06年的时候,一枚NFC芯片的价钱在3~~5欧元之间,而最新的消息显示博通公司收购了NFC公司,芯片量产的价格有望低于1美元,这样子有点像当初GPS的普及一样。
第二、NFC技能受到了国外各个领域巨头的支持,NFC 技能论坛包括了140多名成员,包括手机生产商、电信运营商、金融机构和软件开发商等,手机生产商包括三星、诺基亚、LG等国际知名品牌,电信运营商有 T-mobile、sprint等,金融机构有ISIS、visa等,软件开发商有现在的谷歌以及在不久将会加入的苹果这个当代皇者。
第三、NFC技术可适用于很多场景,比 如进场支付、公交卡、门禁卡、车票门票、文件传输、电子名片、游戏配对等。你可以通过带有NFC功能的手机买东西、签到、刷公交卡或门票,或者和别人交换 名片、传输文件、联机游戏等等,即使你的手机没有电了,仍然可以讲它当做一个交通卡适用,它和我们手中的各种感应卡片完全一样,属于被动激活的。
第四、NFC和传统的近场支付技术相比,具有天然的安全性,以及建立连接的快速性。
一个激活NFC芯片的终端多少钱我忘记了,但是绝对不便宜。而NFC的价值就是在于支持的环境多种多样,能够在各种环境中实现各种能够,只有各种基础设施对于NFC支持得越多,那么NFC的价值才能够得到最大程度上的体现。
所以,NFC技术目前在国内面临的第二个问题就是基础设施的不完善,找不到一套可循环的商业解决方案。
这个原因有两方面原因:
第一个原因在于,国内并没有哪家行业的领头者敢于率先对基础设施的普及进行投入,原因就是风险太大为他人作嫁衣。
第 二个原因在于,对于一些小商家、小商城来说是行不通的。其实科技人员总是容易陷入一个误区,只要技术实现了,那么一切都好办了。其实就很多新兴技术来说, 在立意上面都是好的,但是在具体操作实施上面可能会出现这些那些的问题,对于任何的小商家来说,任何的改动都是对于现有的管理成本、维护成本以及资金成本 的增加,一旦这么做,虽然方面了客户,但是对于商家来说却是不合适的,他们就不愿意做。
2013 O2O元年:移动支付开启
2013:O2O元年
Online To Offline,即线下商务的机会与互联网结合在一起,互联网成为线下交易前台的O2O。O2O的核心效用在于满足人们的“3A”消费与支付需求,即人们 希望在任何时候(Anytime)、任何地方(Anywhere)、使用任何可用的方式(Anyway)得到任何想要的零售服务。
O2O作为电商行业一个重要概念,在2012年曾被反复提及。无论是在坎坷中前行的团购网站,还是天猫、腾讯等电商大佬,都在争夺O2O这一战略要地。2012年是摸索O2O的一年,并无明显突破,2013年才是真正的O2O元年。之所以称2013为O2O元年,是因为在基于智能手机上的支付突破和SNS、LBS等应用。
O2O核心在移动支付
从表面上看,O2O的关键似乎是网络上的信息发布,因为只有互联网才能把商家信息传播得更快,更远,更广,可以瞬间聚集强大的消费能力。实际 上,O2O的核心在于在线支付,一旦没有在线支付功能,O2O中的online不过是替他人做嫁衣罢了。以团购为例,如果没有能力提供在线支付,仅凭网购 后的自身统计结果同商家结算,结果必须是双方无法就实际购买的精确人数达成一致而陷入永无休止的纠纷。
在线支付不仅是支付本身的完成,是某次消费得以最终形成的唯一标志,更是消费数据唯一可靠的考核标准。尤其是对提供online服务的互联网专 业公司而言,只有用户在线上完成支付,自身才可能从中获得效益,从而把准确的消费需求信息传递给offline的商业伙伴。无论B2C,还是C2C,均是 在实现消费者能够在线支付后,才形成了完整的商业形态。
LBS+SNS+二维码支付闭环
瞄准O2O市场的新支付解决方案如NFC、二维码支付、条码支付、语音支付、摇一摇支付等新技术、新方案层出不穷、争奇斗艳。而在这些方案中, 移动互联网诞生的新机遇是O2O,二维码将是线上线下的关键入口。由LBS+SNS+二维码支付第一次形成O2O闭环系统:LBS负责将空间地理信息提供 给交易双方,SNS负责将消费信息与体验与他人分享从而形成规模效应,二维码支付负责完成支付。
日前,支付宝公司宣布推出自定义二维码收款业务,所有支付宝用户均可通过支付宝免费领取“向我付款”的二维码消费者只需打开支付宝手机客户端的 扫码功能,并拍下二维码,即可跳转至付款页面,在付款成功后,款项将直接到达二维码绑定的支付宝账户中,收款人也会收到短信及客户端通知。用户还可以自行 上传头像照片并设置收款人姓名,让二维码更加个性化。这也成为吸引年轻消费者的一个重要理由。在过去的一个月中,用支付宝收银成为了许多商家自发的选择, 目前全国11个城市的“智能车队”、南宁“最潮酸嘢店”以及广东的两千余家“美宜佳”门店,已开始支持支付宝二维码付款。此外,支付宝还在杭州水果摊悄悄 试验用于识别优惠券的声波支付方式。采用二维码、声波等支付方式,再也不用担心需要提前准备零钞现金了,也不用担心收到假币了,并可实时掌控销售额。
而腾讯财付通正在抓住微信用户突破3亿的机会,全力推进财富通与微信的合作。微信将通过二维码识别,把基于LBS的商家和用户建立起联系,形成 “熟人”形式的SNS,进而指导O2O业务。未来还将与微信摇一摇功能结合,二维码扫描与支付结合,可实现“即拍即买”,拍摄商品二维码可进行购买和支 付。微信+财付通将创造出微生活支付理念,一部手机走遍天下将成为现实,财付通将依托微信,有针对性的开发出各种支付方式和场景。这一支付场景和模式将用 于聚餐、KTV等集体活动中。还可通过微信直接向好友转账。微生活会员卡可获得商家优惠,并可及时支付,免去了定位、排队等环节。目前,微生活与上千个品 牌建立了合作,包括呷哺呷哺、星巴克、上海DQ门店等。用户使用微信扫描商户二维码可开启“微生活”电子会员卡,获得商家优惠。
实事上,NFC(Near Field Communication)非接触式近距离无线通讯技术和ETC( Electronic Toll Collection ) 不停车收费系统可以让过路过桥、停车、通勤等任何需要支付购买的移动式商品和服务纳入O2O,这无疑将电子商务交易客体网货的边界拓展至任何合法流通的商 品和服务,为商家营销创造了无限可能……
瓶颈待突破
O2O模式要大发展,还面临着三大瓶颈:由于担忧资金支付安全和个人隐私信息泄露,手机二维码、NFC支付的市场客户认知度较低;新增硬件设备 采购增加了一定的应用成本;线下商家不愿意提供商品和服务的渠道、价格等……这些瓶颈一旦突破,O2O将在2013年大规模爆发。
Android NFC开发实例:学生卡数据读取
使用硬件:Google Nexus S,北京大学学生卡。(ps:笔者本想使用公交一卡通进行测试,发现手机不能正确识别)
手机操作系统:Android ICS 4.04。
开发时,笔者从Google Play Store上下载了NFC TagInfo软件进行对比学习。所以我们可以使用任意一张能被TagInfo软件正确识别的卡做测试。
在Android NFC 应用中,Android手机通常是作为通信中的发起者,也就是作为各种NFC卡的读写器。Android对NFC的支持主要在 android.nfc 和android.nfc.tech 两个包中。
android.nfc 包中主要类如下:
NfcManager 可以用来管理Android设备中指出的所有NFCAdapter,但由于大部分Android设备只支持一个NFC Adapter,所以一般直接调用getDefaultAapater来获取手机中的Adapter。
NfcAdapter 相当于一个NFC适配器,类似于电脑装了网络适配器才能上网,手机装了NfcAdapter才能发起NFC通信。
NDEF: NFC Data Exchange Format,即NFC数据交换格式。
NdefMessage 和NdefRecord NDEF 为NFC forum 定义的数据格式。
Tag 代表一个被动式Tag对象,可以代表一个标签,卡片等。当Android设备检测到一个Tag时,会创建一个Tag对象,将其放在Intent对象,然后发送到相应的Activity。
android.nfc.tech 中则定义了可以对Tag进行的读写操作的类,这些类按照其使用的技术类型可以分成不同的类如:NfcA, NfcB, NfcF,以及MifareClassic 等。其中MifareClassic比较常见。
在本次实例中,笔者使用北京大学学生卡进行数据读取测试,学生卡的TAG类型为MifareClassic。
AndroidManifest.xml:
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="org.reno"
- android:versionCode="1"
- android:versionName="1.0" >
- <uses-permission android:name="android.permission.NFC" />
- <uses-sdk android:minSdkVersion="14" />
- <uses-feature android:name="android.hardware.nfc" android:required="true" />
- <application
- android:icon="@drawable/ic_launcher"
- android:label="@string/app_name" >
- <activity
- android:name="org.reno.Beam"
- 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.TECH_DISCOVERED" />
- </intent-filter>
- <meta-data
- android:name="android.nfc.action.TECH_DISCOVERED"
- android:resource="@xml/nfc_tech_filter" />
- </activity>
- </application>
- </manifest>
res/xml/nfc_tech_filter.xml:
- <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <tech-list>
- <tech>android.nfc.tech.MifareClassic</tech>
- </tech-list>
- </resources>
当手机开启了NFC,并且检测到一个TAG后,TAG分发系统会自动创建一个封装了NFC TAG信息的intent。如果多于一个应用程序能够处理这个intent的话,那么手机就会弹出一个框,让用户选择处理该TAG的Activity。 TAG分发系统定义了3中intent。按优先级从高到低排列为:
NDEF_DISCOVERED, TECH_DISCOVERED, TAG_DISCOVERED
当Android设备检测到有NFC Tag靠近时,会根据Action申明的顺序给对应的Activity 发送含NFC消息的 Intent。
此处我们使用的intent-filter的Action类型为TECH_DISCOVERED从而可以处理所有类型为ACTION_TECH_DISCOVERED并且使用的技术为nfc_tech_filter.xml文件中定义的类型的TAG。
详情可查看官方文档说明。下图为当手机检测到一个TAG时,启用Activity的匹配过程。
res/layout/main.xml:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:orientation="vertical" >
- <ScrollView
- android:id="@+id/scrollView"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:background="@android:drawable/edit_text" >
- <TextView
- android:id="@+id/promt"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:scrollbars="vertical"
- android:singleLine="false"
- android:text="@string/info" />
- </ScrollView>
- </LinearLayout>
定义了Activity的布局:只有一个带有滚动条的TextView用于显示从TAG中读取的信息。
res/values/strings.xml:
- <?xml version="1.0" encoding="utf-8"?>
- <resources>
- <string name="app_name">NFC测试</string>
- <string name="info">扫描中。。。</string>
- </resources>
src/org/reno/Beam.java:
- package org.reno;
- import android.app.Activity;
- import android.content.Intent;
- import android.nfc.NfcAdapter;
- import android.nfc.Tag;
- import android.nfc.tech.MifareClassic;
- import android.os.Bundle;
- import android.widget.TextView;
- public class Beam extends Activity {
- NfcAdapter nfcAdapter;
- TextView promt;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- promt = (TextView) findViewById(R.id.promt);
- // 获取默认的NFC控制器
- nfcAdapter = NfcAdapter.getDefaultAdapter(this);
- if (nfcAdapter == null) {
- promt.setText("设备不支持NFC!");
- finish();
- return;
- }
- if (!nfcAdapter.isEnabled()) {
- promt.setText("请在系统设置中先启用NFC功能!");
- finish();
- return;
- }
- }
- @Override
- protected void onResume() {
- super.onResume();
- //得到是否检测到ACTION_TECH_DISCOVERED触发
- if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(getIntent().getAction())) {
- //处理该intent
- processIntent(getIntent());
- }
- }
- //字符序列转换为16进制字符串
- private String bytesToHexString(byte[] src) {
- StringBuilder stringBuilder = new StringBuilder("0x");
- if (src == null || src.length <= 0) {
- return null;
- }
- char[] buffer = new char[2];
- for (int i = 0; i < src.length; i++) {
- buffer[0] = Character.forDigit((src[i] >>> 4) & 0x0F, 16);
- buffer[1] = Character.forDigit(src[i] & 0x0F, 16);
- System.out.println(buffer);
- stringBuilder.append(buffer);
- }
- return stringBuilder.toString();
- }
- /**
- * Parses the NDEF Message from the intent and prints to the TextView
- */
- private void processIntent(Intent intent) {
- //取出封装在intent中的TAG
- Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
- for (String tech : tagFromIntent.getTechList()) {
- System.out.println(tech);
- }
- boolean auth = false;
- //读取TAG
- MifareClassic mfc = MifareClassic.get(tagFromIntent);
- try {
- String metaInfo = "";
- //Enable I/O operations to the tag from this TagTechnology object.
- mfc.connect();
- int type = mfc.getType();//获取TAG的类型
- int sectorCount = mfc.getSectorCount();//获取TAG中包含的扇区数
- String typeS = "";
- switch (type) {
- case MifareClassic.TYPE_CLASSIC:
- typeS = "TYPE_CLASSIC";
- break;
- case MifareClassic.TYPE_PLUS:
- typeS = "TYPE_PLUS";
- break;
- case MifareClassic.TYPE_PRO:
- typeS = "TYPE_PRO";
- break;
- case MifareClassic.TYPE_UNKNOWN:
- typeS = "TYPE_UNKNOWN";
- break;
- }
- metaInfo += "卡片类型:" + typeS + "\n共" + sectorCount + "个扇区\n共"
- + mfc.getBlockCount() + "个块\n存储空间: " + mfc.getSize() + "B\n";
- for (int j = 0; j < sectorCount; j++) {
- //Authenticate a sector with key A.
- auth = mfc.authenticateSectorWithKeyA(j,
- MifareClassic.KEY_DEFAULT);
- int bCount;
- int bIndex;
- if (auth) {
- metaInfo += "Sector " + j + ":验证成功\n";
- // 读取扇区中的块
- bCount = mfc.getBlockCountInSector(j);
- bIndex = mfc.sectorToBlock(j);
- for (int i = 0; i < bCount; i++) {
- byte[] data = mfc.readBlock(bIndex);
- metaInfo += "Block " + bIndex + " : "
- + bytesToHexString(data) + "\n";
- bIndex++;
- }
- } else {
- metaInfo += "Sector " + j + ":验证失败\n";
- }
- }
- promt.setText(metaInfo);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
关于MifareClassic卡的背景介绍:数据分为16个区(Sector) ,每个区有4个块(Block) ,每个块可以存放16字节的数据。
每个区最后一个块称为Trailer ,主要用来存放读写该区Block数据的Key ,可以有A,B两个Key,每个Key 长度为6个字节,缺省的Key值一般为全FF或是0. 由 MifareClassic.KEY_DEFAULT 定义。
因此读写Mifare Tag 首先需要有正确的Key值(起到保护的作用),如果鉴权成功,然后才可以读写该区数据。
执行效果:
安卓手机NFC标签使用操作指南
NFC详细介绍
-
我们肯定首先需要一款内置NFC芯片的安卓手机,可用的设备有Nexus S,Galaxy Nexus,HTC One X,Sony Xperisa以及三星Galaxy S2的其他版本。以后发布的Galaxy S3很可能配置支持NFC。对于本指南中我们向你展示的,你同样需要一批未被格式化的NFC标签。这些可以在像TagsForDriod.com这样的网店上买到,大概花7欧元就能买到10个标签,而且还贴有美国邮票。如果你随便逛逛,说不定还能找到更便宜的。
-
NFC标签
NFC标签本身就是小塑料圆盘,大小与十便士的硬币相仿。标签并不需要外置电源,只要在上面刷下手机就能使用NFC买点东西,而且携带相关信息以便手机内置NFC芯片读取。标 签出厂时都未被格式化,没有记载任何信息,就像崭新的软盘(呵呵,不知道哪年的东东了)。你需要NFC Task Launcher这款应用向标签中写入信息。该应用不仅能够使你向标签中写入数据-如网址、手机号码、或是几个字,还可以将你手机中的某些应用绑定在一 起。到底是什么应用,马上揭晓。
END
步骤/方法
-
创建办公室用标签
办公期间电话铃声是现代生活中的小烦恼之一,特别是如果你厝到设置一个特别尴尬的铃声。牢记进入办公室前将手机设置为静音模式成为你的日常程序之一,但是许多人常常忘记做这些。NFC标签就能帮你干这个,它同样可以在你手机摔出去的时候进行相关设置。
-
在NFCTask Launcher,选中“创建新任务”,你将会看到一系列功能选项,如无线连接声音、社交媒体与应用程序。在此篇指南中,我们将会创建一个NFC标签能够自动设置你的手机以匹配工作环境,所以你应该选中“声音与音量”,轻点该选项,选中“铃声类型”,设置为震动或静音,随你自己选,然后选择“添加此项至任务”。
-
当然,还有其他你想在工作时进行自动设置的选项,可以选择添加动作,进入后选中WIFI和蓝牙连接,轻点WIFI开关,设置为可用。同样添加该项至任务即可,这样就可以自动打开WIFI连接,如果你的办公室覆盖有无线网络,当你坐在你桌旁的时候就可以连接至无线网络。
社交提醒
也许你的另一半或是家庭成员特别关心你的行踪。再次轻点动作,选择菜单中的社交媒体选项,这里就能创建一个向推特账号发送提醒确认你已经安全到达,而且你还可以选择其他社交网络,Foursquare、脸谱或是谷歌纬度实现同样效果。
-
设立日程
最后,如果你一天工作繁忙,你希望一坐在桌旁就能打开日历应用程序就能看到今天的日程。选择“添加动作”,进入后选中“启动应用程序”,轻点“程序”,选中列表中显示的日历程序。
-
向标签中写入信息
当你圆满完成任务时,可以点击完成,然后保存。你想赋予任务好听的名字—工作要好点的话,只要你喜欢都可以。接下来一步救赎向空白标签中写入信息。
-
创建标签后,你可以把它粘在你的办公桌上然后每天早上上班的时候在上面贴一下。你也不需要手动切换某一项设置。NFCTask Launcher读取标签中的信息并立刻执行你所设定的所有任务。向空白标签中写入任务信息,轻点完成,然后在标签上贴过,你就能得到进程完成的确认信息。另外Galaxy Nexus拥有者可能会在这步收到错误提示,因为安卓4.0.3版本系统存在阻止手机内置NFC芯片向空白标签写入信息的bug。
-
无须着急,这里也有一个对应的应用。下载安装“NFC标签读写器”就可以使用该程序向标签中写入一条信息,该应用也不需要确保标签已格式化以备NFC Task Launcher进行读写操作。其他手持设备用户无需使用此项步骤,还有即将推出的Galaxy Nexus升级至安卓4.0.4系统也已经解决了这个问题。
看你的工作用标签做好了,现在我们来看看家庭用标签。
创建家庭用标签重复创建工作用标签的步骤,但这回把所有事项往家庭用方面改了。打开你的铃声,发个你在家的推特等等。你如果想关闭或者你想指示程序连接至家庭网络。把标签放在靠近门的地方,当你回家开门的时候就可以刷标签了。
-
或者你可以创建一个“切换”标签在办公室和家庭环境之间进行切换。你可以只在办公时在桌上刷下标签,无需在家里刷第二遍。切换系统可以允许你在两个任务之间进行切换,同时也避免了使用两张单独的
NFC标签的其他用处
这里仅仅是NFC标签开启一个应用的例子。你同样可以使用标签做些其他的事,如自动打开手机浏览器的网页,自动更新通讯录或是实现手机WIFI热点无缝接入,一刷限制其他设备接入。
当然,你会说像Taker这样的应用程序还可以允许创建基于时间、地理位置和设备状态的任务,提供了华丽而便宜的自动控制。某种程度这种说法也没错,NFC标签更加快速而且提供了更高层次的自动控制。你也晓得只要你刷下NFC标签,所有绑定的任务都会立刻执行。Tasker,怎么说呢,有点呆板,功能有待改善吧。
END -