天天看點

[NFC]LLCP協定介紹1     LLC概述2     LLC協定3     LLCP鍊路1     LLC概述2     LLC協定3     LLCP鍊路

       依照學習流程,此章節主要介紹NFCForum中LLCP Spec。主要是将LLCP spec中重要的内容摘要出來,包含的内容肯定不是很全面,但基本上看代碼是夠用了。主要分為三部分:

        1.LLC概述

        2.LLC協定

        3.LLCP鍊路

1     LLC概述

        LLC:(logicallink control)按照網絡協定的層次劃分,就是其中的資料鍊層,用圖表表示如下:

[NFC]LLCP協定介紹1     LLC概述2     LLC協定3     LLCP鍊路1     LLC概述2     LLC協定3     LLCP鍊路

        依據資料傳輸模式,可以劃分為:

        1.      面向連接配接傳輸

        2.      無連接配接傳輸

        依據連接配接的種類分:

        Class1:無連接配接傳輸

        Class2:面向連接配接傳輸

        Class3:無連接配接傳輸和面向連接配接傳輸

2     LLC協定

        由于LLCP Spec有49頁,目前研究的是1.2版本,主要從以下幾個方面進行解讀:

2.1   LLC封包格式:

2.1.1   服務通路點(Service AccessPoint)

        其中服務通路點(Service Access Point)表征不同的服務,具體說明如下:

[NFC]LLCP協定介紹1     LLC概述2     LLC協定3     LLCP鍊路1     LLC概述2     LLC協定3     LLCP鍊路

        細化00h-0Fh如下:

                00h:用于LLC管理子產品,不能用于任何SAP

                01h:用于服務發現協定(Service Discovery Protocol),對應服務名urn:nfc:sn:sdp

                04h:用于SNEP協定(Simple NDEF ExchangeProtocol),對應服務名:urn:nfc:sn:snep

2.1.2   類型PTYPE

        其中PTYPE表征目前資訊的類型,為較好說明問題,簡單整理如下:

PDU TYPE PTYPE EXPLAIN SEQUENCE INFORMATION
SYMM 0000 可用于防止link timeout X X
PAX 0001 交換參數資訊 X V
AGF 0010 将資料拆包後發送,至少需要2個PDU X V
UI 0011 無編号資訊 X V
CONNECT 0100 連接配接請求 X V
DISC 0101 斷開連接配接 X X
CC 0110 連接配接完成,資訊域含有參數資訊 X V
DM 0111 斷開模式,在CONNECT指令無法執行時回複,并且帶有REASON字段 X V
FRMR 1000 拒絕,會帶flag說明拒絕原因 X V
I 1100 有效資訊,含N(S),N(R) V V
RR 1101 可以接收資料 V X
RNR 1110 暫時無法接受資料 V X
SNL 1001 服務名查詢 X V

        備注: X表示不含此field,V表示含有此field

每種TYPE的封包格式如下:

SYMM:

[NFC]LLCP協定介紹1     LLC概述2     LLC協定3     LLCP鍊路1     LLC概述2     LLC協定3     LLCP鍊路

PAX:

[NFC]LLCP協定介紹1     LLC概述2     LLC協定3     LLCP鍊路1     LLC概述2     LLC協定3     LLCP鍊路

AGF:

[NFC]LLCP協定介紹1     LLC概述2     LLC協定3     LLCP鍊路1     LLC概述2     LLC協定3     LLCP鍊路

UI:

[NFC]LLCP協定介紹1     LLC概述2     LLC協定3     LLCP鍊路1     LLC概述2     LLC協定3     LLCP鍊路

CONNECT:

[NFC]LLCP協定介紹1     LLC概述2     LLC協定3     LLCP鍊路1     LLC概述2     LLC協定3     LLCP鍊路

DISC:

[NFC]LLCP協定介紹1     LLC概述2     LLC協定3     LLCP鍊路1     LLC概述2     LLC協定3     LLCP鍊路

CC:

[NFC]LLCP協定介紹1     LLC概述2     LLC協定3     LLCP鍊路1     LLC概述2     LLC協定3     LLCP鍊路

DM:

[NFC]LLCP協定介紹1     LLC概述2     LLC協定3     LLCP鍊路1     LLC概述2     LLC協定3     LLCP鍊路

其中DM的reason字段說明如下:

[NFC]LLCP協定介紹1     LLC概述2     LLC協定3     LLCP鍊路1     LLC概述2     LLC協定3     LLCP鍊路

       FRMR:

[NFC]LLCP協定介紹1     LLC概述2     LLC協定3     LLCP鍊路1     LLC概述2     LLC協定3     LLCP鍊路

