認識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的資料包括: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 | 使用了通道選擇演算法 |