1. 程式人生 > >認識BLE 5協議棧 —— 主機控制器介面

認識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 使用了通道選擇演算法