其中information字段說明

[NFC]LLCP協定介紹1     LLC概述2     LLC協定3     LLCP鍊路1     LLC概述2     LLC協定3     LLCP鍊路

       I:

[NFC]LLCP協定介紹1     LLC概述2     LLC協定3     LLCP鍊路1     LLC概述2     LLC協定3     LLCP鍊路

       RR:

[NFC]LLCP協定介紹1     LLC概述2     LLC協定3     LLCP鍊路1     LLC概述2     LLC協定3     LLCP鍊路

       RNR:

[NFC]LLCP協定介紹1     LLC概述2     LLC協定3     LLCP鍊路1     LLC概述2     LLC協定3     LLCP鍊路

SNL:

[NFC]LLCP協定介紹1     LLC概述2     LLC協定3     LLCP鍊路1     LLC概述2     LLC協定3     LLCP鍊路

2.1.3   資訊域(Information)

        介紹完PTYPE,就到Information域中的說明了,所有information中的資訊都遵循TLV格式(type,length,value),spec整理了下面的table友善大家了解:

[NFC]LLCP協定介紹1     LLC概述2     LLC協定3     LLCP鍊路1     LLC概述2     LLC協定3     LLCP鍊路

       同樣,針對上面的名稱,分别說明其格式:

VERSION:

[NFC]LLCP協定介紹1     LLC概述2     LLC協定3     LLCP鍊路1     LLC概述2     LLC協定3     LLCP鍊路

MIUX:當information中的長度大于預設值128時,系統會發送IMUX給對方告知自身能力,對方會依據IMUX+128計算出實際接收的容量

[NFC]LLCP協定介紹1     LLC概述2     LLC協定3     LLCP鍊路1     LLC概述2     LLC協定3     LLCP鍊路

WKS:依據SAP中00h-0Fh定義,每bit對應一個sap

[NFC]LLCP協定介紹1     LLC概述2     LLC協定3     LLCP鍊路1     LLC概述2     LLC協定3     LLCP鍊路

LTO:預設為100ms,機關是10ms,表征上次收到資料和此次發送資料的時間差

[NFC]LLCP協定介紹1     LLC概述2     LLC協定3     LLCP鍊路1     LLC概述2     LLC協定3     LLCP鍊路

RW:預設為1,表示每個I PDU都要回複,0表示不接收I PDU

[NFC]LLCP協定介紹1     LLC概述2     LLC協定3     LLCP鍊路1     LLC概述2     LLC協定3     LLCP鍊路

SN:格式為“urn:nfc:sn:<servicename>”/“urn:nfc:xsn:<domain>:<sn>”

[NFC]LLCP協定介紹1     LLC概述2     LLC協定3     LLCP鍊路1     LLC概述2     LLC協定3     LLCP鍊路

OPT:表征link service class(低2位)或其他(高6位)

[NFC]LLCP協定介紹1     LLC概述2     LLC協定3     LLCP鍊路1     LLC概述2     LLC協定3     LLCP鍊路

SDREQ:

[NFC]LLCP協定介紹1     LLC概述2     LLC協定3     LLCP鍊路1     LLC概述2     LLC協定3     LLCP鍊路

SDRES:

[NFC]LLCP協定介紹1     LLC概述2     LLC協定3     LLCP鍊路1     LLC概述2     LLC協定3     LLCP鍊路

3     LLCP鍊路

        此部分詳細過程請參考Spec第五章,抽取主要部分說明一下。

3.1   MIU說明

        MIU預設值是128,發送端的資訊域大小不應該大于接收端的MIU,接收端收到大于自身MIU的資料時會直接丢棄。雙方各自維護自己和對方的MIU,預設值為128,且滿足MIUX+128=MIU。若收到對方的MIUX,儲存對應的MIU資訊。

3.2   鍊路激活流程

        當MAC層激活完成,并判斷出對端節點帶LLCP能力時,就會來建立LLCP連接配接。MAC層中交換的LLC參數,對于LLCP過程是可見的。

        在LLCP鍊路建立過程中,會先進行version判斷

                1.      Version判斷失敗,則連接配接過程直接斷開

                2.      Version檢查成功,繼續進行MIU的檢查,最後鍊路才建立完成

3.3   PAX流程

        MAC層會知道目前的裝置角色是Initiator/Target:

        1.      Target

                a)       發送MAC中還未交換的parameter資訊,等待對方回複

                b)       收到回複,啟動Version判斷

                c)       Version通過,決定MIU,否則連接配接失敗

        2.      Initiator

                a)       等待對方先發送PAX

                b)       Version檢查通過,決定MIU,并發送PAX PDU

