esp32使用nimble
esp32配置nimble
选择蓝牙主机堆栈 BLE only 节省 堆栈资源
idf.py menuconfig
Component config > Bluetooth -> NimBLE - BLE only (BT_NIMBLE_ENABLED)
nimble 相关 api
esp32 使用 NimBLE 堆栈,NimBLE-based host APIs 只有主要框架。
esp32 nimble 基础框架
伪代码框架如下:
void app_main(void){
//设置日志
esp_log_level_set("*", ESP_LOG_ERROR);
esp_log_level_set(tag, ESP_LOG_DEBUG);
//初始化NVS, ESP Bluetooth controller 初始化期间需要使用
nvs_flash_init();
//初始化 ESP Bluetooth controller、 VHCI transport layer(Host 与 ESP Bluetooth controller之间)
//如果 ESP Bluetooth controller 已经初始化,可以使用 esp_nimble_hci_init() 初始化其他部分
ESP_ERROR_CHECK(esp_nimble_hci_and_controller_init());
//初始化 host 栈, 这里已经设置 NimBLE 日志等级本地默认3 INFO,如果修改本地默认会增加没用的其他日志
nimble_port_init();
esp_log_level_set("NimBLE", ESP_LOG_DEBUG);//设置日志等级DEBUG
//初始化 nimble 相关配置参数 reset_cb、sync_cb、store_status_cb 等回调
// 执行 nimble_port_run() 后,在各种情况下触发对应回调
ble_hs_cfg.sync_cb = blehr_on_sync;//在启动和重置后 host and controller 同步时 回调
ble_hs_cfg.reset_cb = blehr_on_reset;// host 致命错误 reset 时回调
ble_hs_cfg.gatts_register_cb = gatt_svr_register_cb; //GATT 资源 (service, characteristic, or descriptor) 注册时回调
ble_hs_cfg.store_status_cb = ble_store_util_status_rr;//循环状态回调,如果新记录的存储容量不足,删除最旧的绑定并继续执行持久化操作,演示为主
/*
自定义的内容
如果是从设备:初始化所有的服务调用 ble_gatts_count_cfg、ble_gatts_add_svcs
如果是主设备:初始化需要链接设备对等结构体,初始化ble存储配置 ble_store_config_init
。。。
*/
//设置默认设备名
ble_svc_gap_device_name_set("nimble-default");
//开启 nimble 堆栈的线程
nimble_port_freertos_init(ble_host_task);
}
void ble_host_task(void *param)
{
nimble_port_run(); //只有调用了 nimble_port_stop() 才会退出。
nimble_port_freertos_deinit();
}
//停止
int ret = nimble_port_stop();
if (ret == 0) {
nimble_port_deinit(); //nimble_port_freertos_deinit();
ret = esp_nimble_hci_and_controller_deinit();
if (ret != ESP_OK) {
ESP_LOGE(TAG, "esp_nimble_hci_and_controller_deinit() failed with error: %d", ret);
}
}
开发流程 参考博客 nimble 蓝牙开发API
其余api 参考官方 NimBLE Host GAP Reference