蓝牙广播多种不同类型的广播,其中:
使用1Mbps的PHY速率,可连接广播。
使用2MBps的PHY高速广播,可扫描。
1M 高速广播,
coded phy广播,可连接。
首先需要定义发送广播需要的几个参数:
// 定义一个 1M PHY 的地址
uint8_t addr_1m[6] = {0xc0, 0xde, 0x52, 0x00, 0x00, 0x01};
// 定义 1M PHY 的扩展广播数据
static uint8_t raw_adv_data_1m[] = {
0x02, 0x01, 0x06, // 广播标志
0x02, 0x0a, 0xeb, // 16 位厂商 ID
0x11, 0x09, 'E', 'S', 'P', '_', 'M', 'U', 'L', 'T', 'I', '_', 'A', // 设备名称
'D', 'V', '_', '1', 'M'
};
// 定义 1M PHY 的扩展广播参数
esp_ble_gap_ext_adv_t ext_adv[4] = {
// 实例,持续时间,间隔
[0] = {0, 0, 0}
};
esp_ble_gap_ext_adv_params_t ext_adv_params_1M = {
.type = ESP_BLE_GAP_SET_EXT_ADV_PROP_CONNECTABLE, // 广播类型为可连接
.interval_min = 0x30, // 广播间隔最小值
.interval_max = 0x30, // 广播间隔最大值
.channel_map = ADV_CHNL_ALL, // 广播信道
.filter_policy = ADV_FILTER_ALLOW_SCAN_ANY_CON_ANY, // 过滤策略
.primary_phy = ESP_BLE_GAP_PHY_1M, // 主要物理层
.max_skip = 0, // 最大跳过次数
.secondary_phy = ESP_BLE_GAP_PHY_1M, // 次要物理层
.sid = 0, // 广播 ID
.scan_req_notif = false, // 扫描请求通知
.own_addr_type = BLE_ADDR_TYPE_RANDOM, // 自身地址类型
.tx_power = EXT_ADV_TX_PWR_NO_PREFERENCE, // 发射功率
};
// 定义 GAP 事件处理函数
static void gap_event_handler(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param)
{
switch (event) {
case ESP_GAP_BLE_EXT_ADV_SET_RAND_ADDR_COMPLETE_EVT:
// 设置随机地址完成事件
xSemaphoreGive(test_sem);
ESP_LOGI(LOG_TAG, "ESP_GAP_BLE_EXT_ADV_SET_RAND_ADDR_COMPLETE_EVT, status %d", param->ext_adv_set_rand_addr.status);
break;
case ESP_GAP_BLE_EXT_ADV_SET_PARAMS_COMPLETE_EVT:
// 设置参数完成事件
xSemaphoreGive(test_sem);
ESP_LOGI(LOG_TAG, "ESP_GAP_BLE_EXT_ADV_SET_PARAMS_COMPLETE_EVT, status %d", param->ext_adv_set_params.status);
break;
case ESP_GAP_BLE_EXT_ADV_DATA_SET_COMPLETE_EVT:
// 设置广播数据完成事件
xSemaphoreGive(test_sem);
ESP_LOGI(LOG_TAG, "ESP_GAP_BLE_EXT_ADV_DATA_SET_COMPLETE_EVT, status %d", param->ext_adv_data_set.status);
break;
case ESP_GAP_BLE_EXT_SCAN_RSP_DATA_SET_COMPLETE_EVT:
// 设置扫描响应数据完成事件
xSemaphoreGive(test_sem);
ESP_LOGI(LOG_TAG, "ESP_GAP_BLE_EXT_SCAN_RSP_DATA_SET_COMPLETE_EVT, status %d", param->scan_rsp_set.status);
break;
case ESP_GAP_BLE_EXT_ADV_START_COMPLETE_EVT:
// 启动广播完成事件
xSemaphoreGive(test_sem);
ESP_LOGI(LOG_TAG, "ESP_GAP_BLE_EXT_ADV_START_COMPLETE_EVT, status %d", param->ext_adv_start.status);
break;
case ESP_GAP_BLE_EXT_ADV_STOP_COMPLETE_EVT:
// 停止广播完成事件
xSemaphoreGive(test_sem);
ESP_LOGI(LOG_TAG, "ESP_GAP_BLE_EXT_ADV_STOP_COMPLETE_EVT, status %d", param->ext_adv_stop.status);
break;
default:
break;
}
}
/*
* SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Unlicense OR CC0-1.0
*/
/****************************************************************************
*
* 本演示展示了 BLE GATT 服务器。它可以发送广播数据,被客户端连接。
* 运行 gatt_client 演示,客户端演示将自动连接到 gatt_server 演示。
* 客户端演示将在连接后启用 gatt_server 的通知。两个设备将交换数据。
*
****************************************************************************/
#include
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_log.h"
#include "nvs_flash.h"
#include "esp_bt.h"
#include "esp_gap_ble_api.h"
#include "esp_bt_defs.h"
#include "esp_bt_main.h"
#include "sdkconfig.h"
#include "freertos/semphr.h"
#define LOG_TAG "MULTI_ADV_DEMO"
// 定义一个宏,用于发送消息并等待信号量
#define FUNC_SEND_WAIT_SEM(func, sem) do { esp_err_t __err_rc = (func); if (__err_rc != ESP_OK) { ESP_LOGE(LOG_TAG, "%s, message send fail, error = %d", __func__, __err_rc); } xSemaphoreTake(sem, portMAX_DELAY); } while(0);
// 定义一个信号量,用于等待消息发送完成
static SemaphoreHandle_t test_sem = NULL;
// 定义一个 1M PHY 的地址
uint8_t addr_1m[6] = {0xc0, 0xde, 0x52, 0x00, 0x00, 0x01};
// 定义一个 1M PHY 的扩展广播参数
esp_ble_gap_ext_adv_params_t ext_adv_params_1M = {
.type = ESP_BLE_GAP_SET_EXT_ADV_PROP_CONNECTABLE, // 广播类型为可连接
.interval_min = 0x30, // 广播间隔最小值
.interval_max = 0x30, // 广播间隔最大值
.channel_map = ADV_CHNL_ALL, // 广播信道
.filter_policy = ADV_FILTER_ALLOW_SCAN_ANY_CON_ANY, // 过滤策略
.primary_phy = ESP_BLE_GAP_PHY_1M, // 主要物理层
.max_skip = 0, // 最大跳过次数
.secondary_phy = ESP_BLE_GAP_PHY_1M, // 次要物理层
.sid = 0, // 广播 ID
.scan_req_notif = false, // 扫描请求通知
.own_addr_type = BLE_ADDR_TYPE_RANDOM, // 自身地址类型
.tx_power = EXT_ADV_TX_PWR_NO_PREFERENCE, // 发射功率
};
// 定义 1M PHY 的扩展广播数据
static uint8_t raw_adv_data_1m[] = {
0x02, 0x01, 0x06, // 广播标志
0x02, 0x0a, 0xeb, // 16 位厂商 ID
0x11, 0x09, 'E', 'S', 'P', '_', 'M', 'U', 'L', 'T', 'I', '_', 'A', // 设备名称
'D', 'V', '_', '1', 'M'
};
// 定义 1M PHY 的扩展广播参数
esp_ble_gap_ext_adv_t ext_adv[4] = {
// 实例,持续时间,间隔
[0] = {0, 0, 0}
};
// 定义 GAP 事件处理函数
static void gap_event_handler(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param)
{
switch (event) {
case ESP_GAP_BLE_EXT_ADV_SET_RAND_ADDR_COMPLETE_EVT:
// 设置随机地址完成事件
xSemaphoreGive(test_sem);
ESP_LOGI(LOG_TAG, "ESP_GAP_BLE_EXT_ADV_SET_RAND_ADDR_COMPLETE_EVT, status %d", param->ext_adv_set_rand_addr.status);
break;
case ESP_GAP_BLE_EXT_ADV_SET_PARAMS_COMPLETE_EVT:
// 设置参数完成事件
xSemaphoreGive(test_sem);
ESP_LOGI(LOG_TAG, "ESP_GAP_BLE_EXT_ADV_SET_PARAMS_COMPLETE_EVT, status %d", param->ext_adv_set_params.status);
break;
case ESP_GAP_BLE_EXT_ADV_DATA_SET_COMPLETE_EVT:
// 设置广播数据完成事件
xSemaphoreGive(test_sem);
ESP_LOGI(LOG_TAG, "ESP_GAP_BLE_EXT_ADV_DATA_SET_COMPLETE_EVT, status %d", param->ext_adv_data_set.status);
break;
case ESP_GAP_BLE_EXT_SCAN_RSP_DATA_SET_COMPLETE_EVT:
// 设置扫描响应数据完成事件
xSemaphoreGive(test_sem);
ESP_LOGI(LOG_TAG, "ESP_GAP_BLE_EXT_SCAN_RSP_DATA_SET_COMPLETE_EVT, status %d", param->scan_rsp_set.status);
break;
case ESP_GAP_BLE_EXT_ADV_START_COMPLETE_EVT:
// 启动广播完成事件
xSemaphoreGive(test_sem);
ESP_LOGI(LOG_TAG, "ESP_GAP_BLE_EXT_ADV_START_COMPLETE_EVT, status %d", param->ext_adv_start.status);
break;
case ESP_GAP_BLE_EXT_ADV_STOP_COMPLETE_EVT:
// 停止广播完成事件
xSemaphoreGive(test_sem);
ESP_LOGI(LOG_TAG, "ESP_GAP_BLE_EXT_ADV_STOP_COMPLETE_EVT, status %d", param->ext_adv_stop.status);
break;
default:
break;
}
}
void app_main(void)
{
esp_err_t ret;
// 初始化 NVS
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_ERROR_CHECK(esp_bt_controller_mem_release(ESP_BT_MODE_CLASSIC_BT));
// 初始化蓝牙控制器
esp_bt_controller_config_t bt_cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT();
ret = esp_bt_controller_init(&bt_cfg);
if (ret) {
ESP_LOGE(LOG_TAG, "%s initialize controller failed: %s\n", __func__, esp_err_to_name(ret));
return;
}
// 启用蓝牙控制器
ret = esp_bt_controller_enable(ESP_BT_MODE_BLE);
if (ret) {
ESP_LOGE(LOG_TAG, "%s enable controller failed: %s\n", __func__, esp_err_to_name(ret));
return;
}
// 初始化蓝牙协议栈
ret = esp_bluedroid_init();
if (ret) {
ESP_LOGE(LOG_TAG, "%s init bluetooth failed: %s\n", __func__, esp_err_to_name(ret));
return;
}
// 启用蓝牙协议栈
ret = esp_bluedroid_enable();
if (ret) {
ESP_LOGE(LOG_TAG, "%s enable bluetooth failed: %s\n", __func__, esp_err_to_name(ret));
return;
}
// 注册 GAP 事件处理函数
ret = esp_ble_gap_register_callback(gap_event_handler);
if (ret){
ESP_LOGE(LOG_TAG, "gap register error, error code = %x", ret);
return;
}
vTaskDelay(200 / portTICK_PERIOD_MS);
// 创建信号量
test_sem = xSemaphoreCreateBinary();
// 设置 1M PHY 的扩展广播参数
FUNC_SEND_WAIT_SEM(esp_ble_gap_ext_adv_set_params(0, &ext_adv_params_1M), test_sem);
// 设置 1M PHY 的扩展广播随机地址
FUNC_SEND_WAIT_SEM(esp_ble_gap_ext_adv_set_rand_addr(0, addr_1m), test_sem);
// 配置 1M PHY 的扩展广播数据
FUNC_SEND_WAIT_SEM(esp_ble_gap_config_ext_adv_data_raw(0, sizeof(raw_adv_data_1m), &raw_adv_data_1m[0]), test_sem);
// 启动所有广播
FUNC_SEND_WAIT_SEM(esp_ble_gap_ext_adv_start(4, &ext_adv[0]), test_sem);
return;
}
程序烧写运行后,可以通过手机蓝牙调试APP查看到广播信息
连接设备后,可以看到两个默认的Servicecs,它们通用属性配置文件(GATT)服务,该服务用于在BLE设备上发现服务、特征和描述符。
蓝牙广播多种不同类型的广播,其中:
使用1Mbps的PHY速率,可连接广播。
使用2MBps的PHY高速广播,可扫描。
1M 高速广播,
coded phy广播,可连接。
首先需要定义发送广播需要的几个参数:
// 定义一个 1M PHY 的地址
uint8_t addr_1m[6] = {0xc0, 0xde, 0x52, 0x00, 0x00, 0x01};
// 定义 1M PHY 的扩展广播数据
static uint8_t raw_adv_data_1m[] = {
0x02, 0x01, 0x06, // 广播标志
0x02, 0x0a, 0xeb, // 16 位厂商 ID
0x11, 0x09, 'E', 'S', 'P', '_', 'M', 'U', 'L', 'T', 'I', '_', 'A', // 设备名称
'D', 'V', '_', '1', 'M'
};
// 定义 1M PHY 的扩展广播参数
esp_ble_gap_ext_adv_t ext_adv[4] = {
// 实例,持续时间,间隔
[0] = {0, 0, 0}
};
esp_ble_gap_ext_adv_params_t ext_adv_params_1M = {
.type = ESP_BLE_GAP_SET_EXT_ADV_PROP_CONNECTABLE, // 广播类型为可连接
.interval_min = 0x30, // 广播间隔最小值
.interval_max = 0x30, // 广播间隔最大值
.channel_map = ADV_CHNL_ALL, // 广播信道
.filter_policy = ADV_FILTER_ALLOW_SCAN_ANY_CON_ANY, // 过滤策略
.primary_phy = ESP_BLE_GAP_PHY_1M, // 主要物理层
.max_skip = 0, // 最大跳过次数
.secondary_phy = ESP_BLE_GAP_PHY_1M, // 次要物理层
.sid = 0, // 广播 ID
.scan_req_notif = false, // 扫描请求通知
.own_addr_type = BLE_ADDR_TYPE_RANDOM, // 自身地址类型
.tx_power = EXT_ADV_TX_PWR_NO_PREFERENCE, // 发射功率
};
// 定义 GAP 事件处理函数
static void gap_event_handler(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param)
{
switch (event) {
case ESP_GAP_BLE_EXT_ADV_SET_RAND_ADDR_COMPLETE_EVT:
// 设置随机地址完成事件
xSemaphoreGive(test_sem);
ESP_LOGI(LOG_TAG, "ESP_GAP_BLE_EXT_ADV_SET_RAND_ADDR_COMPLETE_EVT, status %d", param->ext_adv_set_rand_addr.status);
break;
case ESP_GAP_BLE_EXT_ADV_SET_PARAMS_COMPLETE_EVT:
// 设置参数完成事件
xSemaphoreGive(test_sem);
ESP_LOGI(LOG_TAG, "ESP_GAP_BLE_EXT_ADV_SET_PARAMS_COMPLETE_EVT, status %d", param->ext_adv_set_params.status);
break;
case ESP_GAP_BLE_EXT_ADV_DATA_SET_COMPLETE_EVT:
// 设置广播数据完成事件
xSemaphoreGive(test_sem);
ESP_LOGI(LOG_TAG, "ESP_GAP_BLE_EXT_ADV_DATA_SET_COMPLETE_EVT, status %d", param->ext_adv_data_set.status);
break;
case ESP_GAP_BLE_EXT_SCAN_RSP_DATA_SET_COMPLETE_EVT:
// 设置扫描响应数据完成事件
xSemaphoreGive(test_sem);
ESP_LOGI(LOG_TAG, "ESP_GAP_BLE_EXT_SCAN_RSP_DATA_SET_COMPLETE_EVT, status %d", param->scan_rsp_set.status);
break;
case ESP_GAP_BLE_EXT_ADV_START_COMPLETE_EVT:
// 启动广播完成事件
xSemaphoreGive(test_sem);
ESP_LOGI(LOG_TAG, "ESP_GAP_BLE_EXT_ADV_START_COMPLETE_EVT, status %d", param->ext_adv_start.status);
break;
case ESP_GAP_BLE_EXT_ADV_STOP_COMPLETE_EVT:
// 停止广播完成事件
xSemaphoreGive(test_sem);
ESP_LOGI(LOG_TAG, "ESP_GAP_BLE_EXT_ADV_STOP_COMPLETE_EVT, status %d", param->ext_adv_stop.status);
break;
default:
break;
}
}
/*
* SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Unlicense OR CC0-1.0
*/
/****************************************************************************
*
* 本演示展示了 BLE GATT 服务器。它可以发送广播数据,被客户端连接。
* 运行 gatt_client 演示,客户端演示将自动连接到 gatt_server 演示。
* 客户端演示将在连接后启用 gatt_server 的通知。两个设备将交换数据。
*
****************************************************************************/
#include
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_log.h"
#include "nvs_flash.h"
#include "esp_bt.h"
#include "esp_gap_ble_api.h"
#include "esp_bt_defs.h"
#include "esp_bt_main.h"
#include "sdkconfig.h"
#include "freertos/semphr.h"
#define LOG_TAG "MULTI_ADV_DEMO"
// 定义一个宏,用于发送消息并等待信号量
#define FUNC_SEND_WAIT_SEM(func, sem) do { esp_err_t __err_rc = (func); if (__err_rc != ESP_OK) { ESP_LOGE(LOG_TAG, "%s, message send fail, error = %d", __func__, __err_rc); } xSemaphoreTake(sem, portMAX_DELAY); } while(0);
// 定义一个信号量,用于等待消息发送完成
static SemaphoreHandle_t test_sem = NULL;
// 定义一个 1M PHY 的地址
uint8_t addr_1m[6] = {0xc0, 0xde, 0x52, 0x00, 0x00, 0x01};
// 定义一个 1M PHY 的扩展广播参数
esp_ble_gap_ext_adv_params_t ext_adv_params_1M = {
.type = ESP_BLE_GAP_SET_EXT_ADV_PROP_CONNECTABLE, // 广播类型为可连接
.interval_min = 0x30, // 广播间隔最小值
.interval_max = 0x30, // 广播间隔最大值
.channel_map = ADV_CHNL_ALL, // 广播信道
.filter_policy = ADV_FILTER_ALLOW_SCAN_ANY_CON_ANY, // 过滤策略
.primary_phy = ESP_BLE_GAP_PHY_1M, // 主要物理层
.max_skip = 0, // 最大跳过次数
.secondary_phy = ESP_BLE_GAP_PHY_1M, // 次要物理层
.sid = 0, // 广播 ID
.scan_req_notif = false, // 扫描请求通知
.own_addr_type = BLE_ADDR_TYPE_RANDOM, // 自身地址类型
.tx_power = EXT_ADV_TX_PWR_NO_PREFERENCE, // 发射功率
};
// 定义 1M PHY 的扩展广播数据
static uint8_t raw_adv_data_1m[] = {
0x02, 0x01, 0x06, // 广播标志
0x02, 0x0a, 0xeb, // 16 位厂商 ID
0x11, 0x09, 'E', 'S', 'P', '_', 'M', 'U', 'L', 'T', 'I', '_', 'A', // 设备名称
'D', 'V', '_', '1', 'M'
};
// 定义 1M PHY 的扩展广播参数
esp_ble_gap_ext_adv_t ext_adv[4] = {
// 实例,持续时间,间隔
[0] = {0, 0, 0}
};
// 定义 GAP 事件处理函数
static void gap_event_handler(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param)
{
switch (event) {
case ESP_GAP_BLE_EXT_ADV_SET_RAND_ADDR_COMPLETE_EVT:
// 设置随机地址完成事件
xSemaphoreGive(test_sem);
ESP_LOGI(LOG_TAG, "ESP_GAP_BLE_EXT_ADV_SET_RAND_ADDR_COMPLETE_EVT, status %d", param->ext_adv_set_rand_addr.status);
break;
case ESP_GAP_BLE_EXT_ADV_SET_PARAMS_COMPLETE_EVT:
// 设置参数完成事件
xSemaphoreGive(test_sem);
ESP_LOGI(LOG_TAG, "ESP_GAP_BLE_EXT_ADV_SET_PARAMS_COMPLETE_EVT, status %d", param->ext_adv_set_params.status);
break;
case ESP_GAP_BLE_EXT_ADV_DATA_SET_COMPLETE_EVT:
// 设置广播数据完成事件
xSemaphoreGive(test_sem);
ESP_LOGI(LOG_TAG, "ESP_GAP_BLE_EXT_ADV_DATA_SET_COMPLETE_EVT, status %d", param->ext_adv_data_set.status);
break;
case ESP_GAP_BLE_EXT_SCAN_RSP_DATA_SET_COMPLETE_EVT:
// 设置扫描响应数据完成事件
xSemaphoreGive(test_sem);
ESP_LOGI(LOG_TAG, "ESP_GAP_BLE_EXT_SCAN_RSP_DATA_SET_COMPLETE_EVT, status %d", param->scan_rsp_set.status);
break;
case ESP_GAP_BLE_EXT_ADV_START_COMPLETE_EVT:
// 启动广播完成事件
xSemaphoreGive(test_sem);
ESP_LOGI(LOG_TAG, "ESP_GAP_BLE_EXT_ADV_START_COMPLETE_EVT, status %d", param->ext_adv_start.status);
break;
case ESP_GAP_BLE_EXT_ADV_STOP_COMPLETE_EVT:
// 停止广播完成事件
xSemaphoreGive(test_sem);
ESP_LOGI(LOG_TAG, "ESP_GAP_BLE_EXT_ADV_STOP_COMPLETE_EVT, status %d", param->ext_adv_stop.status);
break;
default:
break;
}
}
void app_main(void)
{
esp_err_t ret;
// 初始化 NVS
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_ERROR_CHECK(esp_bt_controller_mem_release(ESP_BT_MODE_CLASSIC_BT));
// 初始化蓝牙控制器
esp_bt_controller_config_t bt_cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT();
ret = esp_bt_controller_init(&bt_cfg);
if (ret) {
ESP_LOGE(LOG_TAG, "%s initialize controller failed: %s\n", __func__, esp_err_to_name(ret));
return;
}
// 启用蓝牙控制器
ret = esp_bt_controller_enable(ESP_BT_MODE_BLE);
if (ret) {
ESP_LOGE(LOG_TAG, "%s enable controller failed: %s\n", __func__, esp_err_to_name(ret));
return;
}
// 初始化蓝牙协议栈
ret = esp_bluedroid_init();
if (ret) {
ESP_LOGE(LOG_TAG, "%s init bluetooth failed: %s\n", __func__, esp_err_to_name(ret));
return;
}
// 启用蓝牙协议栈
ret = esp_bluedroid_enable();
if (ret) {
ESP_LOGE(LOG_TAG, "%s enable bluetooth failed: %s\n", __func__, esp_err_to_name(ret));
return;
}
// 注册 GAP 事件处理函数
ret = esp_ble_gap_register_callback(gap_event_handler);
if (ret){
ESP_LOGE(LOG_TAG, "gap register error, error code = %x", ret);
return;
}
vTaskDelay(200 / portTICK_PERIOD_MS);
// 创建信号量
test_sem = xSemaphoreCreateBinary();
// 设置 1M PHY 的扩展广播参数
FUNC_SEND_WAIT_SEM(esp_ble_gap_ext_adv_set_params(0, &ext_adv_params_1M), test_sem);
// 设置 1M PHY 的扩展广播随机地址
FUNC_SEND_WAIT_SEM(esp_ble_gap_ext_adv_set_rand_addr(0, addr_1m), test_sem);
// 配置 1M PHY 的扩展广播数据
FUNC_SEND_WAIT_SEM(esp_ble_gap_config_ext_adv_data_raw(0, sizeof(raw_adv_data_1m), &raw_adv_data_1m[0]), test_sem);
// 启动所有广播
FUNC_SEND_WAIT_SEM(esp_ble_gap_ext_adv_start(4, &ext_adv[0]), test_sem);
return;
}
程序烧写运行后,可以通过手机蓝牙调试APP查看到广播信息
连接设备后,可以看到两个默认的Servicecs,它们通用属性配置文件(GATT)服务,该服务用于在BLE设备上发现服务、特征和描述符。
每一个童年的梦想都值得用青春去捍卫!