1. 程式人生 > >Bluetooth(藍芽)連線過程分析

Bluetooth(藍芽)連線過程分析

一 基本概念

  藍芽的連線過程是十分重要的,特別是做藍芽的技術人員來說,這個是十分重要的。理它的流程,是一件必修課。雖然進入藍芽行業很久了,以前沒怎麼系統化的做一些事情,趁此機會,就梳理一下這裡面的內容吧。
  在paging流程結束之後,連結管理流程(LMP)一般就啟動了,剛開始會完成時鐘校準,版本,支援特性,名字和一些連線狀態的初始化。paging 裝置(裝置A)會首先發起一個LMP_host_connection_req PDU.當另外一個裝置(裝置B)接收到這個訊息時,會通知上層接收這個連線資訊,裝置B這時會相應的回一個接受連線(LMP accedpted PDU)或拒絕連線(LMP_not_accepted PDU)。 於此同時,如果這個從裝置(slave)需要一個role switch, 它就會在接收到一個連線請求幀(LMP_host_connection_req PDU)之後,傳送一個clock 偏轉資訊(LMP_slot_offset PDU)和 轉換請求幀(LMP_switch_req PDU).如果role switch 成功,舊的slave裝置會回覆一個接受連線或者拒絕連線的命令。如果失敗,對方就會發送一個拒絕role switch 的訊息,原因碼為(0x14)。

  如果發起paging 的裝置接收到一個對方拒絕連線的訊息。它就會立即傳送(LMP_detach)通過傳送一個來斷開連結。
如果從裝置接受了主裝置的連線請求。藍芽加密過程就有可能會被喚起(因為這個是可選專案,要根據主裝置或者從裝置的連線需求來定的)。如果沒有加密的需求,主裝置就會發送連線完成的訊息給從裝置,等兩個裝置都發送完連線完成的訊息之後,系統底層的連線過程就算是結束了。整個流程如下圖所示:

  

二 流程分析

  其實,藍芽的連結流程比較複雜,和wifi相比,它多了很多可選項,這就導致看起來特別複雜。所以,在學習的時候,一定要有化繁為簡的思維,從最簡單的入手,下面的圖就是完整的藍芽連線流程圖,如下所示。這個流程圖向我們揭示了整個連線流程,乍一看,還是非常複雜的。假如你把這個流程分成兩個步驟來看,就比較簡單了,先看實線的部分,這個就是基本的連線過程,並且是必不可少的三個步驟。就是建立連線,連線請求,建立連線,斷開連線四個步驟,每個步驟都是有請求和回覆,這樣理解就比較簡單了。那些可選項,很多適合軟體的關係不大的,重點只需要瞭解一下role switch和data flow。別的在有問題的時候,再翻一下協議棧看看估計就明白了,東西不多的。這樣梳理一下,是不是你的藍芽連線流程就清楚了?

  還有一個比較形象的描述,就像我們的銷售美女拜訪客戶的過程:

第一回合:起動連線:

美女銷售: 確認過眼神,是對的人。那就主動一點吧。先拋個媚眼,說聲你好。
客戶:環顧四周,好像是在給我說話呢。只能做個回答了。答應還是拒絕,就看人家對你的印象了。答應了,你好,請問有什麼事情嗎?
另外一種悲劇的結果:正在忙,不想理你,就直接回復了。不好意思,我不認識你。一口就回絕了。就沒有後面的事情了。

第二個回合:連線請求:

美女銷售: 我是XXX,什麼公司的,想要根據什麼產品的什麼東西和你溝通一下啊,能否有時間,聊一下?
客戶: 就看客戶的心情了。老總答應了,那就會給個肯定的答覆,可以接下來談點事情了。

悲劇的結果:不好意思,我正在忙,改天你再來吧。談話結束。

第三個回合:握手認識。

美女銷售:伸出手,握手,算是認識了,接下來切入正題,開始談業務了。
客戶:握手,來會議室聊吧。

三 總結

  做了多年的協議,才發現協議的東西,很多都源於生活。其實,細想一下,本來就是這樣子的。協議的作用就是為了方便人們溝通。它是人設計的,肯定很多東西都是基於人的思維和常用模式來做模型的。知道了這些,把生活中的場景和協議的場景對標起來,估計你很快就知道所謂的協議其實很簡單了。雖然倒騰技術比較枯燥,假如你深入了進去,把產品當作你的孩子來看,估計會增添工作中多很多樂趣的。