NFC即近场通讯功能,NFC是Near Field Communication缩写,即近距离无线通讯技术。由飞利浦公司和索尼公司共同开发的NFC是一种非接触式识别和互联技术,可以在移动设备、消费类电子产品、PC 和智能控件工具间进行近距离无线通信。NFC 提供了一种简单、触控式的解决方案,可以让消费者简单直观地交换信息、访问内容与服务。NFC技术允许电子设备之间进行非接触式点对点数据传输,在十厘米(3.9英吋)内,交换数据,其传输速度有106Kbit/秒、212Kbit/秒或者424Kbit/秒三种。NFC工作模式有卡模式(Card emulation)、点对点模式(P2P mode)和读卡器模式(Reader/writer mode)。NFC和蓝牙都是短程通信技术,而且都被集成到移动电话。但NFC不需要复杂的设置程序。NFC也可以简化蓝牙连接。NFC 略胜 Bluetooth 的地方在于设置程序较短,但无法达到Blutooth的低功率。NFC的最大数据传输量是 424 kbit/s 远小于 Bluetooth V2.1 (2.1 Mbit/s)。虽然NFC在传输速度与距离比不上BlueTooth,但是NFC技术不需要电源,对于移动电话或是行动消费性电子产品来说,NFC的使用比较方便。
NFC还优于红外和蓝牙传输方式。作为一种面向消费者的交易机制,NFC比红外更快、更可靠而且简单得多,不用向红外那样必须严格的对齐才能传输数据。与蓝牙相比,NFC面向近距离交易,适用于交换财务信息或敏感的个人信息等重要数据;蓝牙能够弥补NFC通信距离不足的缺点,适用于较长距离数据通信。因此,NFC和蓝牙互为补充,共同存在。事实上,快捷轻型的NFC协议可以用于引导两台设备之间的蓝牙配对过程,促进了蓝牙的使用。
NFC是一种提供轻松、安全、迅速的通信的无线连接技术,其传输范围比RFID小,RFID的传输范围可以达到几米、甚至几十米,但由于NFC采取了独特的信号衰减技术,相对于RFID来说NFC具有距离近、带宽高、能耗低等特点。 其次,NFC与现有非接触智能卡技术兼容,目前已经成为得到越来越多主要厂商支持的正式标准。再次,NFC还是一种近距离连接协议,提供各种设备间轻松、安全、迅速而自动的通信。与无线世界中的其他连接方式相比,NFC是一种近距离的私密通信方式。最后,RFID更多的被应用在生产、物流、跟踪、资产管理上,而NFC则在门禁、公交、手机支付等领域内发挥着巨大的作用。
现在刚兴起的NFC手机内置NFC芯片,组成RFID模块的一部分,可以当作RFID无源标签使用———用来支付费用;也可以当作RFID读写器———用作数据交换与采集。NFC技术支持多种应用,包括移动支付与交易、对等式通信及移动中信息访问等。通过NFC手机,人们可以在任何地点、任何时间,通过任何设备,与他们希望得到的娱乐服务与交易联系在一起,从而完成付款,获取海报信息等。NFC设备可以用作非接触式智能卡、智能卡的读写器终端以及设备对设备的数据传输链路,其应用主要可分为以下四个基本类型:用于付款和购票、用于电子票证、用于智能媒体以及用于交换、传输数据。
RFID
RFID(射频识别:radio frequency identification)是一种非接触式的自动识别技术,它通过射频信号自动识别目标对象并获取相关数据,识别工作无须人工干预,作为条形码的无线版本,RFID技术具有条形码所不具备的防水、防磁、耐高温、使用寿命长、读取距离大、标签上数据可以加密、存储数据容量更大、存储信息更改自如等优点,其应用将给零售、物流等产业带来革命性变化。
NFC 1. Supported tag technologies
TagTechnology NfcA NfcB NfcF NfcV IsoDep Ndef NdefFormatable
2. Optional supported tag technologies
MifareClassic MifareUltralight
详细内容 http://developer.android.com/intl/zh-cn/guide/topics/connectivity/nfc/advanced-nfc.html
for example : MifareClassic
//convert character sequence to hexadecimal
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);
Log.i(TAG, "bytesToHexString--->" + buffer);
stringBuilder.append(buffer);
}
Log.i(TAG, "StringBuilder--->" + stringBuilder.toString());
return stringBuilder.toString();
}
private void processIntent(Intent intent) {
//get the tag from intent
StringBuffer sbuffer = new StringBuffer();
Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
for (String tech : tagFromIntent.getTechList()) {
Log.i(TAG,"processIntent tagFromIntent.getTechList()" + tech);
sbuffer.append(tech + "\n");
}
//for example :MifareClassic
boolean auth = false;
MifareClassic mfc = MifareClassic.get(tagFromIntent);
String metaInfo = "";
try {
mfc.connect();
int type = mfc.getType();//obtain TAG's type
int sectorCount = mfc.getSectorCount();//obtain TAG's sectorCounts
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 i = 0; i < sectorCount; i++) {
auth = mfc.authenticateSectorWithKeyA(i, MifareClassic.KEY_DEFAULT);
int bCount;
int bIndex;
if(auth){
metaInfo += "Sector" + i + ":验证成功\n";
bCount = mfc.getBlockCountInSector(i);
bIndex = mfc.sectorToBlock(i);
for (int j = 0; j < bCount; j++) {
byte[] data = mfc.readBlock(bIndex);
metaInfo += "Block" + bIndex + ":"
+ bytesToHexString(data) + "\n";
bIndex ++;
}
}else {
// metaInfo += "Sector" + i +":验证失败\n";
}
}
Log.i(TAG,"NFC-->metaInfo--:" + metaInfo);
promt_dialog.setText(sbuffer.append(metaInfo));
} catch (Exception e) {
e.printStackTrace();
}finally{
try{
mfc.close();
}catch (IOException e){
e.printStackTrace();
}
}
}