藍牙mesh學習筆記
主機:就緒態,掃描態,發起態,鏈接態
從機:就緒態,廣播態,鏈接態
前導:
訓列序列,防止白化。
接入地址:
廣播接入地址:廣播信道接入地址爲0x8E89BED6
數據接入地址:數據信道接入地址爲隨機值
廣播報文報頭:
web
長度:
廣播報文6 bits:6~37(6字節廣播設備地址+31字節數據)
數據報文5 bits:0~31(不管加密與否,最多使用27字節)算法
一旦控制器與其餘設備創建了鏈接,控制器的底層HCI接口就建立一個HCI信道,使用一個鏈接句柄(connection handle)來標識這個HCI信道
鏈接句柄:標識主機交給控制器並準備發往對端的數據;標識控制器從對端收到的準備交給主機的數據。
HCI命令數據包格式:
三種基本命令類型:數據庫
屬性協議(ATT)
請求,響應;命令;指示,確認;通知;
api
交換MTU請求 ATT_XCNHG_MTU_REQ服務器
查找信息請求 ATT_FIND_INFO_REQ(惟一能讓客戶端發現任意屬性類型的消息)svg
按類型值查找請求(ATT_FIND_BY_TYPE_VAL_REQ)函數
按類型讀取請求(ATT_READ_BY_TYPE_REQ)工具
讀取請求(ATT_READ_REQ)、學習
大對象讀取請求(ATT_READ_BLOB_REQ)加密
多重讀取請求(ATT_READ_MULTIPLE_REQ)
按組類型讀取請求(ATT_READ_BY_GROUP_REQ)
寫入請求(ATT_WRITE_REQ)
寫入命令(ATT_WRITE_CMD)
簽名寫入命令(ATT_SIGNED_WRITE_CMD)
準備寫入請求(ATT_PREPARE_WRITE_REQ)
執行寫入請求(ATT_EXECUTE_WRITE_REQ)
句柄值通知(ATT_HANDLE_VALUE_NTF)
句柄值指示(ATT_HANDLE_VALUE_IND)
錯誤響應(ATT_ERROR_RSP)
一.層次結構.
![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_1.PNG)
重點關注了GAP/GATT/ATT/SMP/L2CAP/HCI
底層(控制器controller)
物理信道
![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_2.PNG)
37/38/39爲廣播信道,其他爲數據信道。
頻段:![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_3.PNG)
發射功率
Max值爲+10dBm.發射距離和接收機的靈敏度以及發射功率有關.
![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_4.PNG)
鏈路層的5種狀態
![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_5.PNG)
主機:就緒態,掃描態,發起態,鏈接態
從機:就緒態,廣播態,鏈接態
4. 鏈路層報文結構
![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_6.PNG)
前導:
訓列序列,防止白化。
接入地址:
廣播接入地址:廣播信道接入地址爲0x8E89BED6
數據接入地址:數據信道接入地址爲隨機值
廣播報文報頭:
![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_7.PNG)
長度:
廣播報文6 bits:6~37(6字節廣播設備地址+31字節數據)
數據報文5 bits:0~31(不管加密與否,最多使用27字節)
5.掃描和廣播
![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_8.PNG)
設備在3個廣播信道上發送相同的報文,廣播時間能夠選擇.
掃描僅能夠單信道掃描,掃描間隔也是能夠選擇的。
鏈接
![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_9.PNG)
鏈接請求包括:接入地址、CRC初始值、發送窗口大小、窗口偏移量、鏈接間隔、從設備延遲、監控超時、自適應跳頻信道圖、跳頻算法增量、休眠時鐘精度。
![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_10.PNG)
總結:
從底層上了解了藍牙技術的基本狀態,以及一些藍牙技術基本的行爲.從硬件信號交互方面,對藍牙通訊有了實質化了解。
信號Idle時間段能夠進行shut down模式.
HCI層
一旦鏈接確認,HCI層就會建立一個HCI信道(邏輯信道),使用鏈接句柄(connection
handle)來標識HCI信道.
命令數據包
![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_11.PNG)
主機和鏈路層的交互
以廣播爲例子,參考simple code:
sample_project_adv
初始化部分:
![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_12.PNG)
廣播部分:
![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_13.PNG)
代碼中的廣播參數配置:
![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_14.PNG)
參考函數文檔btle_sp_api.chm能夠知道配置的意義.
![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_15.PNG)
總結:
學習了HCI層的特性,配合simple code代碼學習了HCI層的一些基本操做。
瞭解一些代碼中的函數用法:
BT_hci_le_set_scan_parameters
BT_hci_le_set_scan_enable
BT_hci_read_transmit_power_level
BT_hci_le_create_connection
BT_hci_le_connection_update…
L2CAP層
1.可以讓藍牙複用信道,支持數據的分割和重組。
![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_16.PNG)
L2CAP數據包格式
![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_17.PNG)
對於低功耗藍牙,payload最大傳輸單元爲23字節。(MTU)
信道標識符:
![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_18.PNG)
關於命令數據包格式.
對於BLE使用低功耗信令信道,信道標識符爲0x0005.
![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_19.PNG)
![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_20.PNG)
BLE支持的code值:命令拒絕、鏈接參數更新請求、鏈接參數更新響應.
Identifier:標識符,用於匹配請求和響應。請求和響應的標識符必須一致.
能夠參考BLUETOOTH SPECIFICATION Version 4.1 [Vol 3](page 59)
總結:
1.瞭解L2CAP層的做用。
2.學習了L2CAP層的信令信道和數據信道。
ATT層
屬性是一條帶有標籤的、能夠被尋址的數據。
數據的提供者爲服務器,數據的使用者稱爲客戶端。經典的C/S模式。
屬性內容
屬性(Attribute)包括:屬性句柄Handle,屬性類型Type,屬性值Value
![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_21.PNG)
Handle: 一臺設備能夠包含不少Attribute,能夠是溫度屬性,設備名稱,電池電量等;屬性句柄Handle爲16位地址,爲不一樣Attribute提供訪問入口。感受相似內存地址。
Type:能夠被公開的數據有多種類型,能夠用128位標識屬性的類型,這被稱爲通用惟一識別碼(UUID)
SIG規範使用較短的16位UUID爲00000000-0000-1000-8000-00805F9B34FB;
![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_22.PNG)
Value: 屬性值的長度能夠從0字節到512字節
2.屬性PDUs
![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_23.PNG)
![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_24.PNG)
關於Opcode
參考3.4.8 Attribute Opcode Summary.
![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_25.PNG)
屬性使用許可包括:可讀、可寫、可讀寫。
認證許可包括:須要認證、不須要認證。
接入屬性:客戶端能夠經過任意一種消息類型訪問屬性數據庫的各個屬性:尋找請求、讀取請求、寫入請求、寫入命令、通知、指示。
使用尋找請求尋找數據庫中的屬性,再使用效率更高的給予句柄的請求。
發送讀取請求讀取某個屬性值,制定某一個或多個屬性句柄,以及屬性類型。
發送寫入請求寫入某個屬性值,使用一個屬性句柄和要寫入的數值。
總結:
藍牙協議中,數據交互的關鍵層,經過句柄定位。
SM層
SM層主要是用於信息加密等操做.
1.臨時密鑰幾種模式(TK)
Just work:TK=0
Passkey entry:TK有顯示屏輸入值
Out of band:NFC
短時間密鑰(STK)
來源:TK,rand S和rand M.
長期密鑰(LTK)/(IRK)/(CSRK)
來源:EDIV和Rand
配對
配對信息交換,鏈路認證,密鑰分配。
參考:3.5 PAIRING METHODS.
成功後進行綁定。
PDU結構
![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_26.PNG)
總結:
1.該層用於加密數據。用於通訊中key的產生和認證.
GATT層
1.服務(Service)
服務等同於一個具備不可變接口的對象,包含一種或多種特性,並能引用其餘服務,特性是數據單位。
2.特性(Characteristic)
特徵只是一個數值:包含三個基本要素 聲明、數值、描述符
3.操做方式
命令與通知是不可靠的,沒有發送次數限制。
![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_27.PNG)
參考代碼:gatt.c
例子:4.3 SERVER CONFIGURATION
![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_28.PNG)
代碼:
客戶端
![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_29.PNG)
服務器
![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_30.PNG)
從代碼角度來說,GATT層調用ATT層代碼。
![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_31.PNG)
![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_32.PNG)
總結:
GATT層經過規程來進行數據交互。
GAP層
定義了設備如何彼此發現、創建鏈接以及如何實現綁定,同時描述設備如何成爲廣播者和觀察者。同時在不一樣類型地址部分作了說明。
初次發現
多個廣播設備向多個掃描設備發送數據包,構成多對多的拓撲結構。廣播報文包括數據以及設備是否可發現及可鏈接。
有限可發現性:用於臨時設置爲可發現狀態,持續30s
通常可發現性:優先級最低的可發現性
GAP定義了公開設備名稱的特性,設備名稱能夠包含在廣播數據或掃描相應數據之中。
創建初始鏈接
向廣播報文提供的地址發起一個鏈接,創建鏈接。創建鏈接後能夠窮舉對端設備的全部服務和特性,或者只查找它感興趣的服務及其特性。
服務特性
通知和指示能夠實現數據的高效率傳輸。在客戶端的特性配置描述符中寫入信息,啓用所需功能,客戶端就會收到某特性的通知或指示。
4.GAP角色
廣播者 Advertiser、觀察者 Observer、外圍設備 Peripheral、中央設備 Central
可鏈接性
外圍設備可處於1.不可發現模式 2.有限可發現模式 3.通常可發現模式
可鏈接性
2種可鏈接廣播報文:ADV_IND,ADV_DIRECT_IND
2種不可鏈接廣播報文:ADV_NONCONN_IND,ADV_SCAN_IND
不可鏈接模式
只容許使用ADV_NONCONN_IND,ADV_SCAN_IND
定向可鏈接模式
使用ADV_DIRECT_IND廣播報文,包含當前外圍設備的地址,以及中央設備地址。<1.28s
無向可鏈接模式
使用ADV_IND廣播報文,包含AD信息標識,處於可發現模式及可鏈接模式。
總結:
1.GAP層經過規程來進行設備之間的發現、鏈接、綁定。
代碼debug方式
工具
使用keil5進行代碼的編譯和仿真.
注意點:
安裝時候注意keil版本,不一樣版本的keil不要安裝在一塊兒.
debug設置
Debug時候如下幾點須要注意:Device配置
![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_33.PNG)
Debug配置
![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_34.PNG)
![.png](file://C:\Users\ADMINI~1\AppData\Local\Temp\yxrtfimage\hts_35.PNG)
debug界面