Android学习笔记之NFC近距离无线通讯技术(Dean)

简介: 首先要弄清楚NFC是什么? NFC是Near Field Communication缩写,即近距离无线通讯技术。由飞利浦公司和索尼公司共同开发的NFC是一种非接触式识别和互联技术,可以在移动设备、消费类电子产品、PC 和智能控件工具间进行近距离无线通信。
首先要弄清楚NFC是什么?

img_75067774823165b5ab6f5648ece7e948.jpg

NFC是Near Field Communication缩写,即近距离无线通讯技术。由飞利浦公司和索尼公司共同开发的NFC是一种非接触式识别和互联技术,可以在移动设备、消费类电子产品、PC 和智能控件工具间进行近距离无线通信。NFC 提供了一种简单、触控式的解决方案,可以让消费者简单直观地交换信息、访问内容与服务。

NFC 将非接触读卡器、非接触卡和点对点(Peer-to-Peer)功能整合进一块单芯片,为消费者的生活方式开创了不计其数的全新机遇。这是一个开放接口平台,可以对无线网络进行快速、主动设置,也是虚拟连接器,服务于现有蜂窝状网络、蓝牙和无线 802.11 设备。
  NFC可兼容索尼公司的FeliCaTM卡以及已广泛建立的非接触式智能卡架构,该架构基于ISO 14443 A,使用飞利浦的MIFARE?技术。
  为了推动 NFC 的发展和普及,飞利浦、索尼和诺基亚创建了一个非赢利性的行业协会——NFC 论坛,促进 NFC 技术的实施和标准化,确保设备和服务之间协同合作。目前,NFC 论坛在全球拥有 70 多个成员,包括:万事达卡国际组织、松下电子工业有限公司、微软公司、摩托罗拉公司、NEC 公司、瑞萨科技公司、三星公司、德州仪器制造公司和 Visa 国际组织。
  编者注:NFC全球最早的商用发布: * 德国,美因茨交通公司(RMV) 2006年4月19日,飞利浦、诺基亚、Vodafone公司及德国法兰克福美因茨地区的公交网络运营商美因茨交通公司(Rhein-Main Verkehrsverbund)宣布,在成功地进行为期10个月的现场试验后,近距离无线通信(NFC)技术即将投入商用。目前,Nokia 3220手机已集成了NFC技术,可以用作电子车票,还可在当地零售店和旅游景点作为折扣忠诚卡使用。哈瑙市的大约95.000位居民现在只需轻松地刷一下兼容手机,就能享受NFC式公交移动售票带来的便利。

  与RFID一样,NFC信息也是通过频谱中无线频率部分的电磁感应耦合方式传递,但两者之间还是存在很大的区别。首先,NFC是一种提供轻松、安全、迅速的通信的无线连接技术,其传输范围比RFID小,RFID的传输范围可以达到几米、甚至几十米,但由于NFC采取了独特的信号衰减技术,相对于 RFID来说NFC具有距离近、带宽高、能耗低等特点。 其次,NFC与现有非接触智能卡技术兼容,目前已经成为得到越来越多主要厂商支持的正式标准。再次,NFC还是一种近距离连接协议,提供各种设备间轻松、安全、迅速而自动的通信。与无线世界中的其他连接方式相比,NFC是一种近距离的私密通信方式。最后,RFID更多的被应用在生产、物流、跟踪、资产管理上,而NFC则在门禁、公交、手机支付等领域内发挥着巨大的作用。
  同时,NFC还优于红外和蓝牙传输方式。作为一种面向消费者的交易机制,NFC比红外更快、更可靠而且简单得多,不用向红外那样必须严格的对齐才能传输数据。与蓝牙相比,NFC面向近距离交易,适用于交换财务信息或敏感的个人信息等重要数据;蓝牙能够弥补NFC通信距离不足的缺点,适用于较长距离数据通信。因此,NFC和蓝牙互为补充,共同存在。事实上,快捷轻型的NFC协议可以用于引导两台设备之间的蓝牙配对过程,促进了蓝牙的使用。
  NFC手机内置NFC芯片,组成RFID模块的一部分,可以当作RFID无源标签使用———用来支付费用;也可以当作RFID读写器——— 用作数据交换与采集。NFC技术支持多种应用,包括移动支付与交易、对等式通信及移动中信息访问等。通过NFC手机,人们可以在任何地点、任何时间,通过任何设备,与他们希望得到的娱乐服务与交易联系在一起,从而完成付款,获取海报信息等。NFC设备可以用作非接触式智能卡、智能卡的读写器终端以及设备对设备的数据传输链路,其应用主要可分为以下四个基本类型:用于付款和购票、用于电子票证、用于智能媒体以及用于交换、传输数据。

