**
ble協議棧規定物理層、鏈路層和dtm層屬於控制器,其他協議層屬於主機,主機與控制器之間的通訊是通過主機控制器介面傳輸層完成的。
主機控制器介面常簡稱為hci(host controller inte***ce)。
hci定義了一套「命令-事件」機制,主機向控制器傳送hci命令,控制器向主機返回命令執行結果。應用層的所有操作都會轉換成hci命令傳給控制器。
hci介面物理形式可以是串列埠、spi、usb和三線串列埠。
對於串列埠hci,其通訊模型如下:
左側藍芽主機向右側藍芽控制器傳送命令,控制器返回命令執行狀態。當收到對端裝置傳送的訊息,控制器會以事件形式傳送給主機。
通過hci的資料報括:hci命令、hci事件和連線資料。hci層本身不能區分這三種型別,因此在傳送hci資料報前需要先傳送該資料報的型別指示資訊。串列埠hci的資料報型別指示資訊如下:
hci包型別
指示資訊
hci命令
0x01
連線資料
0x02
hci事件
0x04
指示資訊中缺少0x03,該資訊用於經典藍芽概念。
包型別指示位在hci包傳送前發給給主機或控制器。
兩個裝置建立連線後相互收發資料,從主機將資料傳送給控制器,再通過無線傳送到對端裝置,或控制器接收到對端裝置資料後通過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
斷開連線
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
使用了通道選擇演算法
BLE協議棧 介紹
ble協議棧的官方文件 這些網路資源對於協議棧的細節大多點到為止,無以深入,於是我嘗試結合自己的經驗,挑重點介紹一下ble協議棧的內容。成文過程主要參考 ble權威指南 一書,也利用google baidu做了大量搜尋,借鑑了許多第三方部落格和論壇的優質答案並保留了原始鏈結,盡可能將一些問題解釋清楚...
ble不配對直接鏈結 BLE協議棧 HCI
在ble協議棧的層模型中,位於下部的物理層 鏈路層 dtm屬於控制器,位於上部的l2cap att gatt gap sm層則屬於主機,在主機之上使用者自己的程式稱為使用者程式。因此ble協議棧進一步可以抽象為三層 控制器 主機和使用者程式。ble協議棧規劃的晶元實現方案有單晶元方案,雙晶元方案和三...
藍芽4 0BLE協議棧介紹
問題 什麼是ble協議棧?ble協議棧與ble協議的關係?顧名思義,人類之間需要一種語言才能溝通,機器之間,電子之間也有乙個標準,也就是作為通訊標準,也就是通訊協議。協議 定義了一系列通訊標準,通訊雙方都按照這一標準,進行資料通訊。協議棧 協議的具體實現形式,實現的函式庫,韌體庫。把個個協議集合到了...