【esp32】blufi源码分析

一、blufi介绍

blufi是乐鑫推出的ble配网协议。

二、blufi源码分析

2.1 nvs初始化

nvs的概念:非易失性存储 (NVS) 库主要用于在 flash 中存储键值格式的数据。例程中初始化nvs是用nvs来存储kv(键值对)格式的标志位或者数据,比如存储ap的ssid和passwd、是否进行过初始化。

2.2 初始化wifi

static void initialise_wifi(void)
{
    
    
    ESP_ERROR_CHECK(esp_netif_init());
    wifi_event_group = xEventGroupCreate();
    ESP_ERROR_CHECK(esp_event_loop_create_default());
    esp_netif_t *sta_netif = esp_netif_create_default_wifi_sta();
    assert(sta_netif);
    ESP_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &wifi_event_handler, NULL));
    ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &ip_event_handler, NULL));

    wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
    ESP_ERROR_CHECK( esp_wifi_init(&cfg) );
    ESP_ERROR_CHECK( esp_wifi_set_mode(WIFI_MODE_STA) );
    ESP_ERROR_CHECK( esp_wifi_start() );
}

执行流程如下:

  • 初始化tcp/ip协议栈
  • 创建一个FreeRTOS的事件组,事件组是一个16bit的数据,可以表示16个事件的状态,一个任务使用xEventGroupSetBits可以设置相应的事件标志,另一个任务使用xEventGroupWaitBits阻塞等待某个事件位被置位,从而实现多任务的同步。
  • 创建一个event loop,并且注册wifi和ip的回调函数,用于处理相应的wifi、ip事件。
  • 初始化wifi外设、设置wifi的工作模式、启动wifi。

2.3 释放蓝牙控制器内存

esp_err_t esp_bt_controller_mem_release(esp_bt_mode_t mode)
{
    
    
    ESP_LOGW(BTDM_LOG_TAG, "%s not implemented, return OK", __func__);
    return ESP_OK;
}

sdk中还没有实现释放内存的功能。

2.4 蓝牙控制器初始化

用默认配置初始化蓝牙控制器

2.5 使能蓝牙控制器

使能蓝牙控制器为BLE模式

2.6 blufi host初始化

执行到这个部分根据用户对蓝牙协议的配置有两种情况。

  • bluedroid:bluedroid是在安卓上替代linux种的bluez的一个蓝牙协议栈。
  • nimble:nimble是 Apache 基金会下一个开源的蓝牙5.0协议栈,具备完整的Host及Controller层。资源占用少,支持蓝牙5.0特性,也支持Mesh等功能。

2.6.1 使用bluedroid的情况

(未分析)

2.6.2 使用nimble的情况

  • 初始化gatt的blufi服务
  • 设置gap的设备名称
  • 创建nimble_port线程
  • 初始化bt控制器

2.7 注册blufi回调

注册blufi回调,在blufi事件产生时处理相应的事件。

2.8 执行gap回调

int esp_blufi_gap_register_callback(void)
{
    
    
    return 0;
}

例程中gap回调还没实现。

猜你喜欢

转载自blog.csdn.net/weixin_43810563/article/details/121446802
今日推荐