我们来看一下NFC在Android代码中的位置:
1.frameworks/base/core/java/android/nfc
ErrorCodes.java

This class defines all the error codes that can be returned by the service and producing an exception on the application level. These are needed since binders does not support exceptions.
弄了个iserror方法 定义了一堆小于0的常量!等于0就success
    public static boolean isError(int code) {
        if (code < 0) {
            return true;
        } else {
            return false;
        }
    }

TagLostException.java
FormatException.java

自定义的一个类型转化异常!
public FormatException(String message) {
        super(message);
    }
自己抛出异常

LlcpPacket.java

Represents a LLCP packet received in a LLCP Connectionless communication
LLCP –其在定義一個通訊協定,以管理架構在ISO 18092/NFC IP-1的NFC設備間的邏輯連結,當然這個通訊協定主要是為了Peer-to-Peer模式下,設備間通訊時使用。
private final int mRemoteSap;private final byte[] mDataBuffer;

NdefMessage.java
Represents an NDEF (NFC Data Exchange Format) data message that contains one or more 
数据的数据交换格式
public NdefMessage(byte[] data) throws FormatException {
        mRecords = null;  // stop compiler complaints about final field
        if (parseNdefMessage(data) == -1) {
            throw new FormatException("Error while parsing NDEF message");
        }
    }
private native int parseNdefMessage(byte[] data);

NdefRecord.java
逻辑记录数据交换的格式。

    private final byte mFlags;

    private static final byte FLAG_MB = (byte) 0x80;
    private static final byte FLAG_ME = (byte) 0x40;
    private static final byte FLAG_CF = (byte) 0x20;
    private static final byte FLAG_SR = (byte) 0x10;
    private static final byte FLAG_IL = (byte) 0x08;

    private final short mTnf; 表示格式如何解读型态栏位
    private final byte[] mType;描述了记录格式
    private final byte[] mId;一个唯一的标识符备案
    private final byte[] mPayload;实际数据的有效载荷

    private native int parseNdefRecord(byte[] data);
    private native byte[] generate(short flags, short tnf, byte[] type, byte[] id, byte[] data);

NfcAdapter.java

Represents the device's local NFC adapter.

NfcManager.java

High level manager used to obtain an instance of an
其实只有一个getDefaultAdapter()说明NfcAdapter其实正扮演着manager的角色

NfcSecureElement.java

This class provides the primary API for managing all aspects Secure Element.Get an instance of this class by calling Context.getSystemService(Context.NFC_SERVICE).
这个类提供了主要的API的管理所有安全方面的元素

Tag.java
Represents a (generic) discovered tag.
    /*package*/ final byte[] mId;The tag identifier
    /*package*/ final int[] mTechList;
    /*package*/ final String[] mTechStringList;
    /*package*/ final Bundle[] mTechExtras;
    /*package*/ final int mServiceHandle;  // for use by NFC service, 0 indicates a mock
    /*package*/ final INfcTag mTagService;
    /*package*/ int mConnectedTechnology;

public Tag(byte[] id, int[] techList, Bundle[] techListExtras, int serviceHandle,
            INfcTag tagService) {
        if (techList == null) {
            throw new IllegalArgumentException("rawTargets cannot be null");
        }
        mId = id;
        mTechList = Arrays.copyOf(techList, techList.length);
        mTechStringList = generateTechStringList(techList);
        // Ensure mTechExtras is as long as mTechList
        mTechExtras = Arrays.copyOf(techListExtras, techList.length);
        mServiceHandle = serviceHandle;
        mTagService = tagService;

        mConnectedTechnology = -1;
    }

TechListParcel.java
private String[][] mTechLists;
    public TechListParcel(String[]... strings) {
        mTechLists = strings;
    }


TransceiveResult.java

Class used to pipe transceive result from the NFC service.
    private final boolean mTagLost;
    private final boolean mSuccess;
    private final byte[] mResponseData;

