藍牙mesh

藍牙mesh學習筆記
2f24ffd299c4002f71725f15f0378e78.png
主機:就緒態,掃描態,發起態,鏈接態
從機:就緒態,廣播態,鏈接態
5994d2eb4ec2df9352b027a0e05f1c3b.png
前導:
    訓列序列,防止白化。
接入地址:
廣播接入地址:廣播信道接入地址爲0x8E89BED6
    數據接入地址:數據信道接入地址爲隨機值
廣播報文報頭:
9baf99e6ecbf58cb5cd0852f82cf6282.pngweb

長度:
廣播報文6 bits:6~37(6字節廣播設備地址+31字節數據)
數據報文5 bits:0~31(不管加密與否,最多使用27字節)算法

HCI信道

一旦控制器與其餘設備創建了鏈接,控制器的底層HCI接口就建立一個HCI信道,使用一個鏈接句柄(connection handle)來標識這個HCI信道
鏈接句柄:標識主機交給控制器並準備發往對端的數據;標識控制器從對端收到的準備交給主機的數據。
HCI命令數據包格式:1d65958b2aef58c23b80f2011c14600e.png
三種基本命令類型:數據庫

  • 配置控制器的狀態
  • 請求執行特定的操做
  • 管理鏈接

屬性協議(ATT)
請求,響應;命令;指示,確認;通知;
cbbc0420a7e69bd8b9efef926943ea8f.pngapi

  • 交換MTU請求 ATT_XCNHG_MTU_REQ服務器

  • 查找信息請求 ATT_FIND_INFO_REQ(惟一能讓客戶端發現任意屬性類型的消息)a1e0ebb6bbc8d8d52f38ed7b28e3ec17.pngsvg

  • 按類型值查找請求(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界面

9929d0195b98a55f2643125bbc2f7708.png