ESP32作为BLE客户端gatt-client教程

一、介绍

该代码实现了一个低功耗蓝牙 (BLE) 通用属性 (GATT) 客户端,该客户端扫描附近的外围服务器并连接到预定义的服务。然后,客户端搜索可用特征并订阅已知特征,以便接收通知或指示。该示例可以注册应用程序配置文件并初始化一系列事件,这些事件可用于配置通用访问配置文件 (GAP) 参数以及处理扫描、连接到外围设备以及读写特性等事件

二、include

gattc_demo.c 中包含的头文件是:

#include <stdint.h>

#include <string.h>

#include <stdbool.h>

#include <stdio.h>

#include "nvs.h"

#include "nvs_flash.h"

#include "controller.h"

这些是 FreeRTOS 和底层系统组件运行所必需的,包括日志记录功能和将数据存储在非易失性闪存中的库。

#include "bt.h"

#include "esp_gap_ble_api.h"

#include "esp_gattc_api.h"

#include "esp_gatt_defs.h"

#include "esp_bt_main.h"

#include "esp_gatt_common_api.h"

  • bt.h:从主机侧配置 BT 控制器和 VHCI。
  • esp_bt_main.h:初始化并启用 Bluedroid 堆栈。
  • esp_gap_ble_api.h:实现 GAP 配置,如广告、连接参数等。
  • esp_gattc_api.h:实现 GATT Client 配置,如连接外设、搜索服务等。

三、入口函数

main 函数首先初始化非易失性 storage library。该库允许在闪存中保存键值对,并被一些组件(如 Wi-Fi 库)用于保存 SSID 和密码:

esp_err_t 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 );

四、BT 控制器和堆栈初始化

  1. 首先创建一个 BT 控制器配置结构来初始化 BT 控制器,该结构使用宏生成的默认设置命名。BT 控制器在控制器端实现主机控制器接口 (HCI)、链路层 (LL) 和物理层 (PHY)。BT 控制器对用户应用程序不可见,并处理 BLE 堆栈的较低层。控制器配置包括设置 BT 控制器堆栈大小、优先级和 HCI 波特率。创建设置后,BT 控制器将初始化并使用以下功能启用:

esp_bt_controller_config_t bt_cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT();

ret = esp_bt_controller_init(&bt_cfg);

  1. 接下来,在 BLE 模式下启用控制器。

ret = es

### ESP32作为BLE客户端的示例代码及教程 #### 初始化和配置环境 为了使ESP32能够作为一个BLE客户端工作,需要先安装必要的库和支持包。这通常通过Arduino IDE或其他开发平台完成。 ```cpp #include <WiFi.h> #include <BluetoothSerial.h> #if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED) #error Bluetooth is not enabled! Please run `make menuconfig` to and enable it. #endif #include <esp_bt.h> #include <esp_gap_ble_api.h> #include <esp_gatts_api.h> #include <esp_gattc_api.h> #include <esp_bt_main.h> #include <esp_bt_device.h> ``` 这段代码展示了如何导入必需的头文件来支持BLE功能[^1]。 #### 设置BLE客户端模式 接下来,在程序启动时设定ESP32进入GATT客户机角色: ```cpp void setup() { Serial.begin(115200); esp_err_t ret; // Initialize NVS — if you wish to use an external flash chip, change this line accordingly. 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); // BLE初始化 esp_bluedroid_status_t bt_stat; bt_stat = esp_bluedroid_get_status(); if(bt_stat==ESP_BLUEDROID_STATUS_UNINITIALIZED){ ret = esp_bluedroid_init(); if (ret != ESP_OK) { Serial.printf("%s initialize bluedroid error\n", __func__); return; } } if(bt_stat!=ESP_BLUEDROID_STATUS_ENABLED){ ret = esp_bluedroid_enable(); if (ret != ESP_OK) { Serial.printf("%s enable bluedroid error\n",__func__); return; } } // 注册GAP回调函数 ret = esp_ble_gap_register_callback(gap_event_handler); if (ret){ Serial.printf("gap register failed, error code = %x\n", ret); return; } // 注册GATT Client回调函数 ret = esp_ble_gattc_register_callback(gattc_event_handler); if (ret){ Serial.printf("gattc register failed, error code = %x\n", ret); return; } } ``` 此部分负责初始化蓝牙协议栈,并注册用于处理各种事件(如发现新的BLE设备、连接状态变化等)的回调函数。 #### 执行扫描操作寻找目标服务 一旦完成了上述准备工作,则可以通过调用API来进行周边设备扫描: ```cpp static void start_scan(void){ uint32_t duration = 3; // Scan for three seconds. /* Start a scan; the application is responsible for stopping it */ esp_ble_gap_start_scanning(duration); } // 在适当的地方调用start_scan() ``` 当找到匹配的目标后,就可以尝试与其建立连接并获取所需的服务/特征信息了。 #### 连接至远程服务器并与之交互 成功建立了与某个特定外设之间的链接之后,便可以进一步探索其提供的服务列表及其下的各个特性。对于感兴趣的数据项还可以发起订阅请求以实时监听来自对方的通知消息。 ```cpp static 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_CONNECT_EVT:{ // 处理连接成功的逻辑... break; } case ESP_GATTC_SEARCH_CMPL_EVT:{ // 查找完成后遍历所有service... break; } default: break; } } ``` 以上就是基于ESP32构建一个简单的BLE GATT客户的概览介绍。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值