以下是使用 ESP-IDF 库调用蓝牙模块并与手机配对连接的 C++ 代码示例:

  1. 首先需要包含必要的头文件:
#include "esp_bt.h"
#include "esp_bt_main.h"
#include "esp_gap_ble_api.h"
#include "esp_gatts_api.h"
#include "esp_gatt_common_api.h"
#include "esp_system.h"
#include "nvs_flash.h"
  1. 初始化蓝牙模块:
void init_ble()
{
    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_BTDM);
    esp_bluedroid_init();
    esp_bluedroid_enable();
    esp_ble_gatts_register_callback(gatts_event_handler);
    esp_ble_gap_register_callback(gap_event_handler);
    esp_ble_gatts_app_register(0);
}
  1. 设置广播和扫描参数:
void set_ble_adv_scan_params()
{
    esp_ble_adv_data_t adv_data;
    adv_data.include_name = true;
    adv_data.include_txpower = true;
    adv_data.min_interval = 0x20;
    adv_data.max_interval = 0x40;
    adv_data.appearance = 0x00;
    adv_data.manufacturer_len = 0;
    adv_data.p_manufacturer_data = NULL;
    adv_data.service_data_len = 0;
    adv_data.p_service_data = NULL;
    adv_data.service_uuid_len = 16;
    adv_data.p_service_uuid = (uint8_t *)&service_uuid;
    adv_data.flag = 0x04;

    esp_ble_gap_set_scan_params(&ble_scan_params);

    esp_ble_gap_config_adv_data(&adv_data);
    esp_ble_gap_start_advertising(&ble_adv_params);
}
  1. 处理扫描到的设备:
void gap_event_handler(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param)
{
    switch (event)
    {
    case ESP_GAP_BLE_SCAN_PARAM_SET_COMPLETE_EVT:
        esp_ble_gap_start_scanning(0);
        break;

    case ESP_GAP_BLE_SCAN_RESULT_EVT:
        if (param->scan_rst.search_evt == ESP_GAP_SEARCH_INQ_RES_EVT)
        {
            esp_ble_gap_stop_scanning();
            esp_ble_gap_set_scan_params(&ble_scan_params);
            esp_ble_gap_set_connect_params(&ble_conn_params);

            memcpy(&ble_peer_bdaddr, &param->scan_rst.bda, sizeof(esp_bd_addr_t));

            esp_ble_gattc_open(ble_gattc_if, &ble_peer_bdaddr, ESP_BLE_ADDR_TYPE_PUBLIC, true);
        }
        break;

    case ESP_GAP_BLE_SCAN_STOP_COMPLETE_EVT:
        esp_ble_gap_start_scanning(0);
        break;

    case ESP_GAP_BLE_UPDATE_CONN_PARAMS_EVT:
        break;

    default:
        break;
    }
}
  1. 连接设备并发现服务:
void gattc_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if, esp_ble_gattc_cb_param_t *param)
{
    switch (event)
    {
    case ESP_GATTC_REG_EVT:
        esp_ble_gattc_search_service(gattc_if, param->reg.app_id, &ble_svc_uuid);
        break;

    case ESP_GATTC_CONNECT_EVT:
        esp_ble_gattc_search_service(gattc_if, param->connect.conn_id, &ble_svc_uuid);
        break;

    case ESP_GATTC_SEARCH_RES_EVT:
        if (param->search_res.srvc_id.uuid.len == ESP_UUID_LEN_16 && param->search_res.srvc_id.uuid.uuid.uuid16 == 0x1800)
        {
            memcpy(&ble_svc_id, &param->search_res.srvc_id, sizeof(esp_ble_gatt_srvc_id_t));
            esp_ble_gattc_get_characteristic(gattc_if, param->search_res.conn_id, &ble_svc_id, &ble_char_uuid);
        }
        break;

    case ESP_GATTC_SEARCH_CMPL_EVT:
        if (param->search_cmpl.status == ESP_GATT_OK)
        {
            esp_ble_gattc_open(gattc_if, &ble_peer_bdaddr, ESP_BLE_ADDR_TYPE_PUBLIC, true);
        }
        break;

    case ESP_GATTC_OPEN_EVT:
        ble_gattc_if = gattc_if;
        ble_conn_id = param->open.conn_id;
        esp_ble_gattc_search_service(gattc_if, param->open.conn_id, &ble_svc_uuid);
        break;

    case ESP_GATTC_GET_CHAR_EVT:
        memcpy(&ble_char_id, &param->get_char.char_id, sizeof(esp_ble_gatt_char_id_t));
        esp_ble_gattc_register_for_notify(gattc_if, ble_peer_bdaddr, &ble_char_id);
        esp_ble_gattc_read_char(gattc_if, ble_conn_id, &ble_char_id, ESP_GATT_AUTH_REQ_NONE);
        break;

    case ESP_GATTC_REG_FOR_NOTIFY_EVT:
        if (param->reg_for_notify.status == ESP_GATT_OK)
        {
            esp_ble_gattc_write_char_descr(gattc_if, ble_conn_id, &ble_char_descr_id, 2, (uint8_t *)&ble_ccc_enable, ESP_GATT_AUTH_REQ_NONE);
        }
        break;

    case ESP_GATTC_NOTIFY_EVT:
        // 处理收到的通知数据
        break;

    case ESP_GATTC_WRITE_DESCR_EVT:
        esp_ble_gattc_read_char(gattc_if, ble_conn_id, &ble_char_id, ESP_GATT_AUTH_REQ_NONE);
        break;

    case ESP_GATTC_READ_CHAR_EVT:
        // 处理读取到的数据
        break;

    default:
        break;
    }
}
  1. 最后,在 main 函数中调用上述函数即可:
int main()
{
    nvs_flash_init();
    init_ble();
    set_ble_adv_scan_params();

    while (1)
    {
        vTaskDelay(1000 / portTICK_PERIOD_MS);
    }
}

注意:以上代码仅供参考,具体实现可能会因蓝牙模块型号和使用场景而有所不同。

ESP32 使用 ESP-IDF 库调用蓝牙模块并与手机配对连接 (C++)

原文地址: https://www.cveoy.top/t/topic/m7TC 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录