前言
ESP32 是一款同時包含WIFI 藍芽兩者通訊方式的晶片,之前學習過WIFI,這次學習一下其藍芽功能,雖然之前有使用過其他的藍芽晶片,但大多數都是使用應用層,很少去了解底層協議相關的知識,這一次從概念入手,細緻瞭解一下藍芽的相關概念,及ESP32相關的工程說明。
藍芽的基本介紹
1. 經典藍芽(BT)和低功耗藍芽(BLE)
當前的藍芽主要分為經典藍芽(Bluetooth Classic) 和 低功耗藍芽(Bluetooth Low Energy, BLE) 兩者各有優缺點,目前市面上所說的雙模藍芽就是同時使用了這兩種藍芽的模組。
1.1 基礎概念
- 經典藍芽 (Bluetooth Classic): 又稱為 BR/EDR(Basic Rate/Enhanced Data Rate),是一種廣泛用於音訊傳輸、資料傳輸的無線通訊技術。它在藍芽 1.0 到 3.0 版本中得到發展,支援較高的資料傳輸速率。
- 低功耗藍芽 (Bluetooth Low Energy, BLE): 在藍芽 4.0 版本中引入,旨在為物聯網(IoT)裝置提供更低功耗的通訊方式。BLE 是為節省電量而設計的,主要用於低資料傳輸速率和間歇性傳輸的應用。
1.2 主要區別
特性 | 經典藍芽 (Bluetooth Classic) | 低功耗藍芽 (Bluetooth Low Energy, BLE) |
---|---|---|
資料傳輸速率 | 高(最高 3 Mbps) | 低(1 Mbps,BLE 5.0 可以達到 2 Mbps) |
功耗 | 較高,適合持續連線的裝置 | 非常低,適合間歇性連線的裝置 |
應用場景 | 音訊流、檔案傳輸、鍵盤滑鼠、耳機等 | 感測器網路、心率監測、定位標籤等 |
連線時間 | 較長(大約 100 毫秒到幾秒) | 非常短(幾毫秒到幾十毫秒) |
拓撲結構 | 點對點、點對多點(主從結構) | 點對點、廣播、Mesh 網路 |
協議棧複雜性 | 複雜,支援多種協議和功能 | 簡單,專為低功耗和低複雜性設計 |
反應時間 | 較慢 | 較快 |
距離 | 通常為 10 米(理論上可達 100 米) | 通常為 50 米(理論上可達 100 米以上 |
1.3 優缺點和應用場景
經典藍芽 (Bluetooth Classic)
- 優點:
- 高資料速率: 經典藍芽支援更高的資料傳輸速率(最高 3 Mbps),適合需要傳輸大量資料的應用,例如音訊流和檔案傳輸。
- 成熟的生態系統: 經典藍芽已經被廣泛應用於消費類電子產品,如耳機、音響、車載裝置等,具有廣泛的相容性和成熟的硬體支援。
- 多種音訊協議支援: 支援 A2DP、HFP、HSP 等多種音訊傳輸協議,適合音訊傳輸應用。
- 缺點:
- 高功耗: 經典藍芽在連線和資料傳輸時功耗較高,不適合需要長時間待機的低功耗裝置。
- 連線時間長: 裝置連線建立時間較長,通常需要幾百毫秒到幾秒時間。
- 應用場景: 適用於需要持續、高資料量傳輸的應用場景,如藍芽音響、藍芽耳機、車載系統、檔案傳輸、遊戲手柄等。
低功耗藍芽 (Bluetooth Low Energy, BLE) - 優點:
- 低功耗: BLE 的設計目標是最大限度地降低功耗,非常適合需要長時間待機和間歇性通訊的應用,如智慧手錶、感測器、健身追蹤器等。
- 快速連線: BLE 裝置的連線和通訊時間非常短,通常在幾毫秒到幾十毫秒之間,能夠實現快速響應。
- 多種拓撲結構支援: 除點對點連線外,BLE 還支援廣播、Mesh 網路等,可以用於裝置發現和組網應用。
- 簡化的協議棧: BLE 協議棧更簡單,適合小型微控制器,降低了實現成本和複雜性。
- 缺點:
- 低資料速率: 儘管 BLE 5.0 提升了資料傳輸速率,但其速率仍然相對較低(1-2 Mbps),不適合高頻寬需求的應用。
- 音訊傳輸有限: BLE 本身不支援經典藍芽的高質量音訊傳輸協議(如 A2DP),因此在音訊傳輸方面的應用較少。
- 應用場景:適用於需要低功耗、間歇性傳輸的應用場景,如智慧手錶、健身追蹤器、心率監測器、遠端遙控、物聯網感測器網路等。
2. 藍芽Mesh 和 藍芽 BLE
藍芽Mesh是一種 網路技術。藍芽Mesh網路依賴於 藍芽BLE。
低功耗藍芽技術是藍芽Mesh使用的無線通訊協議棧。
藍芽Mesh基於藍芽BLE低功耗廣播。
不是本文的重點,這裡不再過多說明。
3. 藍芽協議棧
這裡主要以BLE為主介紹,下面是BLE協議棧的整體框架:
這裡用一張表格總結一下:
應用層(Profiles) | 包含公共任務和私有任務。 公共任務時SIG藍芽協議小組定義的藍芽任務, 私有任務時使用者自定義的藍芽任務。 開發應用者所有的任務應用就是在這個層。 | |
---|---|---|
主協議層 (Host) | L2CAP (logic link control and adaptation) | L2CAP對LL進行了一次簡單封裝,L2CAP要區分是加密通道還是普通通道,同時還要對連線間隔進行管理。 |
SMP (Secure manager protocol) | 管理BLE連線的加密和安全。 | |
ATT (Attribute protocol) | 開發者接觸最多的ATT。用來定義使用者命令及命令操作的資料,比如讀取某個資料,寫某個 資料。BLE引入了attribute概念,用來描述 一條一條的資料。Attribute除了定義資料,同時定義該資料可以使用的ATT命令。 | |
GAP (Generic access profile) | 主要用來進行廣播,掃描和發起連線等。 GAP是對LL層payload(有效資料包)如何 進行解析的兩種方式中的一種,最簡單的那種。GAP簡單的對LL payload進行一些規範和定義。 | |
GATT (Generic attribute profile) | GATT用來規範attribute 中的資料內容,並運用group(分組)的概念對attribute 進行分類管理。為主從裝置互動資料提供Profile、 Service、Characteristic等概念的抽象、管理。沒有GATT,BLE也能跑,但是互聯互通會出問題,相容性差。 | |
控制層 (Controller) | PEY (Physical layer 物理層) | 指定BLE所用的無線-頻段,調製解調方式和方法,傳輸資料的速度,整個BLE晶片功耗、靈敏度以及selectivity等影片指標。 |
LL (LinkLayer 鏈路層) | 核心,具體選擇哪個射頻通道進行通訊,怎麼識別空中資料包,具體在哪個時間點把資料包傳送出去,怎麼保證資料完整性,ACK接收, 重傳,對鏈路的管理和控制等。 負責把資料發出去或者接收回來,對資料的解析是GAP或者ATT。 | |
HCI (Host controller interface) | 主要用於兩個MCU實現BLE協議棧的場合,規範兩者之間的通訊協議和命令。 HCI是可選的。 |
4. 藍芽晶片方案的實現
對於BR/EDR 藍芽裝置型別,Controller 通常包含 無線電處理、基帶、鏈路管理、和可選擇的HCI介面層;
對應LE Controller 主要包含LE PHY、鏈路層、和可選擇的HCI;
如果把 BR/EDR Controller 和 LE Controller設 計到一個Controller,就是我們常說的雙模藍芽。
在單晶片方案中,Controller 和 Host,profiles,和應用層都在同一片晶片中;
在網路控制器模式中,Host 和 Controller 是在一起執行的,但是應用 和 profiles 在另外一個器件上,比如 PC 或者其他微控制器,可以透過 UART, USB進行操作;
在雙晶片模式中,Controller 執行在一個控制器,而應用層,profiles和 Host 是執行在另外一個控制器上。
ESP-IDF 藍芽框架介紹
看下ESP32-IDF官網對於藍芽API的描述:
1. 基於Bluedroid的示例
1.1 ble部分
- ble_throughput:藍芽吞吐量實驗,一個client,一個server,需要兩個裝置測試。
- ble_ancs:藍芽裝置與IOS裝置連線示例。
- ble_compatibility_test:藍芽和手機相容性測試。
- ble_eddystone:Eddystone是一個來自谷歌的開放信標協議規範,支援Android和iOS智慧裝置平臺。
- ble_hid_device_demo:ESP-IDF BLE HID裝置演示(滑鼠鍵盤等)。
- ble_ibeacon:iBeacon模式,用於定位。
- ble_spp_client/ble_spp_server:SPP(Serial Port Profile)協議,藍芽串列埠示例。
- gattc_multi_connect/gatt_client:建立GATT多連線客戶端的API演示。
- gatt_security_client/gatt_security_server:Gatt安全客戶瑞演示/Gatt安全伺服器演示。
- gatt_server/gatt_server_service_table:Gatt伺服器演示,兩種不同建立方式,推薦後一種。
1.2 ble_50部分
- ble50_security_client/ble50_security_server:藍芽5.0安全客戶瑞演示/Gatt安全伺服器演示。
1.3 經典藍芽classic_bt部分
- a2dp_sink:使用藍芽傳統模式A2DP接受音訊流,藍芽揚聲器示例。
- a2dp_source:A2DP音訊源角色演示,這是使用高階音訊分發配置檔案API傳輸音訊流的演示,用這個示例實現行動式音訊播放器或麥克風。
- bt_discovery:經典藍芽裝置和服務發現演示。
- bt_spp_acceptor/bt_spp_initiator/bt_spp_vfs_acceptor/bt_spp_vfs_initiator:SPP相關,前面提到的藍芽串列埠的接收傳送端的示例。
- hfp_ag/hfp_hf:示例透過提供一組命令來演示如何使用擴音(HF)音訊閘道器(AG)元件的API及其效果。
1.4 coex部分
- a2dp_gatts_coex:這個演示展示了建立GATT服務和A2DP配置檔案的API,並演示了BLE和經典藍芽共存。
- gattc_gatts_coex:gatt相關,可以和前面的gatt client demo.互相配合測試。
2. 基於ESP-BLE-MESH示例
- ble_mesh_fast_provision:關於a Fast Provisioning Server/Client。快速組網。
- ble_mesh_node:使用通用的OnO客戶端模型來獲取/設定通用的開/關狀態。演示如何將BLE Mesh裝置設定為具有一定功能的節點(server)
- ble_mesh_sensor_model:感測器客戶端示例,演示如何在Provisionert中建立感測器客戶湍模型,感測器伺服器示例演如何在未配置的裝置中建立感測器伺服器模型和感測器設定伺服器模型。
- ble_mesh_vendor_model:可程式設計網格供應商客戶惴示例,演示如何在Provisionert中建立供應商客戶機模型,供應商伺服器示例演示如何在未配置的裝置中建立供應商伺服器模型。
- aligenie_demo:BLE mesh裝置與AliGeniei配合使用(阿里精靈)
- ble_mesh_coex_test:BLE Mesh和TCP伺服器/客戶端共存示例。
- ble_mesh_console:ble mesh node基本特徵的示例。
- ble_mesh_provisioner:BLE Meshi裝置如何作為一個provisioneri進行工作。
- ble_mesh_wifi_coexist:用來測試當BLE Mesh實現正常的配網和收發訊息的正常功能時,Wi-Fi所能達到的最大throughput值(吞吐量)。
3. 基於HCL的示例
- bel_adv_scan_combined:帶有virtual HCI interfacel的藍芽廣播和掃描示例。
- controller_hci_uart:UART HCI控制器,這是一個btdm控制器,使用UART作為HCI IO。
- controller_vhci_ble_adv:帶有virtual HCI interfacel的藍芽廣播示例。
4. 基於 Apache NimBLE的示例
- blecent:建立GATT客戶端並執行被動掃描,然後連線到外圍裝置,目的在於理解可擴充套件的服務發現、連線和特徵操作。
- blehr:演示標準心率測量服務。它模擬收聽率測量,並在啟用通知時通知客戶端。目的在於瞭解通知訂閱和傳送通知。
- blecent:實現了支援開/關和級別模型的Bluetooth Mesh節點。目的在於理解如何構建可伸縮網格節點。
- bleprph:建立GATT伺服器,然後開始釋出廣播,等待連線到GATT客戶端。目的在於瞭解GATT資料庫配置、廣播和SMP相關的API。
- bleprph_wifi_coex:使用NimBLE host stack,同時執行ping網路實用程式和BLE GATT伺服器。
5. 其他和藍芽有關的示例
- blufi:blufi藍芽配網。
- esp_hid_device/esp_hid host:hid:定義了藍芽在人機介面裝置中的協議、特徵和使用規程。比如藍芽滑鼠,藍芽鍵盤等。