1. 程式人生 > >Android學習筆記之NFC近距離無線通訊技術(Dean)

Android學習筆記之NFC近距離無線通訊技術(Dean)

首先要弄清楚NFC是什麼? 

 

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 
Java程式碼  收藏程式碼
  1. ErrorCodes.java  
  2. 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.  
  3. 弄了個iserror方法 定義了一堆小於0的常量!等於0就success  
  4.     public static boolean isError(int code) {  
  5.         if
     (code < 0) {  
  6.             return true;  
  7.         } else {  
  8.             return false;  
  9.         }  
  10.     }  
  11. TagLostException.java  
  12. FormatException.java  
  13. 自定義的一個型別轉化異常!  
  14. public FormatException(String message) {  
  15.         super(message);  
  16.     }  
  17. 自己丟擲異常  
  18. LlcpPacket.java  
  19. Represents a LLCP packet received in a LLCP Connectionless communication  
  20. LLCP –其在定義一個通訊協定,以管理架構在ISO 18092/NFC IP-1的NFC裝置間的邏輯連結,當然這個通訊協定主要是為了Peer-to-Peer模式下,裝置間通訊時使用。  
  21. private final int mRemoteSap;private final byte[] mDataBuffer;  
  22. NdefMessage.java  
  23. Represents an NDEF (NFC Data Exchange Format) data message that contains one or more   
  24. 資料的資料交換格式  
  25. public NdefMessage(byte[] data) throws FormatException {  
  26.         mRecords = null;  // stop compiler complaints about final field  
  27.         if (parseNdefMessage(data) == -1) {  
  28.             throw new FormatException("Error while parsing NDEF message");  
  29.         }  
  30.     }  
  31. private native int parseNdefMessage(byte[] data);  
  32. NdefRecord.java  
  33. 邏輯記錄資料交換的格式。  
  34.     private final byte mFlags;  
  35.     private static final byte FLAG_MB = (byte0x80;  
  36.     private static final byte FLAG_ME = (byte0x40;  
  37.     private static final byte FLAG_CF = (byte0x20;  
  38.     private static final byte FLAG_SR = (byte0x10;  
  39.     private static final byte FLAG_IL = (byte0x08;  
  40.     private final short mTnf; 表示格式如何解讀型態欄位  
  41.     private final byte[] mType;描述了記錄格式  
  42.     private final byte[] mId;一個唯一的識別符號備案  
  43.     private final byte[] mPayload;實際資料的有效載荷  
  44.     private native int parseNdefRecord(byte[] data);  
  45.     private native byte[] generate(short flags, short tnf, byte[] type, byte[] id, byte[] data);  
  46. NfcAdapter.java  
  47. Represents the device's local NFC adapter.  
  48. NfcManager.java  
  49. High level manager used to obtain an instance of an  
  50. 其實只有一個getDefaultAdapter()說明NfcAdapter其實正扮演著manager的角色  
  51. NfcSecureElement.java  
  52. 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).  
  53. 這個類提供了主要的API的管理所有安全方面的元素  
  54. Tag.java  
  55. Represents a (generic) discovered tag.  
  56.     /*package*/ final byte[] mId;The tag identifier  
  57.     /*package*/ final int[] mTechList;  
  58.     /*package*/ final String[] mTechStringList;  
  59.     /*package*/ final Bundle[] mTechExtras;  
  60.     /*package*/ final int mServiceHandle;  // for use by NFC service, 0 indicates a mock  
  61.     /*package*/ final INfcTag mTagService;  
  62.     /*package*/ int mConnectedTechnology;  
  63. public Tag(byte[] id, int[] techList, Bundle[] techListExtras, int serviceHandle,  
  64.             INfcTag tagService) {  
  65.         if (techList == null) {  
  66.             throw new IllegalArgumentException("rawTargets cannot be null");  
  67.         }  
  68.         mId = id;  
  69.         mTechList = Arrays.copyOf(techList, techList.length);  
  70.         mTechStringList = generateTechStringList(techList);  
  71.         // Ensure mTechExtras is as long as mTechList  
  72.         mTechExtras = Arrays.copyOf(techListExtras, techList.length);  
  73.         mServiceHandle = serviceHandle;  
  74.         mTagService = tagService;  
  75.         mConnectedTechnology = -1;  
  76.     }  
  77. TechListParcel.java  
  78. private String[][] mTechLists;  
  79.     public TechListParcel(String[]... strings) {  
  80.         mTechLists = strings;  
  81.     }  
  82. TransceiveResult.java  
  83. Class used to pipe transceive result from the NFC service.  
  84.     private final boolean mTagLost;  
  85.     private final boolean mSuccess;  
  86.     private final byte[] mResponseData;  
  87. ILlcpConnectionlessSocket.aidl  
  88. ILlcpServiceSocket.aidl  
  89. ILlcpSocket.aidl  
  90. INfcAdapter.aidl  
  91. INfcSecureElement.aidl  
  92. INfcTag.aidl  
  93. IP2pInitiator.aidl  
  94. IP2pTarget.aidl  
  95. LlcpPacket.aidl  
  96. NdefMessage.aidl  
  97. NdefRecord.aidl  
  98. Tag.aidl  
  99. TechListParcel.aidl  
  100. TransceiveResult.aidl  


2.frameworks/base/core/java/android/nfc/tech 
Java程式碼  收藏程式碼
  1. NFC Protocol Bindings –在Peer-to-Peer模式下,NFC Forum不自己另定高層的資料傳輸協定,而是直接使用其他既有的資料傳輸協定,如IP、OBEX等,來實現該模式下裝置間資料的傳輸。   
  2. BasicTagTechnology.java  
  3. A base class for tag technologies that are built on top of transceive().  
  4. 這個應該是最頂端的transceive()方法!IsoDep.java NfcA.javaNfcB.javaNfcF.javaNfcV.java全部呼叫此方法實現!  
  5.     /*package*/ final Tag mTag;  
  6.     /*package*/ boolean mIsConnected;  
  7.     /*package*/ int mSelectedTechnology;  
  8. IsoDep.java  
  9.  A low-level connection to a {@link Tag} using the ISO-DEP technology, also known as ISO1443-4.  
  10. MifareClassic.java  
  11. 即Philips的Mifare,現有悠遊卡即屬此類  
  12. MifareUltralight.java  
  13. Ndef.java  
  14. NDEF – NFC Data Exchange Format (NDEF) 主要在定義一個簡潔與共同的資料格式,此資料格式將可作為NFC裝置在讀取標籤(Tag)資料時的一個依據。此規格於2006年便完成制定並已公告。   
  15. 目前整個NFC相關技術規格標準的制定,主要是由NFC Forum負責  
  16. 下圖為NFC Forum所展示的NFC技術規格架構  
  17. [img]http://dl.iteye.com/upload/attachment/471075/a760e498-60e7-398c-8f23-e7bae2f0f83a.jpg[/img]  
  18. A high-level connection to a {@link Tag} using one of the NFC type 123, 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  
  19. NdefFormatable.java  
  20. An interface to a {@link Tag} allowing to format the tag as NDEF.  
  21. NfcA.java  
  22. A low-level connection to a {@link Tag} using the NFC-A technology, also known as ISO1443-3A.  
  23. NfcB.java  
  24. A low-level connection to a {@link Tag} using the NFC-B technology, also known as ISO1443-3B.  
  25. NfcF.java  
  26. A low-level connection to a {@link Tag} using the NFC-F technology, also known as JIS6319-4.  
  27. NfcV.java  
  28. A low-level connection to a {@link Tag} using NFC vicinity technology, also known as ISO15693.  
  29. TagTechnology.java  
  30. 最上層的介面這裡定義集中協議型別的標識 繼承closeable便於克隆  
  31. 擁有方法getTag connect reconnect close isConnected  


這裡涉及到幾個協議一起來看一下 
 

 

 

 

 

Java程式碼  收藏程式碼
  1. 3.frameworks/base/core/java/com/android/internal/nfc  
  2. LlcpConnectionlessSocket.java  
  3. LlcpException.java  
  4. LlcpServiceSocket.java  
  5. LlcpSocket.java  
  6. NfcException.java  
  7. P2pDevice.java  
  8. P2pDevice is the abstract base class for all supported P2P targets the  
  9. NfcManager can handle.  
  10. P2pInitiator.java  
  11. P2pInitiator represents the initiator in an NFC-IP1 peer-to-peer  
  12. communication.  
  13. P2pTarget.java  
  14. P2pTarget represents the target in an NFC-IP1 peer-to-peer communication.  

相關推薦

Android學習筆記NFC距離無線通訊技術Dean

首先要弄清楚NFC是什麼?   NFC是Near Field Communication縮寫,即近距離無線通訊技術。由飛利浦公司和索尼公司共同開發的NFC是一種非接觸式識別和互聯技術,可以在移動裝置、消費類電子產品、PC 和智慧控制元件工具間進行近距離無線通訊。NFC 提供了一種簡單、觸控式的解決方案,可以

NFC--距離無線通訊技術(1)

摘要 這篇文章給出NFC在安全和保密手段的一個總體綜述。 首先,介紹NFC是如何工作的。討論NFC的硬體結構、標準通訊方式和相關國際標準。 在主要的部分,這個工作檢測NFC的安全及安全風險檢驗,總結了有關安全措施和安全內建並提出一個重要安全綜合通訊協議。 最後,這個工作展示

LWIP學習筆記用戶編程接口NETCONN(八)

socket api con 數據 實現 學習 數據緩存 用戶 soc 一、定時事件 1、定時結構 2、定時鏈表 3、內核進程 4、處理定時事件 二、消息機制 1、消息結構 2、數據包消息 3、協議棧API實現 4、API消息 三、協議棧接口 1、用戶數據緩存netbuf

程世東老師TensorFlow實戰——個性化推薦,程式碼學習筆記資料匯入&資料預處理

程式碼來自於知乎:https://zhuanlan.zhihu.com/p/32078473 /程式碼地址https://github.com/chengstone/movie_recommender/blob/master/movie_recommender.ipynb 下一篇有一些資料的

程世東老師TensorFlow實戰——個性化推薦,程式碼學習筆記資料匯入&資料預處理

這篇主要是進行程式碼中的一些數值視覺化,幫助理解 程式碼來自於知乎:https://zhuanlan.zhihu.com/p/32078473 /程式碼地址https://github.com/chengstone/movie_recommender/blob/master/movie_re

資料結構與演算法學習筆記 提高讀取效能的連結串列

前言   連結串列(Linked list)比陣列稍微複雜一點,在我們生活中用到最常見的應該是快取,它是一種提高資料讀取效能的技術,常見的如cpu快取,瀏覽器快取,資料庫快取等。今天我們就來學習一下連結串列 正文 一、連結串列的定義? 1.一種線性表(資料排成像一條線一樣的結構。每個線性表上的資料最多

學習筆記aop基於IOC容器的配置MSTzhang

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"     xmlns:xsi="http://www.w3.org/2001/XMLSchema-

Opencv學習筆記十二——漫水填充法floodFill

首先感謝@淺墨_毛星雲,本篇博文是小武通過學習@淺墨_毛星雲的部落格以及書籍《opencv3.0程式設計入門》整理的筆記及疑問心得,小武水平有限,歡迎交流。定義:漫水填充法是一種用特定的顏色填充聯通區域,通過設定可連通畫素的上下限以及連通方式來達到不同的填充效果的方法。漫水填

《Javascript權威指南》學習筆記十七:BOM新成就1--client存儲數據Storage實現

globals 機制 ng- url new onclick views watermark -c 版權聲明:本文為博主原創文章。未經博主同意不得轉載。 https://blog.csdn

android學習筆記ImageView的scaleType屬性

有關 sni mage nds 目標 big ins 分辨率 處理 我們知道,ImageView有一個屬性叫做scaleType,它的取值一共同擁有八種,各自是:matrix,fitXY。fitStart,fitCenter。fitEnd,center,centerCr

Android 學習筆記SharedPreference

andro 使用 googl Edito 獲取 存儲 dep ont print Android 學習筆記之SharedPreference SharedPreference作為android常用的四種存儲方式之一,在輕量級的使用中比較常見 創建、獲取sharedprefe

Android學習筆記IntentService

activit update 使用 pac .get ger foo 異步 tex Android學習筆記之IntentService IntentService是繼承並處理異步請求的一個類,IntentService內有一個工作線程來處理耗時操作,啟動IntentServ

Android學習筆記效能優化SparseArray

學習內容: 1.Android中SparseArray的使用..     昨天研究完橫向二級選單,發現其中使用了SparseArray去替換HashMap的使用.於是乎自己查了一些相關資料,自己同時對效能進行了一些測試。首先先說一下SparseArray的原理.

Android學習筆記詳細講解畫圓角圖片

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Android學習筆記RadioButton RadioGroup

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Android學習筆記百度地圖駕車路線搜尋及RouteOverlay步行路線搜尋及RouteOverlay

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Android學習筆記為Dialog自定義佈局,並說明空指標問題

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Android學習筆記Bitmap點陣圖雖觸控點移動

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

android學習筆記fragment

為什麼引入fragment? 為了適應使用者或裝置的 需求,activity介面可以在執行時組裝,甚至重新組裝。 activity自身並不具有這樣的靈活性。activity檢視可以在執行時切換,但控制檢視的程式碼必須 在activity中實現。結果,各個act

android學習筆記託管UI fragment

為託管UI fragment,activity必須: 在其佈局中為fragment的檢視安排位置; 管理fragment例項的生命週期。 fragment的生命週期 。類似於activity的生命週期,它具有停止、暫停以及執行 狀態,也