简单谈谈NFC(转载自-tlex/pku_android)

NFC是Near Field Communication缩写,又称近距离无线通信,是一种短距离的高频无线通信技术,允许电子设备之间进行非接触式点对点数据传输(在十厘米内)交换数据。这个技术由免接触式射频识别(RFID)演变而来,并向下兼容RFID,最早由Sony和Philips各自开发成功,主要用于手机等手持设备中提供M2M(Machine to Machine)的通信。由于近场通讯具有天然的安全性,因此,NFC技术被认为在手机支付等领域具有很大的应用前景。由飞利浦公司和索尼公司共同开发的NFC是一种非接触式识别和互联技术,可以在移动设备、消费类电子产品、PC 和智能控件工具间进行近距离无线通信。NFC 提供了一种简单、触控式的解决方案,可以让消费者简单直观地交换信息、访问内容与服务。
目前,NFC Forum在全球拥有数百个成员,包括:SONY、 Phlips、LG、摩托罗拉、NXP、NEC、三星、atoam、Intel、其中中国成员有OPPO、中国移动、华为、中兴、上海同耀和台湾正隆等公司。

而对于NFC手机来说,相比普通智能手机基本可以实现以下几个功能:

1、移动支付:例如在商场、超市、饭店等地方购物结账时,刷一下手机,结账走人
2、门禁通过:例如小区门禁,如果我们手机中存有相应的验证码,进门时刷一下,OK
3、数据传输:将两台支持NFC功能的手机,背对背贴好,通过Android Beam即可完成照片、音乐等数据的传输。
4、浏览信息:将手机靠近带有NFC功能的公共设施上,即可浏览交通、演出、天气等信息。
5、智能标签:可以通过标签来预设置相关的应用然后手机贴近标签后实现一些预设的功能,例如进入某些大学的图书馆,门口可能会有一个智能标签,带有NFC手机贴近后,就会自动切换到静音模式,或者在会议室门口,刷一下标签,即可开启录音机应用。
6、读取感应卡信息:例如银行卡电子现金余额及消费记录、公家卡余额及消费记录等等。

7、移动支付:例如在商场、超市、饭店等地方购物结账时,刷一下手机,结账走人

8、门禁通过:例如小区门禁,如果我们手机中存有相应的验证码,进门时刷一下,OK

9、数据传输:将两台支持NFC功能的手机,背对背贴好,通过Android Beam即可完成照片、音乐等数据的传输。
10、浏览信息:将手机靠近带有NFC功能的公共设施上,即可浏览交通、演出、天气等信息。
11、智能标签:可以通过标签来预设置相关的应用然后手机贴近标签后实现一些预设的功能,例如进入某些大学的图书馆,门口可能会有一个智能标签,带有NFC手机贴近后,就会自动切换到静音模式,或者在会议室门口,刷一下标签,即可开启录音机应用。
12、读取感应卡信息:例如银行卡电子现金余额及消费记录、公家卡余额及消费记录等等

 

 

--------------------------------------------------------------------蜜汁分割线--------------------------------------------------------------------------------

1.猫掌柜
这个软件有点意思,是将NFC手机变成一台标准的收款用POS机的app。可以用来收款。安全性嘛,IC卡的安全性还是可以的。关键点:可以刷信用卡。恩,其他的就不多说了。可以称之为信用卡神器了,目前还没在市面上看到同类型的产品。所以也蛮好玩的。
技术上蛮有意思的,没有任何其他的硬件,只要手机带有NFC模块即可刷卡。有兴趣的朋友可以去了解一下,这里就不多说了。
这里丢个演示视频,诸位可以看看。

http://v.youku.com/v_show/id_XMTI5OTkxMDEwNA==.html

2.中国移动和包
中国移动和包(NFC)业务是将您日常生活中使用的各种卡片应用(如银行卡、公交卡、校园/企业一卡通、会员卡等)装载在具有NFC功能的手机中,让您随时随地刷手机消费,实现手机变钱包的功能。在有银联闪付(Quick Pass)或和包(NFC)业务合作标识的现场商家进行消费时,您只需持NFC手机靠近对应业务受理终端轻轻一刷即可完成支付。
商超购物、公交/地铁、优惠折扣……中国移动和包(NFC)革新化设计,为您打造快捷、安全、时尚、品质的全新生活体验!
移动这个和包可以用NFC-SIM卡,即可以通过这个来实现手机NFC刷卡这个功能。当然,需要更换移动的NFC-SIM卡才能实现这个功能。

https://www.cmpay.com/

