狀態機
BLE鏈路層把所有的功能放到五種不同的狀態中,在不同的狀態分別執行不同的功能。
一般來說,BLE設備大致有這么幾種狀態:空閑,廣播,掃描,發起連接和連接成功。
廣播和掃描是相對應的,一個設備廣播,另一個設備掃描,廣播的設備就會被掃描的設備發現
當設備通過掃描成功發現目標設備后,就會發起連接請求,連接成功之后就進入到已連接的狀態
這其中的“空閑,廣播,掃描,發起連接和連接成功”分別對應鏈路層的 就緒態,廣播態,掃描態,發起態和連接態
下面分別來介紹着五種狀態:
- 就緒態
- 廣播態
- 掃描態
- 發起態
- 連接態
就緒態
就緒態,就是鏈路層上電之后,進入並保持的狀態。其實可以理解為空閑狀態。
就緒態的鏈路層什么也不干,既不廣播,也不掃描,既不發起連接,也不處於連接狀態。
但是,一旦鏈路層接收到應用層指令,比如,廣播,掃描或發起連接之類的,那么設備就會進入到相應的狀態。
一旦設備空閑下來,則又會進入就緒態
廣播態
廣播態的功能,就是讓周圍設備能夠發現自己。
處於廣播態的鏈路層會發送廣播報文,該報文會被周圍設備搜索並解析出來,廣播報文的內容包括了設備是否可被連接,設備的名字,設備的地址,設備提供的服務及其他相關信息。收到廣播報文的設備可以發送回應報文,廣播態的鏈路層還可以監聽這種回應報文,並作出響應
掃描態
掃描態的主要功能,就是發現周圍的設備。掃描過程可以分為主動掃描和被動掃描。
被動掃描,就是監聽(廣播)信道,並且不會向周圍發送任何報文,周圍設備發送的非定向廣播報文都可以被接收到。非定向報文是指,沒有指定報文接收地址的報文。
主動掃描,就是主動發出掃描請求的報文,處於廣播狀態的鏈路層會監聽這種報文,並且對方收到報文后會發出回應報文,這種回應報文是定向報文,只能被發出掃描請求的設備接收並解析出來。
打個不太恰當的比方,假如在一個月黑風高的晚上,你進入到一所黑乎乎的大房子里,由於沒有燈光,一開始你並不知道房子里面有沒有人,或者有幾個人,為了知道房間有沒有人,現在你有兩種方式:
- 你不發出任何聲音,通過聽覺去辨別周圍環境中有沒有人聲,有幾個人聲,這就是被動掃描
- 現在你也可以吼一嗓子:“有人嗎?”,看看周圍有沒有人給你回應,這就是主動掃描
發起態
發起態,是准備發起連接到連接完成前的一段狀態,它的功能是完成連接所需要的所有過程。
再借用上面的例子打比方:
通過主動掃描和被動掃描這兩種方式,你終於在黑乎乎的大房子里找到了闊別已久的老朋友,於是你跟他打招呼,並准備握手,這就是發起態
連接態
連接態,顧名思義就是設備連接建立完成之后的狀態,從應用層的角度來看,兩個設備已經成功建立了物理連接,並且可以交互用戶數據了。
狀態的切換
從任何其他狀態都可以直接進入到就緒態
就緒態 -> 掃描態
當鏈路層接收到應用層掃描周圍設備的指令后,進入到掃描態,好比說,鏈路層進入“discovery”模式,用被動或者主動的方式對周圍的小伙伴說“有人么?周圍有人么?”
就緒態 -> 廣播態
當鏈路層接收到應用層指令后,進入到廣播態,此時鏈路層仿佛拿着個大喇叭對着周圍的小伙伴呼喊:“我在這,我在這了,快來發現我吧”,態度非常高調
就緒態 -> 發起態
存在兩種從就緒態進入發起態的情形:
-
設備一開始在掃描態,並通過掃描周圍設備發現了想要連接的目標設備,但是鏈路層並不能直接從掃描態進入到發起態。因此,設備先進入就緒態,再進入到發起態
-
設備一開始就在就緒態,因為上一次跟某個設備成功建立過連接,現在鏈路層還保留着那個設備的相關信息。所以不需要再走掃描設備的流程,可以直接利用保存的目標設備的信息,直接對其發起連接,因此可以直接從就緒態進入發起態
廣播態 -> 連接態
鏈路層發出的廣播報文被周圍設備掃描到,並且對方設備向自己發起連接請求,連接成功之后,處於廣播態的鏈路層就進入到了連接態,從此之后大家就是好朋友,可以相互交流感情了
發起態 -> 連接態
無論是通過主動掃描還是被動掃描,抑或是之前就保存了對方設備的相關信息,處於發起態的鏈路層已經掌握了足夠的信息,可以向對方發起連接請求了,經過一番握手之后,大家都進入到連接態了,大家就是好buddy了
連接態 -> 就緒態
可能由於某種原因,可能出於自己或者是對方設備的原因,抑或是距離的原因(異地戀你懂的),大家不想做好朋友了,可能是自己或者對方設備發出了斷開連接的請求,抑或是超出一定距離,由於藍牙信號弱,不得不斷開連接。總之就是由於種種主觀的或客觀的原因,連接被斷開了,鏈路層從連接態進入到了就緒態
就緒態無法直接到連接態
就緒態為什么不能直接跨入到連接態了,因為連接需要一個過程,就好比是談戀愛一樣,總得需要一個過程才能相互確認那女朋友的關系,如果忽略這個過程,直接霸王硬上弓,那是不道德的。因此,對於廣播者來說,是從廣播態進入到連接態,對於發起者來說,是從發起態進入到連接態。這就好比,畢竟男女有別,大家進入戀愛的方式和體驗都是不一樣的