轉自 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的數據包括:HCI命令、HCI事件和連接數據。HCI層本身不能區分這三種類型,因此在發送HCI數據包前需要先發送該數據包的類型指示信息。串口HCI的數據包類型指示信息如下:
HCI包類型 | 指示信息 |
---|---|
HCI命令 | 0x01 |
連接數據 | 0x02 |
HCI事件 | 0x04 |
指示信息中缺少0x03,該信息用於經典藍牙概念。
包類型指示位在HCI包發送前發給給主機或控制器。
2. 連接數據
兩個設備建立連接後相互收發數據,從主機將數據發送給控制器,再通過無線發送到對端設備,或控制器接收到對端設備數據後通過HCI發送給主機。連接數據的結構如下所示:
- Handle:連接句柄。
- FB Flag:數據邊界標誌(Packet Boundary Flag),表示當前數據包是一個完整數據包的開頭片段或中間片段。
- BC Flag:播報標誌(Broadcast Flag),不用於BLE。
- Data Total Length:數據總長度。
- Data:有效數據。
3. HCI命令
HCI命令包包括:操作碼OpCode、參數總長度和參數個數,如下所示:
爲了避免控制器的緩衝區溢出,發送命令包時需要應用流程控制。主機向控制器發送一個命令,控制器返回命令執行狀態事件,事件中包含參數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事件包不強制要求流程控制,因爲通常主機總是具有充足資源來處理控制器返回的事件。
當連接斷開時,主機默認所有命令都已經執行完畢,將不再接收任何事件。
控制器收到不同的主機命令,可能返回以下類型事件:
- 執行完畢事件
- 狀態信息事件
對於不涉及連接的命令,可以立即得到執行結果,執行完畢事件報告該命令執行成功或失敗。
對於涉及連接的命令,無法立即得到執行結果,命令執行完畢後,先返回執行完畢事件,等命令最終結果產生,再返回新的執行完畢事件。比如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 | 使用了信道選擇算法 |