1. 程式人生 > >藍芽基礎知識進階——Link manager對連線的控制

藍芽基礎知識進階——Link manager對連線的控制

1、連線的控制

對連線的控制涉及到很多方面,而最直接的必然是連線的建立和連線的斷開。

1.1 連線的建立

連線建立的過程如下圖2-1所示:

2-1 連線的建立

page過程和一系列的資訊互動之後就是連線的建立。masterpaging的裝置)就會發送LMP_host_connection_req來請求建立連線,slave可以迴應LMP_accepted或者LMP_not_accepted來完成或者拒絕連線的建立。在這之間,其實還可能有一個role switch的過程,一般而言,是在slave收到LMP_host_conenction_req之後傳送slot_offsetswitch_req

PDU。若是role_switch失敗,連線的建立仍然需要繼續,除非paged一方不支援成為slave的角色,會迴應low resource並斷開連線。

         1.2 連線的斷開

藍芽裝置的斷開是可以發生在任何時刻的,它可以由master發起也可以由slave發起。不過有一點,就是他必須有一個理由。因此斷開連線的PDU——LMP_detach有一個error code的部分。

在斷開連線之前,需要先把ACL-U的鏈路暫停,然後把LMP_detach放入到傳輸的佇列中,緊接著發動斷開的一端啟動了一個6*Tpolltimer,若是在這個timer超時前得到對方的ack,則啟動一個

3*Tpolltimer,在3*Tpolltimer超時後,LT_ADDR能夠被re_use(發動斷開端是master)。若是在6*Tpolltimer超時後還沒有得到ack,則丟棄link,啟動一個新的Tlinksupervisiontimeout,這個timeoutLT_ADDRre_use(發動斷開端是master)。

至於在接收端,若是接收端是master,則啟動一個6*Tpolltimer,若是slave,則啟動3*Tpolltimer。這個timer超時後,連線斷開,然後若接收端是master,則LT_ADDR能夠被再次使用。

1.3 Power的控制

         power

的控制是link manager的另外一個重要的工作,雖然說power levelphysical link的一個特性,而link manager是對邏輯鏈路的控制,因此這裡的power控制是physical link上的特定logical linkpower level,他不會影響同一physical link上別的logical linkpower level

         Power的控制有兩種策略,一種是legacy power control,另外一種是enhanced power control。支援enhanced的裝置必須同時也支援legacy的控制策略。

         legacypower control所涉及的PDU如圖2-2所示:

2-2 legacy power controlPDU

很清楚地可以看到incr_power_req就是要求power level增加一格,decr_power_req就是要求power level減少一格。當對端處於max power的時候,你再發送incr_power_req的時候就會回覆max_power,同樣的道理若是處於min power的時候,也會回覆min_power。還有一種情況就是對端不支援power control,則它也會對incrreq回覆max power,而對decrreq回覆min power,當然也有可能回覆unsupported LMP featureerror code

         enhanced power control所涉及的PDU如圖2-3所示:

2-3 enhanced power controlPDU

