1. 程式人生 > >藍芽學習筆記之建立藍芽連線的過程

藍芽學習筆記之建立藍芽連線的過程

傳送廣播資料包的叫廣播發起者(advertisers),在廣播通道接收廣播資料包但沒意向連線廣播發起裝置的叫掃描者( scanners), 需要連線到另一個裝置的裝置叫做 initiators,它監聽可連線的廣播資料包。如果advertiser正在使用一個可連線的廣播事件, initiator在收到連線資料包的物理通道上發起一個連線請求,如果advertiser接受這個連線請求則這個廣播事件結束,並且開始一個新的連線事件。一旦連線建立,initiator成為主裝置,advertiser成為從裝置。連線事件被用於在主從裝置之間傳輸資料包。 連線過程: 廣播者:廣播包使用ADV_IND PDU標誌;
掃描者:傳送掃描請求(SCAN_REQ PDU)請求關於廣播者的資訊一個SCAN_REQ PDU(包含了掃描者的裝置地 址), 在同一通道上回復一個SCAN_RSP PDU; 發起者: 發起者傳送連線請求(CONNECT_REQ PDU)請求進入連線態,廣播者確認即可以連線上。

(圖片均來自技術文件 供參考用) 

        SCAN_REQ_PDU載荷如下圖所示,由ScanA(掃描裝置地址)和AdvA組成(廣播裝置地址),ScanA是掃描裝置的公共或隨機地址(由TxAdd確定),AdvA是廣播裝置的公共或隨機地址(由RxAdd確定)。

                                                 圖2:掃描請求PDU載荷

  廣播報文的報頭中的TxAdd指示了掃描裝置使用的是公共地址(Public Address)還是隨機地址(Random Address)。

  • TxAdd = 0:公共地址。
  • TxAdd = 1:隨機地址。

  RxAdd指示了廣播裝置使用的是公共地址(Public Address)還是隨機地址(Random Address)。

  • RxAdd = 0:公共地址。
  • RxAdd = 1:隨機地址。

1.2. 掃描響應

  SCAN_RSQ_PDU載荷如下圖所示,由AdvA(廣播裝置地址)和ScanRspData組成(掃描響應資料),AdvA是廣播裝置的公共或隨機地址(由TxAdd確定)。

                                                    圖3:掃描響應PDU載荷

  廣播報文的報頭中的TxAdd指示了廣播裝置使用的是公共地址(Public Address)還是隨機地址(Random Address)。

  • TxAdd = 0:公共地址。
  • TxAdd = 1:隨機地址。

  廣播報文的長度域指示了載荷的位元組數(AdvA和ScanRspData)。

2. SCAN_REQ和SCAN_RSP解析

2.1. 捕獲SCAN_REQ

  按照《藍芽4.0BLE抓包(一)》中的描述進行抓包,下面是我們捕獲一個心率計的SCAN_REQ包。

                                                   圖4:捕獲的SCAN_REQ包

2.2. 分析SCAN_REQ

  為了方便分析,我們先取出這個SCAN_REQ包實際傳輸的資料,如圖3中所示。心率計完整的廣播報文如下:

  D6 BE 89 8E 83 0C 7F 0F 72 DD DF 68 DA B5 E9 D2 CC F3 BD BF 27

  在分析資料之前,再次說明:廣播包含掃描請求和掃描響應,所以掃描請求和掃描響應得包格式遵循廣播包的格式。

     分析報文時,需要注意一下報文各個域的位元組序。

2.1.1 接入地址

  D6 BE 89 8E:接入地址,對廣播來說是固定值。注意一下這裡的位元組序,接入地址傳輸時是低位元組在前的。

2.1.2 PDU

    1). 83:廣播報文報頭。

  • bit0~bit3是0011,說明廣播型別是SCAN_REQ,即掃描請求。
  • bit7(RxAdd)是1:說明廣播裝置使用的是隨機地址。
  • bit6(TxAdd)是0:說明掃描裝置使用的是公共地址。

 2). 0C:長度,表示SCAN_REQ報文的長度是12個位元組。