ILlcpConnectionlessSocket.aidl
ILlcpServiceSocket.aidl
ILlcpSocket.aidl
INfcAdapter.aidl
INfcSecureElement.aidl
INfcTag.aidl
IP2pInitiator.aidl
IP2pTarget.aidl
LlcpPacket.aidl
NdefMessage.aidl
NdefRecord.aidl
Tag.aidl
TechListParcel.aidl
TransceiveResult.aidl



2.frameworks/base/core/java/android/nfc/tech
NFC Protocol Bindings –在Peer-to-Peer模式下,NFC Forum不自己另定高層的資料傳輸協定,而是直接使用其他既有的資料傳輸協定,如IP、OBEX等,來實現該模式下設備間資料的傳輸。 

BasicTagTechnology.java
A base class for tag technologies that are built on top of transceive().
这个应该是最顶端的transceive()方法!IsoDep.java NfcA.javaNfcB.javaNfcF.javaNfcV.java全部调用此方法实现!
    /*package*/ final Tag mTag;
    /*package*/ boolean mIsConnected;
    /*package*/ int mSelectedTechnology;

IsoDep.java

 A low-level connection to a {@link Tag} using the ISO-DEP technology, also known as ISO1443-4.

MifareClassic.java

即Philips的Mifare,现有悠游卡即属此类

MifareUltralight.java

Ndef.java

NDEF – NFC Data Exchange Format (NDEF) 主要在定義一個簡潔與共同的資料格式,此資料格式將可作為NFC設備在讀取標籤(Tag)資料時的一個依據。此規格於2006年便完成制定並已公告。 
目前整個NFC相關技術規格標準的制定,主要是由NFC Forum負責
下圖為NFC Forum所展示的NFC技術規格架構
[img]https://yqfile.alicdn.com/img_75067774823165b5ab6f5648ece7e948.jpg[/img]

A high-level connection to a {@link Tag} using one of the NFC type 1, 2, 3, or 4 technologies to interact with NDEF data. MiFare Classic cards that present NDEF data may also be used via this class. To determine the exact technology being used call

NdefFormatable.java

An interface to a {@link Tag} allowing to format the tag as NDEF.

NfcA.java

A low-level connection to a {@link Tag} using the NFC-A technology, also known as ISO1443-3A.

NfcB.java

A low-level connection to a {@link Tag} using the NFC-B technology, also known as ISO1443-3B.

NfcF.java

A low-level connection to a {@link Tag} using the NFC-F technology, also known as JIS6319-4.

NfcV.java

A low-level connection to a {@link Tag} using NFC vicinity technology, also known as ISO15693.

TagTechnology.java
最上层的接口这里定义集中协议类型的标识 继承closeable便于克隆
拥有方法getTag connect reconnect close isConnected
 


这里涉及到几个协议一起来看一下
img_103dc5a2557fd68a132fa41183757eca.png

img_6b40226248f08758a223804da4b4bea2.png

img_f3ff5e17b1108c39bf38d6902f750bcc.png

img_48f6f0d3b2e60cb0a606e5ea3313e281.png

img_65ee8de1473218f26338a8797319fc23.png

3.frameworks/base/core/java/com/android/internal/nfc

LlcpConnectionlessSocket.java


LlcpException.java

LlcpServiceSocket.java

LlcpSocket.java

NfcException.java

P2pDevice.java
P2pDevice is the abstract base class for all supported P2P targets the
NfcManager can handle.

P2pInitiator.java

P2pInitiator represents the initiator in an NFC-IP1 peer-to-peer
communication.

P2pTarget.java
P2pTarget represents the target in an NFC-IP1 peer-to-peer communication.

