ESP32蓝牙支持
ESP-IDF 目前支持两个主机堆栈。基于 Bluedroid 的堆栈(默认)支持传统蓝牙和 BLE(低功耗蓝牙),而基于 Apache NimBLE 的堆栈仅支持 BLE
常见功能选择
1、同时涉及传统蓝牙和 BLE 的应该选用 Bluedroid
2、仅涉及 BLE 的用例,建议选用 NimBLE(NimBLE-based host APIs - ESP32-C3 - — ESP-IDF 编程指南 release-v5.1 文档 (espressif.com))。在代码占用和运行时,NimBLE 对内存的要求较低,因此适用于此类场景
两种蓝牙能力
通信协议GATT
样例代码位置
GATT 客户端样例
部分头文件用途
bt.h:从主机端配置BT控制器和VHCI。
esp_bt_main.h:初始化并启用 Bluedroid 堆栈。
esp_gap_ble_api.h:实现GAP配置,如通告和连接参数。
esp_gattc_api.h:实现GATT客户端配置,如连接外设、搜索服务等。
常用API样例
初始化
esp_err_t ret = nvs_flash_init();
if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
ESP_ERROR_CHECK(nvs_flash_erase());
ret = nvs_flash_init();
}
ESP_ERROR_CHECK( ret );
控制器结构&初始化
控制启动支持四种模式:
ESP_BT_MODE_IDLE:蓝牙未运行
ESP_BT_MODE_BLE:BLE模式
ESP_BT_MODE_CLASSIC_BT: BT 经典模式
ESP_BT_MODE_BTDM:双模式(BLE + BT Classic)
esp_bt_controller_config_t bt_cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT(); // 根据宏生成
ret = esp_bt_controller_init(&bt_cfg);// 初始化配置
// 如果要使用双模式(BLE + BT),则应使用ESP_BT_MODE_BTDM
ret = esp_bt_controller_enable(ESP_BT_MODE_BLE);// 启动控制器
初始化和启用Bluedroid 堆栈
ret = esp_bluedroid_init();
ret = esp_bluedroid_enable();
注册 GAP 和 GATT 事件处理程序
//扫描结果的回调
ret = esp_ble_gap_register_callback(esp_gap_cb);
//register the callback function to the gattc module
ret = esp_ble_gattc_register_callback(esp_gattc_cb);
ret = esp_ble_gattc_app_register(PROFILE_A_APP_ID);
esp_err_t local_mtu_ret = esp_ble_gatt_set_local_mtu(500);
if (local_mtu_ret){
ESP_LOGE(GATTC_TAG, "set local MTU failed, error code = %x", local_mtu_ret);
}
客户机完整工作逻辑视图
完整代码(不含消息处理)
#include <stdint.h>
#include <string.h>
#include <stdbool.h>
#include <stdio.h>
#include "nvs.h"
#include "nvs_flash.h"
#include "controller.h"
#include "bt.h"
#include "esp_gap_ble_api.h"
#include "esp_gattc_api.h"
#include "esp_gatt_defs.h"
#include "esp_bt_main.h"
#include "esp_gatt_common_api.h"
void app_main()
{
// Initialize NVS.
esp_err_t ret = nvs_flash_init();
if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
ESP_ERROR_CHECK(nvs_flash_erase());
ret = nvs_flash_init();
}
ESP_ERROR_CHECK( ret );
esp_bt_controller_config_t bt_cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT();
ret = esp_bt_controller_init(&bt_cfg);
if (ret) {
ESP_LOGE(GATTC_TAG, "%s initialize controller failed, error code = %x\n", __func__, ret);
return;
}
ret = esp_bt_controller_enable(ESP_BT_MODE_BLE);
if (ret) {
ESP_LOGE(GATTC_TAG, "%s enable controller failed, error code = %x\n", __func__, ret);
return;
}
ret = esp_bluedroid_init();
if (ret) {
ESP_LOGE(GATTC_TAG, "%s init bluetooth failed, error code = %x\n", __func__, ret);
return;
}
ret = esp_bluedroid_enable();
if (ret) {
ESP_LOGE(GATTC_TAG, "%s enable bluetooth failed, error code = %x\n", __func__, ret);
return;
}
//register the callback function to the gap module
ret = esp_ble_gap_register_callback(esp_gap_cb);
if (ret){
ESP_LOGE(GATTC_TAG, "%s gap register failed, error code = %x\n", __func__, ret);
return;
}
//register the callback function to the gattc module
ret = esp_ble_gattc_register_callback(esp_gattc_cb);
if(ret){
ESP_LOGE(GATTC_TAG, "%s gattc register failed, error code = %x\n", __func__, ret);
return;
}
ret = esp_ble_gattc_app_register(PROFILE_A_APP_ID);
if (ret){
ESP_LOGE(GATTC_TAG, "%s gattc app register failed, error code = %x\n", __func__, ret);
}
esp_err_t local_mtu_ret = esp_ble_gatt_set_local_mtu(500);
if (local_mtu_ret){
ESP_LOGE(GATTC_TAG, "set local MTU failed, error code = %x", local_mtu_ret);
}
}
运行结果
我公司承接各类技术服务,主要聚焦于:stm32、单片机、嵌入式、QT应用开发、Web+Python+Django应用开发。欢迎合作。