一、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回调还没实现。