《ESP32从0到1》之:蓝牙一对多主机(下)


文章内容

基于bluetooth->gattc_multi_connect示例创建工程,读懂程序,配合已有蓝牙从机设备,实现蓝牙主机一对多通信。

下篇:程序解读及实现


硬件

● 一款 ESP32 开发板(本专辑中均使用ESP32-LyraT-Mini V1.2开发板)
● USB 数据线 (A 转 Micro-B)
● 电脑(Windows)

基于bluetooth->gatt_server示例创建工程

备注:gatt_server示例相当于一个蓝牙从机设备,仅用于配合读懂gattc_multi_connect程序。实际gattc_multi_connect程序会根据采购的蓝牙从机设备进行修改配对测试

1. 创建并打开工程

ctrl+alt+P,输入ESP-IDF show,选择“ESP-IDF: Show Examples Projects” ,搜索框输入“gatt”,找到“gatt_server”,选择“Create Project using example gatt_server”,在跳出的保存框中,选择某一文件夹,新建Project文件夹,保存。用于存放新建的gattc_server工程。
注意:文件夹名称和路径中最好不要有中文且路径尽量短;
在这里插入图片描述

2.编译并烧录

点击左下角编译按钮。成功编译后打开开发板并连接开发板UART烧录口,选择正确的串口号,点击下载,选择UART,下载程序。
在这里插入图片描述
连接开发板UART串口,打开串口工具,波特率115200,便于观察程序运行情况。

3.记录其GATT服务和debug信息

手机下载安装“BLE蓝牙助手”,打开蓝牙助手,可用设备栏找到“ESP_GATTS_DEMO”设备,点击“连接”。
在这里插入图片描述
在这里插入图片描述
ESP_GATTS_DEMO蓝牙服务中包含两个自定义服务,其中一个服务UUID:00ff开头,该服务下只有一个特征,UUID:ff01开头,其属性为可读可写可notfiy。
在这里插入图片描述
点击ff01特征后的铃铛按钮,打开notfiy,在实时日志页面可看到自动上报的数据。
在这里插入图片描述
说明:gattc_multi_connect示例主要针对的是00ff服务的相关操作。

基于bluetooth->gattc_multi_connect示例创建工程

1. 创建并打开工程(该步骤同上,不做赘述)

在这里插入图片描述

2. 解读程序

♢变量及结构体解释(其服务UUID和特征UUID与gatt_server示例的对应
在这里插入图片描述
关于连接时间的补充说明:
两个设备的一次数据发送与接收成为一个连接事件。连接间隔则为两个连接事件之间的时间。不同的应用可能会需要不同的连接间隔,较小的连接间隔会减少数据的响应时间,相应的也会增大功耗。
减少连接间隔将:
·增加主机从机功耗
·增加两个设备之间的吞吐量
·减少数据往返两设备所需的时间
增加连接间隔将:
·减少主机从机功耗
·减少两个设备之间的吞吐量
·增大数据往返两设备所需的时间

♢程序流程图
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
关于ESP_GATT_UUID_CHAR_CLIENT_CONFIG的补充说明:
UUID为0x2902的特征描述符是Client Characteristic Configuration Descriptor(CCCD),它用于管理特征值的通知和指示功能。当需要向客户端设备(及蓝牙主机)发送特征值的实时更新(例如,传感器数据的变化)时,可以使用通知(Notifications)和指示(Indications)这两种机制。

为了支持这些功能,需要在对应的特征上添加UUID为0x2902的特征描述符。

以下情况下需要在BLE服务器中添加UUID为0x2902的特征描述符:
·当需要向客户端发送特征值的实时更新时,例如:环境传感器读数或设备状态变化。
·当特征需要支持通知(Notifications)或指示(Indications)功能时。通知是一种无需客户端确认的、低延迟的数据更新机制,而指示则需要客户端的确认,以确保数据传输的可靠性。

在实践中,为特征添加UUID为0x2902的特征描述符后,客户端可以通过写入该描述符来启用或禁用特征的通知或指示功能。例如,客户端可以写入0x0001来启用通知,写入0x0002来启用指示,或写入0x0000来禁用这两种功能。

需要注意的是,并非所有特征都需要支持通知和指示功能。只有在需要实时更新特征值的情况下,才需要为特征添加UUID为0x2902的描述符。

♢针对采购的蓝牙从机设备修改gattc_multi_connect程序,并联调测试
采购的蓝牙从机设备服务及特征表如图所示
在这里插入图片描述
做如下修改:
1)修改服务和特征UUID

