藍牙基礎知識進階——Link manager對連接的控制
2014年02月12日 09:12:30 gordon1986 閱讀數:5911
1、連接的控制
對連接的控制涉及到很多方面,而最直接的必然是連接的建立和連接的斷開。
1.1 連接的建立
連接建立的過程如下圖2-1所示:
圖2-1 連接的建立
在page過程和一系列的信息交互之後就是連接的建立。master(paging的設備)就會發送LMP_host_connection_req來請求建立連接,slave可以迴應LMP_accepted或者LMP_not_accepted來完成或者拒絕連接的建立。在這之間,其實還可能有一個role switch的過程,一般而言,是在slave收到LMP_host_conenction_req之後發送slot_offset和switch_req的PDU。若是role_switch失敗,連接的建立仍然需要繼續,除非paged一方不支持成爲slave的角色,會迴應low resource並斷開連接。
1.2 連接的斷開
藍牙設備的斷開是可以發生在任何時刻的,它可以由master發起也可以由slave發起。不過有一點,就是他必須有一個理由。因此斷開連接的PDU——LMP_detach有一個error code的部分。
在斷開連接之前,需要先把ACL-U的鏈路暫停,然後把LMP_detach放入到傳輸的隊列中,緊接着發動斷開的一端啓動了一個6*Tpoll的timer,若是在這個timer超時前得到對方的ack,則啓動一個3*Tpoll的timer,在3*Tpoll的timer超時後,LT_ADDR能夠被re_use(發動斷開端是master)。若是在6*Tpoll的timer超時後還沒有得到ack,則丟棄link,啓動一個新的Tlinksupervisiontimeout,這個timeout後LT_ADDR被re_use(發動斷開端是master)。
至於在接收端,若是接收端是master,則啓動一個6*Tpoll的timer,若是slave,則啓動3*Tpoll的timer。這個timer超時後,連接斷開,然後若接收端是master,則LT_ADDR能夠被再次使用。
1.3 Power的控制
power的控制是link manager的另外一個重要的工作,雖然說power level是physical link的一個特性,而link manager是對邏輯鏈路的控制,因此這裏的power控制是physical link上的特定logical link的power level,他不會影響同一physical link上別的logical link的power level。
Power的控制有兩種策略,一種是legacy power control,另外一種是enhanced power control。支持enhanced的設備必須同時也支持legacy的控制策略。
legacy的power control所涉及的PDU如圖2-2所示:
圖2-2 legacy power control的PDU
很清楚地可以看到incr_power_req就是要求power level增加一格,decr_power_req就是要求power level減少一格。當對端處於max power的時候,你再發送incr_power_req的時候就會回覆max_power,同樣的道理若是處於min power的時候,也會回覆min_power。還有一種情況就是對端不支持power control,則它也會對incr的req回覆max power,而對decr的req回覆min power,當然也有可能回覆unsupported LMP feature的error code。
enhanced power control所涉及的PDU如圖2-3所示:
圖2-3 enhanced power control的PDU
毫無疑問,enhanced power control只有在兩個設備都支持的情況下才會使用。在發送LMP_power_control_req之後,接收端會根據power_adjustment_request的內容來決定是提升一格的power level還是降低一格的power level或者就是直接max power。所以,這個參數有三個值:one step up,one step down或者all the way to the max power level。對應的response參數就比較簡單了,它就是用來表示變化後的power level。
1.4 自適應跳頻(AFH)
自適應跳頻機制在藍牙中特別重要,他可以降低同樣ISM 2.4G的其它設備的干擾。AFH的PDU如下圖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_Mode是enable的時候,就是用來使能或者刷新AFH的。若是disable的時候,channel map參數的值就不再重要了。
1.5 通道的類別
AFH就是基於channel的一種機制,通俗地來講我們希望一直在“乾淨”的通道上進行這些傳輸,那什麼是“乾淨”的通道?除了所謂的“乾淨”的通道,還有別的什麼通道呢?這裏就是來說明通道都有哪些類型的。
通道類別的交互使用的PDU如下圖2-5所示:
圖2-5 通道類別的PDU
顯然req就是請求通道類別的信息了,他有三個參數:
AFH_Reporting_Mode:用來確定slave是在AFH_reporting_enable還是AFH_reporting_disable的state。若是在disable的state,slave不會產生任何的channel classification。即使是enable的狀態,若是channel classification沒有改變,也無需回覆LMP_channel_classification的PDU。
AFH_Min_Interval以及max interval用來定義以兩次req command之間的時間間隔。
1.6 Link Supervision
這個就是我們通常所說的link supervision timeout了,這個timer就是用來探測物理鏈路是否丟失,而這個timer時間的設置就是通過如下PDU來實現的:
圖2-6 設置supervision timeout的PDU
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發出的req的PDU中Nbc的值是無效的,直接忽略。但是master發出的req,slave是可以接受也可以拒絕的。這就可以形成一個協商的效果。
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告訴B,Apage的時候使用的paging scheme,還設置了B page的時候使用的paing scheme。
1.10 多slot packet的控制
我們知道一個設備可以聯繫多個slot進行傳輸,不過這個連續的數目是有限制的。當然也是可以設置,設置這個數目的PDU如下圖2-10所示。
圖2-10 多個slot packet控制的PDU
這兩個PDU和QoS中的兩個PDU是一樣的,就不多解釋了。
1.11 Enhanced Data Rate
這個是用來改變packet type table的,同樣的不同的type就意味着不同的調製模式可能會被選擇。這個改變的是ACL logical傳輸,不會影響相應的SCO或eSCO鏈路。若想改變EDR的eSCO鏈路,在後面也會有介紹。這個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 type和minor type,對端不能接收,就可以reject。若是accept,則會繼續發送encapsulated_payload,對每一個payload都可以accept或者reject,每個payload的長度是16byte(最後一個用0填充)。
文章來源:https://blog.csdn.net/u011960402/article/details/19107857