認識BLE 5協議棧 —— 主機控制器接口

轉自 http://www.sunyouqun.com/2017/04/understand-ble-5-stack-hci-layer/


BLE協議棧規定物理層、鏈路層和DTM層屬於控制器,其他協議層屬於主機,主機與控制器之間的通信是通過主機控制器接口傳輸層完成的。

主機控制器接口常簡稱爲HCI(Host Controller Interface)。

HCI定義了一套“命令-事件”機制,主機向控制器發送HCI命令,控制器向主機返回命令執行結果。應用層的所有操作都會轉換成HCI命令傳給控制器。

1. HCI通信

HCI接口物理形式可以是串口、SPI、USB和三線串口。

對於串口HCI,其通信模型如下:

HCI_UART_Interface

左側藍牙主機向右側藍牙控制器發送命令,控制器返回命令執行狀態。當收到對端設備發送的消息,控制器會以事件形式發送給主機。

通過HCI的數據包括:HCI命令、HCI事件和連接數據。HCI層本身不能區分這三種類型,因此在發送HCI數據包前需要先發送該數據包的類型指示信息。串口HCI的數據包類型指示信息如下:

HCI包類型 指示信息
HCI命令 0x01
連接數據 0x02
HCI事件 0x04

指示信息中缺少0x03,該信息用於經典藍牙概念。

包類型指示位在HCI包發送前發給給主機或控制器。

2. 連接數據

兩個設備建立連接後相互收發數據,從主機將數據發送給控制器,再通過無線發送到對端設備,或控制器接收到對端設備數據後通過HCI發送給主機。連接數據的結構如下所示:

HCI_Data_Packet_Format

  • Handle:連接句柄。
  • FB Flag:數據邊界標誌(Packet Boundary Flag),表示當前數據包是一個完整數據包的開頭片段或中間片段。
  • BC Flag:播報標誌(Broadcast Flag),不用於BLE。
  • Data Total Length:數據總長度。
  • Data:有效數據。

3. HCI命令

HCI命令包包括:操作碼OpCode、參數總長度和參數個數,如下所示:

HCI_Command_Packet_Format

爲了避免控制器的緩衝區溢出,發送命令包時需要應用流程控制。主機向控制器發送一個命令,控制器返回命令執行狀態事件,事件中包含參數Num HCI Command Packets,該參數指主機可以發送的最大命令包的數量。

控制器按接收順序執行主機命令,但後面的命令可能提前執行完畢。

如果命令執行出錯,將在控制器的狀態事件中包含錯誤碼。

HCI命令非常多,將近300個,BLE僅支持部分命令,所有BLE專屬的命令OGF字段都等於0x08。

下面列出BLE支持的最基礎的一部分HCI命令:

命令 描述
LE Add Device To White List Command 添加白名單
LE Clear White List Command 清空白名單
LE Read Buffer Size Command 讀控制器緩存
LE Read Local Supported Features Command 讀本設備支持的功能
LE Read Supported States Command 讀本設備支持的狀態
LE Read White List Size Command 讀白名單空間
LE Remove Device From White List Command 從白名單移除設備
LE Set Event Mask Command 設置事件掩碼
LE Test End Command 結束測試
Read BD_ADDR Command 讀取設備地址
Reset Command 重啓
LE Read Advertising Channel TX Power Command 讀取廣播發射功率
LE Transmitter Test Command 發送數據測試
LE Set Advertising Data Command 設置廣播數據
LE Set Advertising Enable Command 開啓廣播
LE Set Advertising Parameters Command 設置廣播參數
LE Set Random Address Command 設置隨機地址
LE Receiver Test Command 接收數據測試
LE Set Scan Enable Command 開啓掃描
LE Set Scan Parameters Command 設置掃描參數
Disconnect Command 斷開連接

4. HCI事件

HCI事件包包括:時間代碼, 參數總長度和具體參數,如下所示:

HCI_Event_Packet_Format

HCI事件包不強制要求流程控制,因爲通常主機總是具有充足資源來處理控制器返回的事件。

當連接斷開時,主機默認所有命令都已經執行完畢,將不再接收任何事件。

控制器收到不同的主機命令,可能返回以下類型事件:

  • 執行完畢事件
  • 狀態信息事件

對於不涉及連接的命令,可以立即得到執行結果,執行完畢事件報告該命令執行成功或失敗。

對於涉及連接的命令,無法立即得到執行結果,命令執行完畢後,先返回執行完畢事件,等命令最終結果產生,再返回新的執行完畢事件。比如LE Create Connection Command命令,執行命令時先返回執行完畢,表面鏈路層開始執行或加入執行隊列,待兩端設備建立連接,將返回連接完成事件。

部分讀命令,比如LE Read Advertising Channel Tx Power Command,執行完畢後將讀取結果存放在狀態信息事件中返回。

HCI事件包括BLE專有事件和通用事件,通用事件適用於經典藍牙和BLE。BLE專有事件稱爲“元事件(LE Meta Event)”,共有20個,它們的事件代碼均爲0x3E,事件參數的第一個字節爲Subevent_code,用以區分不同的元事件。如下:

事件 Subevent_Code 描述
LE Connection Complete Event 0x01 建立連接完畢
LE Advertising Report Event 0x02 檢測到廣播數據或收到掃描響應數據
LE Connection Update Complete Event 0x03 連接參數更新完畢
LE Read Remote Features Complete Event 0x04 讀取對端設備功能完畢
LE Long Term Key Request Event 0x05 控制器向主機發送LTK以加密鏈接
LE Remote Connection Parameter Request Event 0x06 對端設備發起更新連接參數請求
LE Data Length Change Event 0x07 控制器通知主機鏈路層數據長度發生了更新
LE Read Local P-256 Public Key Complete Event 0x08 控制器通知主機P-256密鑰生成完畢
LE Generate DHKey Complete Event 0x09 控制器通知主機橢圓加密算法密鑰生成完畢
LE Enhanced Connection Complete Event 0x0A 建立連接完畢(還支持擴展連接)
LE Directed Advertising Report Event 0x0B 檢測到定向廣播數據或掃描響應數據
LE PHY Update Complete Event 0x0C 物理層更新完畢
LE Extended Advertising Report Event 0x0D 檢測到擴展廣播數據或掃描響應數據
LE Periodic Advertising Sync Established Event 0x0E 建立週期廣播同步完畢
LE Periodic Advertising Report Event 0x0F 檢測到週期廣播數據或掃描響應數據
LE Periodic Advertising Sync Lost Event 0x10 週期廣播數據無法同步
LE Scan Timeout Event 0x11 掃描超時
LE Advertising Set Terminated Event 0x12 終止廣播數據集事件
LE Scan Request Received Event 0x13 收到掃描請求
LE Channel Selection Algorithm Event 0x14 使用了信道選擇算法
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章