BLE鏈路層狀態機初探

浮生問道 發表於 2021-04-20

狀態機


BLE鏈路層把所有的功能放到五種不同的狀態中,在不同的狀態分別執行不同的功能。

一般來說,BLE裝置大致有這麼幾種狀態:空閒,廣播,掃描,發起連線和連線成功。

廣播和掃描是相對應的,一個裝置廣播,另一個裝置掃描,廣播的裝置就會被掃描的裝置發現

當裝置通過掃描成功發現目標裝置後,就會發起連線請求,連線成功之後就進入到已連線的狀態

這其中的“空閒,廣播,掃描,發起連線和連線成功”分別對應鏈路層的 就緒態,廣播態,掃描態,發起態和連線態

下面分別來介紹著五種狀態:

  • 就緒態
  • 廣播態
  • 掃描態
  • 發起態
  • 連線態

就緒態

就緒態,就是鏈路層上電之後,進入並保持的狀態。其實可以理解為空閒狀態。

就緒態的鏈路層什麼也不幹,既不廣播,也不掃描,既不發起連線,也不處於連線狀態。

但是,一旦鏈路層接收到應用層指令,比如,廣播,掃描或發起連線之類的,那麼裝置就會進入到相應的狀態。

一旦裝置空閒下來,則又會進入就緒態

廣播態

廣播態的功能,就是讓周圍裝置能夠發現自己。

處於廣播態的鏈路層會傳送廣播報文,該報文會被周圍裝置搜尋並解析出來,廣播報文的內容包括了裝置是否可被連線,裝置的名字,裝置的地址,裝置提供的服務及其他相關資訊。收到廣播報文的裝置可以傳送回應報文,廣播態的鏈路層還可以監聽這種回應報文,並作出響應

掃描態

掃描態的主要功能,就是發現周圍的裝置。掃描過程可以分為主動掃描和被動掃描。

被動掃描,就是監聽(廣播)通道,並且不會向周圍傳送任何報文,周圍裝置傳送的非定向廣播報文都可以被接收到。非定向報文是指,沒有指定報文接收地址的報文。

主動掃描,就是主動發出掃描請求的報文,處於廣播狀態的鏈路層會監聽這種報文,並且對方收到報文後會發出回應報文,這種回應報文是定向報文,只能被髮出掃描請求的裝置接收並解析出來。

打個不太恰當的比方,假如在一個月黑風高的晚上,你進入到一所黑乎乎的大房子裡,由於沒有燈光,一開始你並不知道房子裡面有沒有人,或者有幾個人,為了知道房間有沒有人,現在你有兩種方式:

  • 你不發出任何聲音,通過聽覺去辨別周圍環境中有沒有人聲,有幾個人聲,這就是被動掃描
  • 現在你也可以吼一嗓子:“有人嗎?”,看看周圍有沒有人給你回應,這就是主動掃描

發起態

發起態,是準備發起連線到連線完成前的一段狀態,它的功能是完成連線所需要的所有過程。

再借用上面的例子打比方:

通過主動掃描和被動掃描這兩種方式,你終於在黑乎乎的大房子裡找到了闊別已久的老朋友,於是你跟他打招呼,並準備握手,這就是發起態

連線態

連線態,顧名思義就是裝置連線建立完成之後的狀態,從應用層的角度來看,兩個裝置已經成功建立了物理連線,並且可以互動使用者資料了。

狀態的切換


BLE鏈路層狀態機初探

從任何其他狀態都可以直接進入到就緒態

就緒態 -> 掃描態

當鏈路層接收到應用層掃描周圍裝置的指令後,進入到掃描態,好比說,鏈路層進入“discovery”模式,用被動或者主動的方式對周圍的小夥伴說“有人麼?周圍有人麼?”

就緒態 -> 廣播態

當鏈路層接收到應用層指令後,進入到廣播態,此時鏈路層彷彿拿著個大喇叭對著周圍的小夥伴呼喊:“我在這,我在這了,快來發現我吧”,態度非常高調

就緒態 -> 發起態

存在兩種從就緒態進入發起態的情形:

  • 裝置一開始在掃描態,並通過掃描周圍裝置發現了想要連線的目標裝置,但是鏈路層並不能直接從掃描態進入到發起態。因此,裝置先進入就緒態,再進入到發起態

  • 裝置一開始就在就緒態,因為上一次跟某個裝置成功建立過連線,現在鏈路層還保留著那個裝置的相關資訊。所以不需要再走掃描裝置的流程,可以直接利用儲存的目標裝置的資訊,直接對其發起連線,因此可以直接從就緒態進入發起態

廣播態 -> 連線態

鏈路層發出的廣播報文被周圍裝置掃描到,並且對方裝置向自己發起連線請求,連線成功之後,處於廣播態的鏈路層就進入到了連線態,從此之後大家就是好朋友,可以相互交流感情了

發起態 -> 連線態

無論是通過主動掃描還是被動掃描,抑或是之前就儲存了對方裝置的相關資訊,處於發起態的鏈路層已經掌握了足夠的資訊,可以向對方發起連線請求了,經過一番握手之後,大家都進入到連線態了,大家就是好buddy了

連線態 -> 就緒態

可能由於某種原因,可能出於自己或者是對方裝置的原因,抑或是距離的原因(異地戀你懂的),大家不想做好朋友了,可能是自己或者對方裝置發出了斷開連線的請求,抑或是超出一定距離,由於藍芽訊號弱,不得不斷開連線。總之就是由於種種主觀的或客觀的原因,連線被斷開了,鏈路層從連線態進入到了就緒態

就緒態無法直接到連線態

就緒態為什麼不能直接跨入到連線態了,因為連線需要一個過程,就好比是談戀愛一樣,總得需要一個過程才能相互確認那女朋友的關係,如果忽略這個過程,直接霸王硬上弓,那是不道德的。因此,對於廣播者來說,是從廣播態進入到連線態,對於發起者來說,是從發起態進入到連線態。這就好比,畢竟男女有別,大家進入戀愛的方式和體驗都是不一樣的