一 基本概念
藍牙的連接過程是十分重要的,特別是做藍牙的技術人員來說,這個是十分重要的。理它的流程,是一件必修課。雖然進入藍牙行業很久了,以前沒怎么系統化的做一些事情,趁此機會,就梳理一下這里面的內容吧。
在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,什么公司的,想要根據什么產品的什么東西和你溝通一下啊,能否有時間,聊一下?
客戶: 就看客戶的心情了。老總答應了,那就會給個肯定的答復,可以接下來談點事情了。
悲劇的結果:不好意思,我正在忙,改天你再來吧。談話結束。
第三個回合:握手認識。
美女銷售:伸出手,握手,算是認識了,接下來切入正題,開始談業務了。
客戶:握手,來會議室聊吧。
三 總結
做了多年的協議,才發現協議的東西,很多都源於生活。其實,細想一下,本來就是這樣子的。協議的作用就是為了方便人們溝通。它是人設計的,肯定很多東西都是基於人的思維和常用模式來做模型的。知道了這些,把生活中的場景和協議的場景對標起來,估計你很快就知道所謂的協議其實很簡單了。雖然倒騰技術比較枯燥,假如你深入了進去,把產品當作你的孩子來看,估計會增添工作中多很多樂趣的。