STM32提高篇: 藍牙通訊
- 一.藍牙通訊介紹
- 1.藍牙技術類型
- 二.藍牙協議棧
- 1.藍牙芯片架構
- 2.BLE低功耗藍牙協議棧框架
- 三.ESP32-C3中的藍牙功能
- 1.廣播
- 2.掃描
- 3.通訊
- 四.發送和接收
一.藍牙通訊介紹
藍牙,是一種利用低功率無線電,支持設備短距離通信的無線電技術,能在包括移動電話、PDAQ、無線耳機、筆記本電腦、相關外設等眾多設備之間進行無線信息交換,藍牙工作在全球通用的2.4 GHz(2.4 至 2.485 GH) ISM(即工業、科學、醫學)頻段,使用IEEE802.11協議。
1.藍牙技術類型
藍牙協議包括兩種技術:BR:Basic Rate和LE:Low Energy。
這兩種技術都包括搜索(discovery)管理、連接(connection)管理等機制,但它們是相互獨立的,不能互通的技術!
廠商如果只實現了一種,那么只能與同樣實現該技術的設備互通。如果廠商要確保能和所有的藍牙設備互通,那么就只能同時實現兩種技術,而不去管是否真的需要。
經典藍牙(BR/EDR)
BR:Basic Rate是正宗的藍牙技術,可以包括可選的EDR(Enhanced Data Rate)技術,以及AMP(Alternate MAC and PHY layer extension)。
BR:最早期的藍牙技術,速度只能達到721.2Kbps,在那個年代,已為高大上了。·EDR:隨著技術的提升,使用EDR技術的藍牙,理論速率可以達到2.1Mbps。
AMP:使用AMP技術的藍牙,理論速率可以達到54Mbps。藍牙自身的物理層和AMP技術差異明顯,BR/EDR和AMP是不能同時使用的。簡單的說,就是:BR和EDR是可以同時存在的,但BR/EDR和AMP只能二選一。
低功耗藍牙(BLE)
上面所講的BR技術的進化路線,就是傳輸速率的加快、加快、再加快。但能量是守恒的,你想傳的更快,代價就是消耗更多的能量。而有很多的應用場景,并不關心傳輸速率,反而非常關心功耗。這就是Bluetooth LE(稱作藍牙低功耗)產生的背景。
低功耗藍牙與經典藍牙使用相同的2.4GHz無線電頻率,因此雙模設備可以共享同一個天線。低功耗藍牙使用的調制系統更簡單。BLE技術相比BR技術,差異非常大,或者說就是兩種不同的技術,湊巧都加一個“藍牙”的前綴而已。目前BLE主要廣泛應用于引IoT(Internet of Things:物聯網)產品領域。
二.藍牙協議棧
藍牙協議棧極其復雜,官方協議說明書大概有800多頁。我們只做一個大致了解。芯片廠家一般都封裝好了,我們直接使用即可。
1.藍牙芯片架構
藍牙的核心系統,由一個Host和一個或多個Controller組成。
(1)BT Host:邏輯實體,在HCI(Host Controller Interface)的上層。
(2)BT Controller:邏輯實體,在HCI(Host Controller Interface)的下層。
根據Host與Controller的組成關系,常見的藍牙芯片也分為以下幾種:
(1)單模藍牙芯片:單一傳統藍牙的芯片,單一低功耗藍牙的芯片。即(1個Host結合1個Controller)
(2)雙模藍牙芯片:同時支持傳統藍牙和低功耗藍牙的芯片。即(1個Host結合多個Controller)
藍牙協議是通信協議的一種,一般而言,我們把某個協議的實現代碼稱為協議棧(protocol stack),BLE協議棧就是實現低功耗藍牙協議的代碼。
2.BLE低功耗藍牙協議棧框架
要實現一個BLE應用,首先需要一個支持BLE射頻的芯片,然后還需要提供一個與此芯片配套的BLE協議棧,最后在協議棧上開發自己的應用。
可以看出BLE協議棧是連接芯片和應用的橋梁,是實現整個BLE應用的關鍵。
簡單來說,BLE協議棧主要用來對你的應用數據進行層層封包,以生成一個滿足BLE協議的空中數據包,也就是說,把應用數據包裹在一系列的幀頭(header)和幀尾(tail)中。
藍牙協議規定了兩個層次的協議,分別為藍牙核心協議(Bluetooth Core)和藍牙應用層協議(Bluetooth Application)。
藍牙核心協議關注對藍牙核心技術的描述和規范,它只提供基礎的機制,并不關心如何使用這些機制;
藍牙應用層協議,是在藍牙核心協議的基礎上,根據具體的應用需求,百花齊放,定義出各種各樣的策略,如FTP、文件傳輸、局域網等等。
而藍牙核心協議(Bluetooth Core)又包含BLE Controller和BLE Host兩部分。Controller負責定義RF、Baseband等偏硬件的規范,并在這之上抽象出用于通信的邏輯鏈路(Logical Link);Host負責在邏輯鏈路的基礎上,進行更為友好的封裝,這樣就可以屏蔽掉藍牙技術的細節,讓Bluetooth Application更為方便的使用。
物理層(Physical Layer,PHY)
PHY 層主要負責在物理信道上發送和接收信息包。Bluetooth LE 使用 40 個射頻信道。頻率范圍:2402 MHz 到 2480 MHz。
鏈路層(Link Layer,LL)
LL 層主要負責創建、修改和釋放邏輯鏈路(以及,如果需要,它們相關的邏輯傳輸),以及與設備之間的物理鏈路相關的參數的更新。它控制鏈路層狀態機處于準備、廣播、監聽/掃描、發起連接、已連接五種狀態之一。
主機控制接口層(Host Controller Interface,HCI)
HCI 層向主機和控制器提供一個標準化的接口。該層可以由軟件 API 實現或者使用硬件接口 UART、SPI、USB 來控制。
通用訪問配置文件層(Generic access profile,GAP)
GAP 層代表所有藍牙設備通用的基本功能,例如傳輸、協議和應用程序配置文件使用的模式和訪問程序。GAP 服務包括設備發現、連接模式、安全、身份驗證、關聯模型和服務發現。
邏輯鏈路控制及自適應協議層(Logical Link Control and Adaptation Protocol,L2CAP)
L2CAP 層負責對主機和協議棧之間交換的數據進行協議復用能力、分段和重組操作。
安全管理層(Security Manager,SM)
SMP 層用于生成加密密鑰和身份密鑰。SMP 還管理加密密鑰和身份密鑰的存儲,并負責生成隨機地址并將隨機地址解析為已知設備身份。
屬性協議層(Attribute protocol,ATT)
簡單來說,ATT層用來定義用戶命令及命令操作的數據,比如讀取某個數據或者寫某個數據。BLE引入了attribute概念,用來描述一條一條的數據。Attribute除了定義數據,同時定義該數據可以使用的ATT命令,因此這一層被稱為ATT層。
通用屬性配置文件層(Generic Attribute profile,GATT)
GATT 層表示屬性服務器和可選的屬性客戶端的功能。該配置文件描述了屬性服務器中使用的服務、特征和屬性的層次結構。該層提供用于發現、讀取、寫入和指示服務特性和屬性的接口。
三.ESP32-C3中的藍牙功能
ESP32-C3支持Bluetooth 5(LE)。下載好固件之后(我們前面下載的固件已經支持wifi和藍牙了), STM32仍然可以通過AT指令操作藍牙。
BLE角色劃分:
LL:設備可以劃分為主機和從機,從機廣播,主機可以發起連接。
GAP:定義了 4 種特定角色:廣播者、觀察者、外圍設備 和 中心設備。
GATT:設備可以分為服務端和客戶端。
1.廣播
廣播是指從機(服務器)每經過一個時間間隔發送一次廣播數據包,這個時間間隔稱為廣播間隔,這個廣播動作叫做廣播事件,只有當從機處于廣播狀態時,主機(客戶端)才能發現該從機(服務器)。
在每個廣播事件中,廣播包會分別在37、38和39三個信道上依次廣播,如下圖所示。
廣播數據包一般包含可讀的設備名稱,設備是否可連接等信息。
2.掃描
掃描是主機監聽從機廣播數據包和發送掃描請求的過程,主機通過掃描,可以獲取到從機的廣播包以及掃描回應數據包,主機可以對已掃描到的從機設備發起連接請求,從而連接從機設備并通信。
3.通訊
主從之間的通信是通過GATT的Profile來完成的,Profile可以理解為配置,數據格式等。
從機作為GATT的Server端,用來定義和存儲Profile。Profile包含一個或者多個Service,每個Service又包含一個或者多個Characteristic,Characteristic是主從通信的最小單元。
主機作為GATT的Client端,用來發現和獲取從機的Service和Characteristic,從而與之通信。
關于服務 Service和特征值Characteristic的概念。每個服務和特征值都有自己的唯一標識 UUID,標準UUID為128位,藍牙協議棧中一般采用16位,也就是兩個字節的UUID格式。
一個從機設備包括一個或者多個服務;一個服務中又可以包括一條或者多條特征值,每個特征值都有自己的屬性 Property,屬性的取值有:可讀 Read,可寫 Write 以及通知 Notify。
四.發送和接收
ESP32C3發送AT指令使用藍牙功能。
藍牙初始化:
void Inf_ESP32_BLE_Init(void)
{/* 0. 關閉wifi功能(清理wifi驅動) */Inf_ESP32_SendCmd("AT+CWINIT=0\r\n");/* 1. 初始化為服務器模式 */Inf_ESP32_SendCmd("AT+BLEINIT=2\r\n");/* 2. 創建服務 */Inf_ESP32_SendCmd("AT+BLEGATTSSRVCRE\r\n");/* 3. 開啟提供的所有服務 */Inf_ESP32_SendCmd("AT+BLEGATTSSRVSTART\r\n");/* 4. 設置廣播參數 */Inf_ESP32_SendCmd("AT+BLEADVPARAM=50,50,0,0,7,0,,\r\n");/* 5. 自動廣播參數設置 */Inf_ESP32_SendCmd("AT+BLEADVDATAEX=\"ble-teacher\",\"A102\",\"0112030405\",1\r\n");/* 6. 開始廣播 */Inf_ESP32_SendCmd("AT+BLEADVSTART\r\n");/* 透傳模式: 必須等待有客戶端連接之后才能開啟.連接之前可以先設置一下 透傳 的一些參數*//* 7. 設置透傳的一些參數 */Inf_ESP32_SendCmd("AT+BLESPPCFG=1,1,7,1,5\r\n");
}
發送數據:
直接使用Transmit。
void Inf_ESP32_BLE_SendData(uint8_t data[], uint16_t dataLen)
{if(dataLen == 0) return;HAL_UART_Transmit(&huart2, data, dataLen, 2000);
}
接收數據:
/*
當連接成功之后:+BLECONN:0,"7f:b3:6a:19:f4:35" 開啟透傳+BLECONNPARAM:0,0,0,6,0,500+WRITE:0,1,7,1,2,+BLECONNPARAM:0,0,0,40,0,500
選擇服務和特征:+WRITE:0,1,7,1,2,+WRITE:0,1,7,1,2,+WRITE:0,1,7,1,2,+WRITE:0,1,7,1,2,
傳送數據:+WRITE:0,1,5,,4,abcd關閉連接的時候:+BLEDISCONN:0,"41:74:6e:e5:05:a8"*/
void Inf_ESP32_BLE_ReadData(uint8_t data[], uint16_t *dataLen)
{*dataLen = 0;if(rxSize == 0) return;/* 開始對數據進行解析處理 */if(strstr((char *)rxBuff, "+BLECONN:")) /* 表示有客戶端連接進來 */{/* 開啟透傳模式 */printf("有客戶端連接,準備開啟透傳...\r\n");Inf_ESP32_SendCmd("AT+BLESPP\r\n");printf("透傳開啟成功...\r\n");}else if(strstr((char *)rxBuff, "+BLEDISCONN:")){/* 如果連接斷開, 應該關閉透傳模式 */printf("客戶端退出,關閉透傳模式 \r\n");HAL_UART_Transmit(&huart2, "+++", 3, 2000);HAL_Delay(1500);/* 重新廣播 */printf("重新開始廣播\r\n");Inf_ESP32_SendCmd("AT+BLEADVSTART\r\n");}else if(strstr((char *)rxBuff, "+BLECONNPARAM:") || strstr((char *)rxBuff, "+WRITE")){/* 什么都不做 */}else{/* 真正的透傳數據 */memcpy(data, rxBuff, rxSize);*dataLen = rxSize;}memset(rxBuff, 0, rxSize);rxSize = 0;
}