3.3.1   Version檢查

        其中Version檢查的流程如下:

        1.      Major&Minor 都相等  -> OK

        2.      Major相等,Minor不等,取Minor較小的版本  -> OK

        3.      Major&Minor都不相等,由major大的一端決定是否相容,若相容,使用Major小的版本

3.4   Intentional Link Deactivation

        當DISC PDU中的SSAP和DSAP為00h時,發送端發送後,直接斷開本地連接配接,接收端收到後,也可以直接斷開本地連接配接。此類DISC PDU(SSAP和DSAP為00h)不需要等待回複,但其他的DISC PDU(SSAP和DSAP不為00h)需要等待DM PDU。

3.5   鍊路建立流程

        在發送端發送CONNECT PDU,此類PDU(SSAP相同)不能在未收到CC/DM時重複發送。同時,收到CC PDU時,DSAP可能和CONNECT PDU中SSAP會不一緻。

        此時分兩種情況:

        Case1:發送端收到CC PDU,但未收到CONNECT的ACK時:

                I. CC中DSAP和CONNECT中SSAP相等

                        *初始化V(S),V(R),V(SA),V(RA)為0

                        *處理CC PDU中的參數

                        *進入資料傳輸階段

                II. CC中DSAP和CONNECT中SSAP不相等

                        *直接放棄連接配接

        Case2:接收端收到CONNECT PDU時:

                I.  無法處理時,傳回DM PDU

                II.  可處理時

                        *處理CONNECT PDU中的參數

                        *通知上層,并等待上層接收或者拒絕

                                >拒絕時,直接放棄連接配接,并發送DM

                                >接受時,發送CC PDU,V(S),V(R),V(SA),V(RA)為0并開始資料傳輸

       需要注意的是,在資料傳輸階段,任何的CONNECT/CC PDU都會被認為是Invalid。

3.6   服務發現(Service Discover)

        SDREQ一般是出現在SNL PDU中。收到SDREQ後,需要先判斷Service Name是否有注冊,注冊過則回複SDRES,其中含有效SAP及TID,未注冊時,回複SDRES中SAP為全0。

        以上是該Spec大緻的内容,基本上可以涵蓋Android NFC中LLCP的流程。如果有描述不正确的地方,也歡迎大家指正,感謝。

       依照學習流程,此章節主要介紹NFCForum中LLCP Spec。主要是将LLCP spec中重要的内容摘要出來,包含的内容肯定不是很全面,但基本上看代碼是夠用了。主要分為三部分:

        1.LLC概述

        2.LLC協定

        3.LLCP鍊路

1     LLC概述

        LLC:(logicallink control)按照網絡協定的層次劃分,就是其中的資料鍊層,用圖表表示如下:

[NFC]LLCP協定介紹1     LLC概述2     LLC協定3     LLCP鍊路1     LLC概述2     LLC協定3     LLCP鍊路

        依據資料傳輸模式,可以劃分為:

        1.      面向連接配接傳輸

        2.      無連接配接傳輸

        依據連接配接的種類分:

        Class1:無連接配接傳輸

        Class2:面向連接配接傳輸

        Class3:無連接配接傳輸和面向連接配接傳輸

2     LLC協定

        由于LLCP Spec有49頁,目前研究的是1.2版本,主要從以下幾個方面進行解讀:

2.1   LLC封包格式:

2.1.1   服務通路點(Service AccessPoint)

        其中服務通路點(Service Access Point)表征不同的服務,具體說明如下:

[NFC]LLCP協定介紹1     LLC概述2     LLC協定3     LLCP鍊路1     LLC概述2     LLC協定3     LLCP鍊路

        細化00h-0Fh如下:

                00h:用于LLC管理子產品,不能用于任何SAP

                01h:用于服務發現協定(Service Discovery Protocol),對應服務名urn:nfc:sn:sdp

                04h:用于SNEP協定(Simple NDEF ExchangeProtocol),對應服務名:urn:nfc:sn:snep

2.1.2   類型PTYPE

        其中PTYPE表征目前資訊的類型,為較好說明問題,簡單整理如下:

PDU TYPE PTYPE EXPLAIN SEQUENCE INFORMATION
SYMM 0000 可用于防止link timeout X X
PAX 0001 交換參數資訊 X V
AGF 0010 将資料拆包後發送,至少需要2個PDU X V
UI 0011 無編号資訊 X V
CONNECT 0100 連接配接請求 X V
DISC 0101 斷開連接配接 X X
CC 0110 連接配接完成,資訊域含有參數資訊 X V
DM 0111 斷開模式,在CONNECT指令無法執行時回複,并且帶有REASON字段 X V
FRMR 1000 拒絕,會帶flag說明拒絕原因 X V
I 1100 有效資訊,含N(S),N(R) V V
RR 1101 可以接收資料 V X
RNR 1110 暫時無法接受資料 V X
SNL 1001 服務名查詢 X V

        備注: X表示不含此field,V表示含有此field

每種TYPE的封包格式如下:

SYMM:

[NFC]LLCP協定介紹1     LLC概述2     LLC協定3     LLCP鍊路1     LLC概述2     LLC協定3     LLCP鍊路

PAX:

[NFC]LLCP協定介紹1     LLC概述2     LLC協定3     LLCP鍊路1     LLC概述2     LLC協定3     LLCP鍊路

AGF:

[NFC]LLCP協定介紹1     LLC概述2     LLC協定3     LLCP鍊路1     LLC概述2     LLC協定3     LLCP鍊路

UI:

[NFC]LLCP協定介紹1     LLC概述2     LLC協定3     LLCP鍊路1     LLC概述2     LLC協定3     LLCP鍊路

CONNECT:

[NFC]LLCP協定介紹1     LLC概述2     LLC協定3     LLCP鍊路1     LLC概述2     LLC協定3     LLCP鍊路

DISC:

[NFC]LLCP協定介紹1     LLC概述2     LLC協定3     LLCP鍊路1     LLC概述2     LLC協定3     LLCP鍊路

CC:

[NFC]LLCP協定介紹1     LLC概述2     LLC協定3     LLCP鍊路1     LLC概述2     LLC協定3     LLCP鍊路

DM:

[NFC]LLCP協定介紹1     LLC概述2     LLC協定3     LLCP鍊路1     LLC概述2     LLC協定3     LLCP鍊路

其中DM的reason字段說明如下:

[NFC]LLCP協定介紹1     LLC概述2     LLC協定3     LLCP鍊路1     LLC概述2     LLC協定3     LLCP鍊路

       FRMR:

[NFC]LLCP協定介紹1     LLC概述2     LLC協定3     LLCP鍊路1     LLC概述2     LLC協定3     LLCP鍊路

其中information字段說明

[NFC]LLCP協定介紹1     LLC概述2     LLC協定3     LLCP鍊路1     LLC概述2     LLC協定3     LLCP鍊路

       I:

[NFC]LLCP協定介紹1     LLC概述2     LLC協定3     LLCP鍊路1     LLC概述2     LLC協定3     LLCP鍊路

       RR:

[NFC]LLCP協定介紹1     LLC概述2     LLC協定3     LLCP鍊路1     LLC概述2     LLC協定3     LLCP鍊路

       RNR:

[NFC]LLCP協定介紹1     LLC概述2     LLC協定3     LLCP鍊路1     LLC概述2     LLC協定3     LLCP鍊路

SNL:

[NFC]LLCP協定介紹1     LLC概述2     LLC協定3     LLCP鍊路1     LLC概述2     LLC協定3     LLCP鍊路

2.1.3   資訊域(Information)

        介紹完PTYPE,就到Information域中的說明了,所有information中的資訊都遵循TLV格式(type,length,value),spec整理了下面的table友善大家了解:

[NFC]LLCP協定介紹1     LLC概述2     LLC協定3     LLCP鍊路1     LLC概述2     LLC協定3     LLCP鍊路

       同樣,針對上面的名稱,分别說明其格式:

VERSION:

[NFC]LLCP協定介紹1     LLC概述2     LLC協定3     LLCP鍊路1     LLC概述2     LLC協定3     LLCP鍊路

MIUX:當information中的長度大于預設值128時,系統會發送IMUX給對方告知自身能力,對方會依據IMUX+128計算出實際接收的容量

[NFC]LLCP協定介紹1     LLC概述2     LLC協定3     LLCP鍊路1     LLC概述2     LLC協定3     LLCP鍊路

WKS:依據SAP中00h-0Fh定義,每bit對應一個sap

[NFC]LLCP協定介紹1     LLC概述2     LLC協定3     LLCP鍊路1     LLC概述2     LLC協定3     LLCP鍊路

LTO:預設為100ms,機關是10ms,表征上次收到資料和此次發送資料的時間差

[NFC]LLCP協定介紹1     LLC概述2     LLC協定3     LLCP鍊路1     LLC概述2     LLC協定3     LLCP鍊路

RW:預設為1,表示每個I PDU都要回複,0表示不接收I PDU