3). 7F 0F 72 DD DF 68:掃描裝置的公共地址(報頭裡的TxAdd指示了這個地址是公共地址)。這裡使用的實驗裝置是[艾克姆科技]的EN-nRF51DK開發板和小米3手機,掃描裝置是小米3手機,在圖3中可以看到該公共地址對應的是Xiao_mico_72。

4). DA B5 E9 D2 CC F3:廣播裝置的地址(報頭裡的RxAdd指示了這個地址是隨機地址)。

2.1.3 校驗 

   BD BF 27:24位元組CRC校驗。

2.3. 捕獲SCAN_RSP

按照《藍芽4.0BLE抓包(一)》中的描述進行抓包,捕獲一個心率計的SCAN_REQ包。

                                                  圖5:捕獲的SCAN_RSP包

2.4. 分析SCAN_RSP

  同樣,在這裡我們先取出SCAN_REQ包的資料,便於分析。

  D6 BE 89 8E 44 06 DA B5 E9 D2 CC F3 61 6A 0F

2.4.1 接入地址

  D6 BE 89 8E:接入地址,對廣播來說是固定值。注意一下這裡的位元組序,接入地址傳輸時是低位元組在前的。

2.4.2 PDU

    1). 44:廣播報文報頭。

  • bit0~bit3是0100,說明廣播型別是SCAN_RSP,即掃描響應。
  • bit6(TxAdd)是1:說明廣播裝置使用的是隨機地址。

    2). 06:長度,表示SCAN_ RSP報文的長度是6個位元組。

    3). DA B5 E9 D2 CC F3:廣播裝置的地址(報頭裡的RxAdd指示了這個地址是隨機地址)。

2.4.3 校驗 

   61 6A 0F:24位元組CRC校驗。

 3.連線請求CONNECT_REQ

在低功耗藍芽技術建立連線的過程中,裝置都是成對出現的:master和slave裝置。如果master希望與slave建立連線,master就需要發起連線請求(ConnectionRequest,CONNECT_REQ)因此master可以稱之為連線發起者;同時,slave必須是可連線的並且具有解析連線請求CONNECT_REQ的能力,slave可以稱之為廣播者。圖1是連線請求CONNECT_REQ的幀結構。

圖1 CONNECT_REQ幀結構

其中,InitA是連線發起者的藍芽裝置地址,長度為6位元組;AdvA是廣播者的藍芽裝置地址,長度為6位元組。除了InitA和AdvA之外,幀格式中最為重要的部分則是LLData,這一部分包含了在連線建立過程中所需要使用的有意義的引數。

為了更好的理解連線請求CONNECT_REQ,我們可以在日常生活中找到類似的一個例子,幫助我們理解它的含義。讀者們很多應該都有過工作經驗,在開始新的工作之前,都需要和僱主簽署一份勞動合同,而CONNECT_REQ就是一份由“僱主”master提供的“勞動合同”,只需經過“僱員”slave確認,這份“合同”就開始生效,低功耗藍芽技術的連線也就建立了。接下來我們就對“合同”中的各項條款逐條進行分析(如圖2所示)。


圖2 LLData示意圖

(1)接入地址(AA:Access Address)

這份合同的第一條款就是為僱員分配一個公司內部的唯一識別碼,類似於工號,僱員可以在公司內部使用這一工號;當僱員離開公司之後,唯一識別碼自動失效;即使是這一僱員再次加入到這家公司,他/她的新工號也與舊的工號不同。類似的,在兩個低功耗藍芽技術裝置建立連線之前,master裝置負責生成接入地址,這一地址類似於一個4位元組的隨機數,當連線建立之後,master和slave都使用這一接入地址進行通訊;當連線斷開之後,接入地址自動失效。

(2)CRCInit(CRC初始值)

