两款都是主流的蓝牙协议栈,Nimble是由 Apache 基金会主导开发的开源蓝牙协议栈,主要支持BLE,专注于轻量级、低资源占用,Nimble 的 BLE 核心功能仅需约 10KB RAM(运行时)和 50KB Flash(代码),适合低功耗、资源受限的嵌入式设备,如 BLE 传感器(温湿度、运动传感器)、可穿戴设备(手环、手表)、物联网节点等,优先追求节能和轻量化。

Bluedroid主要由Google开发,同时支持BLE和经典蓝牙,作为 Android 系统的默认蓝牙协议栈,功能更全面,但资源消耗更高。仅 BLE 功能就需要约 50-100KB RAM,适合需要完整蓝牙功能的设备,如同时支持 BLE 和经典蓝牙的智能家居设备(蓝牙音箱、中控屏)、需要音频传输的设备(蓝牙耳机、车载系统),或依赖高阶 Profiles 的场景。

在ESP32中使用Nimble初始化流程如下:

1. 初始化NVS Flash:nvs_flash_init()

2. 初始化Nimble主机层和控制器:nimble_port_init()

3. 初始化GAP服务:ble_svc_gap_init()

4. 初始化GATT服务:ble_svc_gatt_init()

5. 添加GATT服务:ble_gatts_add_svcs()

6. 主机协议配置并保存:ble_store_config_init()

7. 启动Nimble协议主循环:nimble_port_run(),它会处理协议栈的事件队列,调度各种蓝牙操作,只有当主循环开始后,协议栈才会真正驱动射频硬件开始发送广播包。

在ESP32中使用Bluedroid初始化流程如下:

1. 初始化NVS Flash:nvs_flash_init()

2. 初始化蓝牙控制器:esp_bt_controller_init()

3. 使能蓝牙控制器模式:esp_bt_controller_enable(ESP_BT_MODE_BLE)

4. 初始化蓝牙协议栈:esp_bluedroid_init()

5. 使能蓝牙协议栈:esp_bluedroid_enable(),到此协议栈已经启动,不过没有开始广播。

6. 注册GAP服务事件回调函数:esp_ble_gap_register_callback(),不触发事件

7. 注册GATT服务事件回调函数:esp_ble_gatts_register_callback(),不触发事件

8. 注册应用程序:使用esp_ble_gatts_app_register(),注册完成后,会触发第一个事件,并引起连锁反应,开始执行如下操作:

        8.1 配置GAP服务:配置广播数据和广播参数,然后开始广播;

        8.2 配置GATT服务:配置GATT属性表,开启GATT服务

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