3.一卡通官方的e乐充公交卡
乐充公交卡是北京市政交通一卡通有限公司专为NFC手机设计的一款集话费、Q币充值,电影票优惠购买,公交卡的查询、充值和消费功能为一体的软件;当前支持全国各地支持全国各地公交卡方便快捷余额查询,支持北京公交卡的充值。

下载地址:http://www.elechong.com/download

4.翼支付
翼支付产品是中国电信的移动支付产品,您开通中国电信翼支付账户并储值后,即可在中国电信联盟商家和合作商户使用该账户通过网站、短信、语音等方式进行远程支付,办理翼支付卡(RFID-UIM卡)后还可通过手机刷POS机方式进行现场支付。 
翼支付支持很多城市的NFC-SIM卡来刷公交卡,这个实用性很强,强烈推荐!
官网:https://www.bestpay.com.cn/index
5.支付宝
支付宝钱包8.0推出了令人耳目一新的NFC功能,通过开启支付宝钱包的NFC功能,您就可以将手机的NFC标签靠近公交卡、银行卡等带有芯片的IC卡上,可迅速读取卡内余额、卡的信息,还可以给卡进行充值,非常贴心实用。
官网:https://www.alipay.com/
6.招商银行手机银行NFC支付
一闪通是以手机为载体,用来替代一卡通、信用卡业务的进入IC卡。客户凭本人一卡通通过制定型号手机的手机银行客户端申请“一闪通”,申请成功后我行自动在手机的内置芯片中写入一张全新卡号的进入IC卡。客户可持写入“一闪通(借记卡)”直接使用对应一卡通的密码、账户资金、功能限额。
一闪通已经集成到“招商银行掌上银行”、“掌上生活”两个app里面。
目前,支持的手机有:
手机品牌 三星 华为 OPPO 魅族 金立 
手机机型 三星Note4 荣耀6Plus N3 N1 Mini MX4 Pro E8 
具体型号 N9100 PE-TL10 N5207 N5117 全部支持 GN9008 
N9106W E100-TL10 N5209

7.云飞NFC
云飞NFC是一款基于NFC的,功能强大的应用程序,通过它可以进行场景的快速切换、应用启动、改变手机设置等操作,还可以读取电子标签,交通卡,银行卡等信息。

8.NFC闹钟
NFC闹钟,英文原名为NFC Alarm Clock,是一款基于NFC的闹钟应用;用户在设置闹钟是需要将关闭闹钟的信息写入到NFC标签中,起床时,用户必须用手机扫描该标签才能停止闹钟。

9.nfc标签,适用于于nfc android自带的读写功能

 

在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比较常见。

 1 <span style="font-size:16px;"><?xml version="1.0" encoding="utf-8"?>
 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
 3     package="com.xxx.park"
 4     android:versionCode="1"
 5     android:versionName="1.0" >
 6     <uses-permission android:name="android.permission.NFC" />
 7     <uses-sdk android:minSdkVersion="14" />
 8     <uses-feature android:name="android.hardware.nfc" android:required="true" />
 9     <application