這份“合同”的第二條款是CRCInit,它就是僱員在公司內部的一個金鑰,通過這個金鑰,僱員可以訪問公司內部的資源。對於低功耗藍芽技術裝置,master和slave使用CRCIinit來驗證資料包的完整性。

(3)WinSize和WinOffset

合同的第三條款中規範了僱員首次來公司報到的時間以及今後每次工作的時長。WinSize和WinOffset在低功耗藍芽技術連線中,也做了類似的定義。WinOffset定義了在CONNECT_REQ命令之後的一個通訊視窗的偏移量,如圖3所示。在slave裝置收到CONNECT_REQ之後,slave裝置需要佔用一些時間、根據LLData引數進行一些相關的配置,因此,WinOffeset為slave裝置進行此種操作提供了時間,transmitWindowOffset= WinOffset×1.25 ms。WinSize定義了裝置每次開啟收發機的視窗時間,無論是master還是slave,它們都遵循WinSize的定義,視窗時間transmitWindowSize=WinSize×1.25 ms。

因此,在CONNECT_REQ之後,第一個由master傳送到slave的資料幀,我們稱之為“錨點”(如圖3所示),因為之後的所有的連線事件都以這一時刻為基準,呈現週期性變化。從紅色框圖中我們可以看到,第一個資料幀的時刻不能早於(1.25ms+transmitWindowOffset),同時也不能晚於(1.25 ms + transmitWindowOffset + transmitWindowSize)。


圖3 發起連線時序圖

(4)Interval, Latency & Timeout

一般情況下,人們的工作時間是朝九晚五,一週工作五天。但是在低功耗藍芽技術的連線機制當中,我們採用了更加靈活的“彈性工作制”。對於低功耗藍芽技術連線的彈性工作制,這裡有三個引數需要了解,Interval,Lantency和Timeout。


圖4 連線事件時序圖

在連線建立之後,master和slave之間的資料互動我們可以稱之為連線事件,連線事件的發生週期(connInterval)則是由Interval引數來進行設定,connInterval= Interval×1.25 ms, connInterval的取值範圍則是在7.5 ms至4 s秒之間。因此,在確定了錨點之後,master和slave將按照connInterval確定的時間間隔進行資料的互動,如圖4所示。

但是,對於低功耗藍芽技術,低功耗的特性是需要特別考慮的,而且在實際的應用當中,不需要在每次connInterval都產生連線事件,因此引入了引數Lantancy,可以有效的減少連線事件的產生,connSlaveLatency= Latency。connSlaveLatency 定義了slave裝置可以忽略多少個連續的連線事件,其不需要在這些被忽略的連線事件中偵聽來自master的資料包,這也意味著slave裝置不需要在每個連線事件產生的時刻都喚醒並開啟射頻接收機進行偵聽,所以可以有效減少slave裝置的功耗。這也是低功耗藍芽技術能夠實現其低功耗特性的一個重要的原因。

Timeout引數定義了連線超時的長度,connSupervisionTimeout= Timeout×10 ms,其取值範圍在100 ms至32 s之間。不論是master還是slave,在其收到一個數據幀之後,如果等待了connSupervisionTimeout時長都沒有下一個資料幀到來,則可以認為連線已經斷開。在這裡要強調的是,connSupervisionTimeout必須大於(1 + connSlaveLatency) × connInterval × 2,否則,slave裝置即使是在Lantency狀態,也會被誤認為是連線超時,導致連線誤斷開。

(5)ChM & Hop

我們都知道,藍芽使用的是跳頻技術,當連線建立之後,master和slave裝置就需要利用某種機制來在預先設定的通道圖譜上、按照預先設定的跳頻跨度進行跳頻工作,通道圖譜就來自ChM引數,每跳的跨度則來自於Hop引數。Hop是一個整數,取值範圍在5至16之間。下面的公式提供了跳頻的工作方式:


整合多個技術文章學習後總結的在一起供大家學習 也是算是給自己做的筆記!