avatar

松果工作室

欢迎光临

  • 首页
  • freeRTOS
  • ESP
  • 开发手册
  • 快速笔记
  • 个人收藏
  • 工具
Home 蓝牙广播(Broadcast)
文章

蓝牙广播(Broadcast)

Posted 2023-12-19 Updated 2024-04- 9
By YCP
19~25 min read

使用流程

  • 定义 PHY地址
  • 设定广播参数
  • 定义广播内容
  • 开启bt_controller/bluedroid
  • 配置广播参数并执行

注意事项

  • 待完善

代码示例

#include <stdlib.h>
#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 "1M_LEGACY_PHY"
#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);

//步骤 1:设置 物理层PHY 地址
static SemaphoreHandle_t test_sem = NULL;
uint8_t addr_legacy[6] = {0xc0, 0xde, 0x52, 0x00, 0x00, 0x03};

//步骤 2:广播参数设置
esp_ble_gap_ext_adv_params_t legacy_adv_params = {
		.type = ESP_BLE_GAP_SET_EXT_ADV_PROP_LEGACY_IND,
		.interval_min = 0x40,//设置在0x0020到0x4000,默认0x0800(1.28s),实际时间=N * 0.625 ms,时间范围在20ms到10.24s
		.interval_max = 0x80,
		.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 = 2,
		.scan_req_notif = false,
		.own_addr_type = BLE_ADDR_TYPE_RANDOM,
		.tx_power = EXT_ADV_TX_PWR_NO_PREFERENCE,
};

//步骤 3:广播数据
static uint8_t legacy_adv_data[] = {
		0x02, 0x01, 0x06,
		0x02, 0x0a, 0xeb,
		0x14,0x09,'E', 'S', 'P', '_', 'M', 'U', 'L', 'T', 'I', '_', 'A',
		'D', 'V', '_', 'C', 'O', 'D', 'E', 'D',
		0x02,0x0E,'C'
};
static uint8_t legacy_scan_rsp_data[] = {
		0x02, 0x01, 0x06,
		0x02, 0x0a, 0xeb,
		0x07,0x09,'L', 'E', 'G', 'A', 'C', 'Y',
		0x02,0x0D,'C'
};

//不知道,反正要写
static 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);
			break;
		case ESP_GAP_BLE_EXT_ADV_SET_PARAMS_COMPLETE_EVT:
			xSemaphoreGive(test_sem);
			break;
		case ESP_GAP_BLE_EXT_ADV_DATA_SET_COMPLETE_EVT:
			xSemaphoreGive(test_sem);
			break;
		case ESP_GAP_BLE_EXT_SCAN_RSP_DATA_SET_COMPLETE_EVT:
			xSemaphoreGive(test_sem);
			break;
		case ESP_GAP_BLE_EXT_ADV_START_COMPLETE_EVT:
			xSemaphoreGive(test_sem);
			break;
		case ESP_GAP_BLE_EXT_ADV_STOP_COMPLETE_EVT:
			xSemaphoreGive(test_sem);
			break;
		default:
			break;
	}
}

void app_main(void) {
	nvs_flash_erase();
	nvs_flash_init();

	//步骤 3:初始化
	esp_bt_controller_mem_release(ESP_BT_MODE_CLASSIC_BT);
	esp_bt_controller_config_t bt_cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT();
	esp_bt_controller_init(&bt_cfg);
	esp_bt_controller_enable(ESP_BT_MODE_BLE);
	esp_bluedroid_init();
	esp_bluedroid_enable();
	esp_ble_gap_register_callback(gap_event_handler);

	vTaskDelay(200 / portTICK_PERIOD_MS);

	test_sem = xSemaphoreCreateBinary();

	//步骤 4:执行
	FUNC_SEND_WAIT_SEM(esp_ble_gap_ext_adv_set_params(0, &legacy_adv_params), test_sem);
	FUNC_SEND_WAIT_SEM(esp_ble_gap_ext_adv_set_rand_addr(0, addr_legacy), test_sem);
	FUNC_SEND_WAIT_SEM(esp_ble_gap_config_ext_adv_data_raw(0, sizeof(legacy_adv_data), &legacy_adv_data[0]), test_sem);
	FUNC_SEND_WAIT_SEM(
			esp_ble_gap_config_ext_scan_rsp_data_raw(0, sizeof(legacy_scan_rsp_data), &legacy_scan_rsp_data[0]), test_sem);

	FUNC_SEND_WAIT_SEM(esp_ble_gap_ext_adv_start(1, &ext_adv[0]), test_sem);
}
ESP-BLE
ESP
License:  CC BY 4.0
Share

Further Reading

Dec 8, 2024

CURL 的 POST/GET/PUT 方法

GET 请求 一个简单的 Get 请求 curl -X GET http://192.168.2.35/hello 添加请求头的 Get 请求 curl -X GET -H "Host: example.com" http://192.168.2.35/hello 添加查询的 Get 请求 curl

Dec 19, 2023

蓝牙广播(Broadcast)

使用流程 定义 PHY地址 设定广播参数 定义广播内容 开启bt_controller/bluedroid 配置广播参数并执行 注意事项 待完善 代码示例 #include <stdlib.h> #include "freertos/FreeRTOS.h" #

OLDER

事件组(Event Group)

NEWER

步进电机篇

Recently Updated

  • ESP32(八) 简单的webserver
  • ESP32(七) NVS
  • ESP32(四) STA & AP
  • 多级菜单
  • ESP32(五) ESP32 OTA

Trending Tags

WCH Linux Elec freeRTOS STM ESP Flutter Others SwiftUI

Contents

©2025 松果工作室. Some rights reserved.

Using the Halo theme Chirpy