目录
相关文章
|
1月前
|
缓存 Java Android开发
技术实现,Android技术功底不够如何去面试
技术实现,Android技术功底不够如何去面试
|
1月前
|
Java Android开发
五面拿下阿里飞猪offer,Android技术篇
五面拿下阿里飞猪offer,Android技术篇
五面拿下阿里飞猪offer,Android技术篇
|
1月前
|
前端开发 Android开发 iOS开发
【Flutter前端技术开发专栏】Flutter在Android与iOS上的性能对比
【4月更文挑战第30天】Flutter 框架实现跨平台移动应用,通过一致的 UI 渲染(Skia 引擎)、热重载功能和响应式框架提高开发效率和用户体验。然而,Android 和 iOS 的系统差异、渲染机制及编译过程影响性能。性能对比显示,iOS 可能因硬件优化提供更流畅体验,而 Android 更具灵活性和广泛硬件支持。开发者可采用代码、资源优化和特定平台优化策略,利用性能分析工具提升应用性能。
【Flutter前端技术开发专栏】Flutter在Android与iOS上的性能对比
|
2天前
|
安全 Android开发 iOS开发
Android vs iOS:移动操作系统的技术比较与未来发展
本文深入探讨了Android和iOS这两大主流移动操作系统的技术特点和差异,从架构设计、安全性、开发环境、用户体验等多个方面进行详细分析。通过对比两者在市场份额、生态系统建设以及未来发展方向上的表现,本文将为读者提供一个全面的视角,以便更好地理解这两种操作系统的当前地位和未来潜力。
|
16天前
|
机器学习/深度学习 传感器 vr&ar
探索安卓与iOS平台下的虚拟现实技术发展
随着移动设备的普及和技术的不断进步,安卓和iOS平台上的虚拟现实(VR)技术发展迅速。本文将探讨安卓与iOS平台下虚拟现实技术的最新进展,包括技术特点、应用场景以及未来发展趋势。
24 0
|
16天前
|
机器学习/深度学习 Linux 5G
揭秘安卓系统背后的技术奇迹
【5月更文挑战第31天】本文将深入探讨安卓系统背后的技术原理,从其发展历程、核心架构到最新的技术创新,全面解析安卓系统的技术魅力。通过对比分析,我们将揭示安卓系统在移动设备领域的独特优势和未来发展趋势。
|
16天前
|
物联网 区块链 Android开发
构建高效Android应用:Kotlin与Jetpack的实践之路未来技术的融合潮流:区块链、物联网与虚拟现实的交汇点
【5月更文挑战第30天】 在移动开发领域,效率和性能始终是开发者追求的核心。随着技术的不断进步,Kotlin语言以其简洁性和现代化特性成为Android开发的新宠。与此同时,Jetpack组件为应用开发提供了一套经过实践检验的库、工具和指南,旨在简化复杂任务并帮助提高应用质量。本文将深入探索如何通过Kotlin结合Jetpack组件来构建一个既高效又稳定的Android应用,并分享在此过程中的最佳实践和常见陷阱。
|
18天前
|
安全 网络安全 Android开发
安卓应用开发:打造流畅的用户体验网络安全与信息安全:防御前线的技术与意识
【5月更文挑战第29天】在移动应用市场中,用户对流畅体验的要求日益提高。针对安卓平台,开发者需深入理解系统原理、内存管理及性能优化策略。本文旨在探讨安卓应用开发中的关键技术和工具,包括布局优化、内存泄漏防治以及使用Kotlin语言的优势,以期为读者提供实用的性能提升指导和实践建议。
|
19天前
|
物联网 区块链 vr&ar
构建高效Android应用:Kotlin协程的实践指南未来交织:新兴技术趋势与跨领域应用探索
【5月更文挑战第28天】随着移动应用开发的不断进步,开发者寻求更高效、更简洁的方式来处理异步任务和提升用户体验。在Android平台上,Kotlin协程作为一种轻量级的线程管理方案,提供了强大的工具来简化并发和异步编程。本文将深入探讨Kotlin协程的核心概念,并通过实例演示如何在Android应用中利用协程优化性能和响应性。通过本文,你将学会如何运用协程来编写更加流畅和高效的代码,同时减少内存消耗和提高应用的稳定性。 【5月更文挑战第28天】 随着科技的迅猛发展,一系列创新技术如区块链、物联网(IoT)、虚拟现实(VR)等正在逐渐从概念验证走向实际应用。这些技术的融合与交叉不仅预示着信息时
|
20天前
|
存储 人工智能 安全
移动应用与系统:探索开发与操作系统的融合安卓应用开发:打造高效用户界面的关键技术
【5月更文挑战第27天】 随着移动互联网的飞速发展,移动应用和操作系统已经成为了我们日常生活中不可或缺的一部分。本文将深入探讨移动应用开发的关键要素,以及移动操作系统的核心功能。我们将分析移动应用开发的挑战和机遇,并讨论移动操作系统如何适应不断变化的技术环境。通过深入研究这些主题,我们希望为读者提供对移动应用和系统领域的全面理解。