毫無疑問,enhanced power control只有在兩個裝置都支援的情況下才會使用。在傳送LMP_power_control_req之後,接收端會根據power_adjustment_request的內容來決定是提升一格的power level還是降低一格的power level或者就是直接max power。所以,這個引數有三個值:one step upone step down或者all the way to the max power level。對應的response引數就比較簡單了,它就是用來表示變化後的power level

         1.4 自適應跳頻(AFH

自適應跳頻機制在藍芽中特別重要,他可以降低同樣ISM 2.4G的其它裝置的干擾。AFHPDU如下圖2-4所示。

2-4 AFH PDU

這個PDU的三個引數意義如下:

         AFH_Instant: hopset 切換的時機,其實就是切換的間隔了。他至少要6*Tpoll的大小,且需是偶數。當然了,他的值還需要小於12小時。

AFH_Mode:表明AFH是使能還是不使能。

AFH_Channel_Map: 就是AFH使用的channel map

在收到LMP_set_AFH的第一步就是檢視AFH_Instant是否已經到了,若沒有則立即啟動一個定時器,若是已經到了就立即重設。當AFH_Modeenable的時候,就是用來使能或者重新整理AFH的。若是disable的時候,channel map引數的值就不再重要了。

1.5 通道的類別

AFH就是基於channel的一種機制,通俗地來講我們希望一直在“乾淨”的通道上進行這些傳輸,那什麼是“乾淨”的通道?除了所謂的“乾淨”的通道,還有別的什麼通道呢?這裡就是來說明通道都有哪些型別的。

通道類別的互動使用的PDU如下圖2-5所示:

2-5 通道類別的PDU

顯然req就是請求通道類別的資訊了,他有三個引數:

         AFH_Reporting_Mode:用來確定slave是在AFH_reporting_enable還是AFH_reporting_disablestate。若是在disablestateslave不會產生任何的channel classification。即使是enable的狀態,若是channel classification沒有改變,也無需回覆LMP_channel_classificationPDU

         AFH_Min_Interval以及max interval用來定義以兩次req command之間的時間間隔。

         1.6 Link Supervision

這個就是我們通常所說的link supervision timeout了,這個timer就是用來探測物理鏈路是否丟失,而這個timer時間的設定就是通過如下PDU來實現的:

2-6 設定supervision timeoutPDU

         1.7 通道質量引起的資料速率的變化(CQDDR

我們知道對於同一個packet type,資料傳輸的速率取決於RF通道的質量。當然,我們也可以根據不同的通道質量來傳輸不同的packet type以優化資料傳輸的速率。相關的PDU如下圖2-7所示:

2-7 通道質量導致的傳輸速率改變的PDU

裝置A首先發送LMP_auto_rate PDU來通知裝置B,這個功能是使能了,然後裝置B就可以通過LMP_preferred_rate這個PDU來設定它所希望的packet type,當然裝置A並不一定就要傳輸他希望的packet type,只要傳輸的packet type不比data rate所設定的值大即可。

         1.8 服務質量(QoS

         Tpoll我們之前一直在談,他就是master和一個特定slave之間傳輸的最大時間間隔。這個值設定就是通過如下圖2-8所示的PDU來實現的。

2-8 服務質量的PDU

這裡有兩種PDU,一個是LMP_quality_of_service,他是一個比較霸道的PDU,就是從master發出,通知slave,而slave不能拒絕,他必須得接受。另外一個則相對比較溫和一點,quality_of_service_req,畢竟有個request,這個PDU可以有master發出也可以由slave發出。不同之處至於,slave發出的reqPDUNbc的值是無效的,直接忽略。但是master發出的reqslave是可以接受也可以拒絕的。這就可以形成一個協商的效果。

         1.9 Paging Scheme Parameters

         LMP還可以協商paging scheme引數。它使用的PDU如下圖2-9所示:

2-9 Paging Scheme請求的PDU

         page_mode_req就是裝置A告訴裝置B,我page你的時候使用的paging scheme,裝置B可以接收也可以拒絕,拒絕後就仍然使用原來的scheme。而page_scan_mode_req相比而言則多了一個設定,它不僅是A告訴BApage的時候使用的paging scheme,還設定了B page的時候使用的paing scheme

         1.10 slot packet的控制

我們知道一個裝置可以聯絡多個slot進行傳輸,不過這個連續的數目是有限制的。當然也是可以設定,設定這個數目的PDU如下圖2-10所示。

2-10 多個slot packet控制的PDU

這兩個PDUQoS中的兩個PDU是一樣的,就不多解釋了。

         1.11 Enhanced Data Rate

這個是用來改變packet type table的,同樣的不同的type就意味著不同的調製模式可能會被選擇。這個改變的是ACL logical傳輸,不會影響相應的SCOeSCO鏈路。若想改變EDReSCO鏈路,在後面也會有介紹。這個PDU的格式如圖2-11所示

2-11 EDR PDU

         1.12 封裝的LMP PDUs

有時我們傳輸的LMP payload可能比16byte要長,那麼就需要使用封裝的LMP PDU來進行傳輸,他的格式如下:

2-12 封裝的LMP PDUs

當需要傳送封裝的LMP PDU的時候,我們會先發送LMP_encapsulated_header。對應這個header,若是major typeminor type,對端不能接收,就可以reject。若是accept,則會繼續傳送encapsulated_payload,對每一個payload都可以accept或者reject,每個payload的長度是16byte(最後一個用0填充)。

若您有任何關於藍芽的問題都可以在底下留言提出,我會盡快回答的。

若您覺得該文章還不錯,請按“頂”,哈哈~~