10         android:icon="@drawable/ic_launcher"
11         android:label="@string/app_name" >
12         <activity
13             android:name="com.xxx.park.activity"
14             android:label="@string/app_name"
15             android:launchMode="singleTop" >
16             <intent-filter>
17                 <action android:name="android.intent.action.MAIN" />
18 
19                 <category android:name="android.intent.category.LAUNCHER" />
20             </intent-filter>
21             <intent-filter>
22                 <action android:name="android.nfc.action.TECH_DISCOVERED" />
23             </intent-filter>
24             <meta-data
25                 android:name="android.nfc.action.TECH_DISCOVERED"
26                 android:resource="@xml/nfc_tech_filter" />
27         </activity>
28     </application>
29 </manifest>
30 </span>

 1 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> 2 <tech-list> 3 <tech>android.nfc.tech.MifareClassic</tech> 4 </tech-list> 5 </resources> 

  1 package com.softsea.cs_park;
  2 
  3 import android.app.Activity;
  4 import android.content.Intent;
  5 import android.nfc.NfcAdapter;
  6 import android.nfc.Tag;
  7 import android.nfc.tech.MifareClassic;
  8 import android.os.Bundle;
  9 import android.widget.TextView;
 10 
 11 public class activity extends Activity {
 12     NfcAdapter nfcAdapter;
 13     TextView promt;
 14     @Override
 15     public void onCreate(Bundle savedInstanceState) {
 16         super.onCreate(savedInstanceState);
 17         setContentView(R.layout.main);
 18         promt = (TextView) findViewById(R.id.promt);
 19         // 获取默认的NFC控制器
 20         nfcAdapter = NfcAdapter.getDefaultAdapter(this);
 21         if (nfcAdapter == null) {
 22             promt.setText("设备不支持NFC!");
 23             finish();
 24             return;
 25         }
 26         if (!nfcAdapter.isEnabled()) {
 27             promt.setText("请在系统设置中先启用NFC功能!");
 28             finish();
 29             return;
 30         }
 31     }
 32 
 33     @Override
 34     protected void onResume() {
 35         super.onResume();
 36         //得到是否检测到ACTION_TECH_DISCOVERED触发
 37         if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(getIntent().getAction())) {
 38             //处理该intent
 39             processIntent(getIntent());
 40         }
 41     }
 42     //字符序列转换为16进制字符串
 43     private String bytesToHexString(byte[] src) {
 44         StringBuilder stringBuilder = new StringBuilder("0x");
 45         if (src == null || src.length <= 0) {
 46             return null;
 47         }
 48         char[] buffer = new char[2];
 49         for (int i = 0; i < src.length; i++) {
 50             buffer[0] = Character.forDigit((src[i] >>> 4) & 0x0F, 16);
 51             buffer[1] = Character.forDigit(src[i] & 0x0F, 16);
 52             System.out.println(buffer);
 53             stringBuilder.append(buffer);
 54         }
 55         return stringBuilder.toString();
 56     }
 57 
 58     /**
 59      * Parses the NDEF Message from the intent and prints to the TextView
 60      */
 61     private void processIntent(Intent intent) {
 62         //取出封装在intent中的TAG
 63         Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
 64         for (String tech : tagFromIntent.getTechList()) {
 65             System.out.println(tech);
 66         }
 67         boolean auth = false;
 68         //读取TAG
 69         MifareClassic mfc = MifareClassic.get(tagFromIntent);
 70         try {
 71             String metaInfo = "";
 72             //Enable I/O operations to the tag from this TagTechnology object.
 73             mfc.connect();
 74             int type = mfc.getType();//获取TAG的类型
 75             int sectorCount = mfc.getSectorCount();//获取TAG中包含的扇区数
 76             String typeS = "";
 77             switch (type) {
 78             case MifareClassic.TYPE_CLASSIC:
 79                 typeS = "TYPE_CLASSIC";
 80                 break;
 81             case MifareClassic.TYPE_PLUS:
 82                 typeS = "TYPE_PLUS";
 83                 break;
 84             case MifareClassic.TYPE_PRO:
 85                 typeS = "TYPE_PRO";
 86                 break;
 87             case MifareClassic.TYPE_UNKNOWN:
 88                 typeS = "TYPE_UNKNOWN";
 89                 break;
 90             }
 91             metaInfo += "卡片类型:" + typeS + "\n共" + sectorCount + "个扇区\n共"
 92                     + mfc.getBlockCount() + "个块\n存储空间: " + mfc.getSize() + "B\n";
 93             for (int j = 0; j < sectorCount; j++) {
 94                 //Authenticate a sector with key A.
 95                 auth = mfc.authenticateSectorWithKeyA(j,
 96                         MifareClassic.KEY_DEFAULT);
 97                 int bCount;
 98                 int bIndex;
 99                 if (auth) {
100                     metaInfo += "Sector " + j + ":验证成功\n";
101                     // 读取扇区中的块
102                     bCount = mfc.getBlockCountInSector(j);
103                     bIndex = mfc.sectorToBlock(j);
104                     for (int i = 0; i < bCount; i++) {
105                         byte[] data = mfc.readBlock(bIndex);
106                         metaInfo += "Block " + bIndex + " : "
107                                 + bytesToHexString(data) + "\n";
108                         bIndex++;
109                     }
110                 } else {
111                     metaInfo += "Sector " + j + ":验证失败\n";
112                 }
113             }
114             promt.setText(metaInfo);
115         } catch (Exception e) {
116             e.printStackTrace();
117         }
118     }
119 }
View Code

 

参考联接:

http://developer.android.com/guide/topics/nfc/nfc.html

http://developer.android.com/reference/android/nfc/tech/MifareClassic.html

http://www.imobilebbs.com/wordpress/?p=2822

http://blog.csdn.net/pku_android/article/details/7430788

http://tieba.baidu.com/p/4163274922

 

posted @ 2016-10-09 20:02  肆万零叁佰贰拾  阅读(1187)  评论(0编辑  收藏  举报