[NFC]LLCP協定介紹1     LLC概述2     LLC協定3     LLCP鍊路1     LLC概述2     LLC協定3     LLCP鍊路

SN:格式為“urn:nfc:sn:<servicename>”/“urn:nfc:xsn:<domain>:<sn>”

[NFC]LLCP協定介紹1     LLC概述2     LLC協定3     LLCP鍊路1     LLC概述2     LLC協定3     LLCP鍊路

OPT:表征link service class(低2位)或其他(高6位)

[NFC]LLCP協定介紹1     LLC概述2     LLC協定3     LLCP鍊路1     LLC概述2     LLC協定3     LLCP鍊路

SDREQ:

[NFC]LLCP協定介紹1     LLC概述2     LLC協定3     LLCP鍊路1     LLC概述2     LLC協定3     LLCP鍊路

SDRES:

[NFC]LLCP協定介紹1     LLC概述2     LLC協定3     LLCP鍊路1     LLC概述2     LLC協定3     LLCP鍊路

3     LLCP鍊路

        此部分詳細過程請參考Spec第五章,抽取主要部分說明一下。

3.1   MIU說明

        MIU預設值是128,發送端的資訊域大小不應該大于接收端的MIU,接收端收到大于自身MIU的資料時會直接丢棄。雙方各自維護自己和對方的MIU,預設值為128,且滿足MIUX+128=MIU。若收到對方的MIUX,儲存對應的MIU資訊。

3.2   鍊路激活流程

        當MAC層激活完成,并判斷出對端節點帶LLCP能力時,就會來建立LLCP連接配接。MAC層中交換的LLC參數,對于LLCP過程是可見的。

        在LLCP鍊路建立過程中,會先進行version判斷

                1.      Version判斷失敗,則連接配接過程直接斷開

                2.      Version檢查成功,繼續進行MIU的檢查,最後鍊路才建立完成

3.3   PAX流程

        MAC層會知道目前的裝置角色是Initiator/Target:

        1.      Target

                a)       發送MAC中還未交換的parameter資訊,等待對方回複

                b)       收到回複,啟動Version判斷

                c)       Version通過,決定MIU,否則連接配接失敗

        2.      Initiator

                a)       等待對方先發送PAX

                b)       Version檢查通過,決定MIU,并發送PAX PDU

3.3.1   Version檢查

        其中Version檢查的流程如下:

        1.      Major&Minor 都相等  -> OK

        2.      Major相等,Minor不等,取Minor較小的版本  -> OK

        3.      Major&Minor都不相等,由major大的一端決定是否相容,若相容,使用Major小的版本

3.4   Intentional Link Deactivation

        當DISC PDU中的SSAP和DSAP為00h時,發送端發送後,直接斷開本地連接配接,接收端收到後,也可以直接斷開本地連接配接。此類DISC PDU(SSAP和DSAP為00h)不需要等待回複,但其他的DISC PDU(SSAP和DSAP不為00h)需要等待DM PDU。

3.5   鍊路建立流程

        在發送端發送CONNECT PDU,此類PDU(SSAP相同)不能在未收到CC/DM時重複發送。同時,收到CC PDU時,DSAP可能和CONNECT PDU中SSAP會不一緻。

        此時分兩種情況:

        Case1:發送端收到CC PDU,但未收到CONNECT的ACK時:

                I. CC中DSAP和CONNECT中SSAP相等

                        *初始化V(S),V(R),V(SA),V(RA)為0

                        *處理CC PDU中的參數

                        *進入資料傳輸階段

                II. CC中DSAP和CONNECT中SSAP不相等

                        *直接放棄連接配接

        Case2:接收端收到CONNECT PDU時:

                I.  無法處理時,傳回DM PDU

                II.  可處理時

                        *處理CONNECT PDU中的參數

                        *通知上層,并等待上層接收或者拒絕

                                >拒絕時,直接放棄連接配接,并發送DM

                                >接受時,發送CC PDU,V(S),V(R),V(SA),V(RA)為0并開始資料傳輸

       需要注意的是,在資料傳輸階段,任何的CONNECT/CC PDU都會被認為是Invalid。

3.6   服務發現(Service Discover)

        SDREQ一般是出現在SNL PDU中。收到SDREQ後,需要先判斷Service Name是否有注冊,注冊過則回複SDRES,其中含有效SAP及TID,未注冊時,回複SDRES中SAP為全0。

        以上是該Spec大緻的内容,基本上可以涵蓋Android NFC中LLCP的流程。如果有描述不正确的地方,也歡迎大家指正,感謝。

nfc

繼續閱讀