廣播(advertising)
設備A要跟設備B建立連接之前,設備B需要先進行廣播,即設備B不斷發送廣播信號,t為廣播間隔。沒發送一次廣播包,稱為一次廣播事件,因此t也稱為廣播事件間隔。按照藍牙spec,實際上每一個廣播事件包含三個廣播包,即分別在37/38/39三個射頻通道上同時廣播相同的信息。
設備B不斷廣播信號,同時設備A也要開啟掃描窗口,當設備A的接口窗口跟廣播發送窗口匹配成功,而且廣播頻道與掃描頻道是同一個頻道時,才能接收到設備B的廣播信號
建立連接(connection establishment)
advertiser發送完一個廣播包之后150us(T_IFS),advertiser必須開啟一段時間的射頻Rx窗口,以接收來自observer的數據包。Observer就可以在這段時間里給advertiser發送連接請求。如下圖所示,手機在第三個廣播事件的時候掃到了設備B,並發出了連接請求CONN_REQ(CONN_REQ又稱為CONNECT_IND)。
詳細連接過程:
手機在收到A1廣播包ADV_IND后,以此為初始錨點(這個錨點不是連接的錨點),T_IFS時間后給Advertiser發送一個connection request命令,即A2數據包,告訴advertiser我將要過來連你,請做好准備。Advertiser根據connect_req命令信息做好接收准備,connect_req包含如下關鍵信息:
- Transmit window offset,定義如圖5所示
- Transmit window size,定義如圖5所示
- connect_req數據包完整定義如下所示
connect_req其實是在告訴advertiser,手機將在Transmit Window期間發送第一個同步包(P1)給你,請在這段時間里把你的射頻接收窗口打開。設備B收到P1后,T_IFS時間后將給手機回復數據包P2(ACK包)。一旦手機收到數據包P2,連接即可認為建立成功。當然,實際情況會比較復雜,手機有可能收不到P2,這個時候手機將持續發送同步包直到超時時間(supervision timeout)到,在此期間只要設備B回過一次ACK包,連接即算成功。所以一旦P1包發出,主機(手機)即認為連接成功,而不管有沒有收到設備的ACK包。
后續手機將以P1為錨點(原點),Connection Interval為周期,周期性地給設備B發送數據包(Packet),Packet除了充當數據傳送功能,它還有如下兩個非常重要的功能:
- 同步手機和設備的時鍾,也就是說,設備每收到手機發來的一個包,都會把自己的時序原點重新設置,以跟手機同步。
- 告訴設備你現在可以傳數據給我了。連接成功后,BLE通信將變成主從模式,因此把連接發起者(手機)稱為Master或者Central,把被連接者(之前的Advertiser)稱為Slave或者Peripheral。BLE通信之所以為主從模式,是因為Slave不能“隨性”給Master發信息,它只有等到Master給它發了一個packet后,然后才能在規定的時間把自己的數據回傳給Master。
連接失敗:
有幾種經典情況:
1.如果slave在transmit window期間沒有收到master發過來的P1,那么連接將會失敗
2.如果master在transmit window期間把P1發出來了,也就是說master按照connect_req約定的時序把P1發出來了,但slave沒有把P2回過去或者沒有在超時時間內把P2回過去,那么連接也會失敗。
3.如果master把P1發出來了,slave也把P2回過去了,此時主機或者從機還是報連接失敗,這種情況有可能是軟件有問題。
4.空中射頻干擾太大。此時應該找一個干凈的環境,比如屏蔽室,排除干擾后再去測試連接是否正常。
Connection events:
連接成功后,master和slave在每一個connection interval開始的時候,都必須交互一次,即master給slave發一個包,slave再給master發一個包,整個交互過程稱為一個connection event或者gap event。藍牙芯片只有在connection event期間才把射頻模塊打開,此時功耗比較高,其余時間藍牙芯片都是處於idle狀態的,因此藍牙芯片平均功耗就非常低。Master不可能時時刻刻都有數據發給slave,所以master大部分時候都是發的空包(empty packet)給slave。同樣slave也不是時時刻刻都有數據給master,因此slave回復給master的包大部分時候也是空包。另外在一個connection event期間,master也可以發多個包給slave,以提高吞吐率。
Slave latency:
如上圖所示出現slave latency(slave latency = 1),在每一個connection interval開始的時候,Master和Slave必須交互一次,哪怕兩者之間交互的是empty packet(空包),但如果slave定義了slave latency,比如slave latency = 9,此時slave可以每9個connection interval才回復一次master,也就是說slave可以在前面8個connection interval期間一直睡眠,直到第9個connection interval到來之后,才回復一個packet給master,這樣將大大節省slave的功耗,提高電池續航時間。當然如果slave有數據需要上報給master,它也可以不等到第9個connection interval才上報,直接像正常情況進行傳輸即可,這樣既節省了功耗,又提高了數據傳輸的實時性。
GAP層角色總結:
在BLE通信過程中,隨着時間的推移,他們的狀態在發生變化,兩者的關系也在發生變化,為此藍牙spec根據不同的時間段或者狀態給手機和設備B取不同的名字,即GAP層定義了如下角色:
- advertiser。 發出廣播的設備
- observer或者scanner。可以掃描廣播的設備
- initiator。能發起連接的設備
- master或者central。連接成功后的主設備,即主動發起packet的設備
- slave或者peripheral。連接成功后的從設備,即被動回傳packet的設備
如上圖所示通過時間把observer,initiator和central串起來了,其實這三個角色是相互獨立的,也就是說一個設備可以只支持observer角色,而不支持initiator和central角色。同樣也把advertiser和peripheral串起來了,其實advertiser和peripheral也是相互獨立的,即一個設備可以只作為advertiser角色,而不支持peripheral角色。