#define REMOTE_SERVICE_UUID      0xffe0   //  0x00FF   //对应蓝牙从机设备(gatt_server)服务UUID
#define REMOTE_NOTIFY_CHAR_UUID  0xffe4  //  0xFF01   //对应服务UUID为0x00FF下的特征UUID

2)修改要连接从机设备名称

static const char remote_device_name[3][20] = {"YX-BLE-Tag", "YX-BLE-Tag", "YX-BLE-Tag"};

3)因为该测试从机要打开notify的特征排序是第4个,因此程序中涉及到的char_elem_result_a[0]、char_elem_result_b[0]、char_elem_result_c[0]需改成char_elem_result_a[3]、char_elem_result_b[3]、char_elem_result_c[3]
注意:第3项修改实际是理解错误,会导致后续运行中出现bug,后续《运行及debug信息》章节中有详细说明

3. 编译并下载程序(该步骤同上,不做赘述)

4. 运行及debug信息

运行后发现蓝牙从机模块连接成功,但实际debug发现,主机端并没有成功收到notfiy信息。
在这里插入图片描述
debug信息中显示“未发现描述符”,按照debug信息查询,发现错误发生在ESP_GATTC_REG_FOR_NOTIFY_EVT事件处理程序中,esp_ble_gattc_get_attr_count根据handle获取特征描述符数量,结果count<=0,也就是未查询到指定的特征描述符,猜测可能是handle不对
在这里插入图片描述
程序中在ESP_GATTC_SEARCH_CMPL_EVT事件处理中,esp_ble_gattc_register_for_notify注册服务通知之前增加log语句
在这里插入图片描述
在ESP_GATTC_REG_FOR_NOTIFY_EVT事件处理中,esp_ble_gattc_get_attr_count上方增加一个log语句,将esp_ble_gattc_get_attr_count参数打印出来,人为确认问题点。
在这里插入图片描述
运行后发现debug信息如下:
在这里插入图片描述
服务的起始和结束handle范围是0x21~0x36,而char_handle却是0x3ffc,超过范围。

尝试将char_elem_result_a[3]、char_elem_result_b[3]、char_elem_result_c[3]改回之前的char_elem_result_a[0]、char_elem_result_b[0]、char_elem_result_c[0]则debug如下:
在这里插入图片描述
修改之后运行,服务的起始和结束handle范围是0x21~0x36,而char_handle是0x2d,在范围中了,提示写描述符错误。但是依旧收到了从机设备自动上报的数据。用串口助手调试发现点击“notify”按钮时,串口助手同样提示notify操作失败。最终确定原因是从机设备自动使能了其notify功能导致的。

至此,程序调试运行初步成功(只实现了一个从机设备的连接)。需要注意的是,gattc_multi_connect示例程序中也有说明,其默认一个特征值只有一个描述符,因此char_elem_result_a[0]、char_elem_result_b[0]、char_elem_result_c[0]都是以0为索引做条件判断的。

针对此次实验用的从机模块,一个服务下面有5个特征,其中有3个特征支持notify,当前的程序只支持指定一个UUID的特征开启notify,若要同时开启多个,则程序需要进行调整。

后续待实现的功能:一对多;同时开启多个notfiy。

详细后续会记录在下一篇文章《ESP32从0到1》之蓝牙一对多主机(补充篇),记得关注哦!


欢迎关注并留言

文章同步发表于公众号"IT搬砖客",欢迎关注并留言

  • 24
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT搬砖客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值