ESP32-C3 学习测试 蓝牙 篇(五、添加 characteristic)_允许设备用一段字符串来联系characteristic

所以今天,我们势必得在示例基础上动一动,就先在现有 Service 的基础上,添加一个额外的characteristic。

ESP32-C3 入门专栏目录【导航】ESP32-C3 入门教程目录 【快速跳转】
❤️
ESP32-C3学习 蓝牙 篇系列博文连接:

❤️
测试使用的开发板:
自己画一块ESP32-C3 的开发板(第一次使用立创EDA)(PCB到手)

❤️
测试使用的开发环境:
ESP32-C3 VScode开发环境搭建(基于乐鑫官方ESP-IDF——Windows和Ubuntu双环境)

❤️
蓝牙篇系列相关博文:
ESP32-C3 学习测试 蓝牙 篇(一、认识 ESP-IDF 的蓝牙框架、简单的了解蓝牙协议栈)
ESP32-C3 学习测试 蓝牙 篇(二、蓝牙调试APP、开发板手机连接初体验)
ESP32-C3 学习测试 蓝牙 篇(三、认识蓝牙 GATT 协议)
ESP32-C3 学习测试 蓝牙 篇(四、GATT Server 示例解析)


一、示例更换说明

在我们前面几篇文章,都是从 GATT Server 示例说起的,本来也是计划从 GATT Server 示例来做以后测试的修改框架。

但是自己想增加一个 characteristic 的时候,发现无从下手。正好在上一篇文章《ESP32-C3 学习测试 蓝牙 篇(四、GATT Server 示例解析)》后又小伙伴留言问过,官方是不是推推荐 gatt_server_service_table ?

gatt_server_service_table

所以还是回头看了自己蓝牙篇的第一篇文章,看了下这两个的比较(当时属于概括,也没有什么特别说明):

在这里插入图片描述

于是乎还是得找到官方自己的示例说明,仔细看了一下示例说明,官方对 GATT Server 示例其实有说明,推荐了 gatt_server_service_table 示例,如下图:

在这里插入图片描述

在乐鑫官方论坛我也找到过类似的问题,其中有说明 GATT Server 是一种根据事件串行创建服务、特征值和描述符的,创建多服务或者特征值时不太方便,如下图:

在这里插入图片描述.

所以我们需要使用示例 gatt_server_service_table 作为我们的测试修改的示例,我们正常的新建一个示例,先简单看看示例框架:

/\*
 gatt\_server\_service\_table 示例初始化
 gatts\_table\_creat\_demo.c
\*/
void app\_main(void)
{
    esp\_err\_t ret;
    /\* Initialize NVS. \*/
    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\_enable(ESP_BT_MODE_BLE);
    ret = esp\_bluedroid\_init();
    ret = esp\_bluedroid\_enable();
    ret = esp\_ble\_gatts\_register\_callback(gatts_event_handler);
    ret = esp\_ble\_gap\_register\_callback(gap_event_handler);
    ret = esp\_ble\_gatts\_app\_register(ESP_APP_ID);
    esp\_err\_t local_mtu_ret = esp\_ble\_gatt\_set\_local\_mtu(500);
    }
}


初始化流程是和上一篇文章分析的 GATT Server 示例是一样的, 所以这里我们就不再次分析了。

❤️ 在ESP-IDF 中 GATT Server 的示例中,官方提供了一个 方便添加修改特征值和服务的示例 gatt_server_service_table 以供开发者使用。

.

二、示例测试

新的例程,不管三七二十一,先跑起来看看,程序正常便宜烧录,然后通过手机蓝牙助手可以看到设备:

在这里插入图片描述

我们前面已经有几篇文章的基础,所以本文不用讲太多理论,我们直接用图文说明几个地方。

2.1 广播包

Server 设备还没有连接的时候,会一直发送广播包,我们在手机端可以点击设备查看广播包等信息。

在 gatt_server_service_table 示例程序中广播包的定义用数组raw_adv_data表示,如下图:

gatt_server_service_table示例

这里在额外放一下 GATT Server 示例 的广播包,除了前面3个字节,后面都对不上,这里暂时我也不明白 = =!

GATT Server示例

2.1.1 设备名称

对于我们上一篇文章说明的 GATT Server 示例 ,我们直接修改宏定义就可以改变设备名称:

在这里插入图片描述

但是对于本文 gatt_server_service_table 示例来说,修改宏定义并不能改变设备名称:

在这里插入图片描述

说明: 这里我们是看表象,或许本质上,只是个关联设置问题,但是我们现在目的是快速使用,里面的本质这些我们暂时不考虑。

在广播包中会包含一些设置好的信息,其中就有设备名称,在我们的 gatt_server_service_table 示例中,可以看到广播包中有关于设备名称的部分:

在这里插入图片描述

所以,如果我们需要修改设备名称,我们直接在这个数组里面修改,但是不要忘了长度,修改示例如下:

在这里插入图片描述

2.2 服务与特征值

我们点击连接设备,可以看到 gatt_server_service_table 示例中的 Service 与 characteristic ,如下图:

在这里插入图片描述

对于这些不同的 characteristic ,我结合程序做了个示意图说明:

在这里插入图片描述

.

2.3 读写操作

读写操作在上一篇文章中,我们已经测试过了,换了一个示例,其实读写的简单测试还是一样的,这里针对几个地方再分别介绍一下。

2.3.1 通知 notify

通知,也算是一种可传递的消息,在我们介绍 GATT 协议的时候讲过,如果 characteristic 具有 notify 或 indicate 操作功能时,必须为其添加响应的CCCD(characteristic descriptor),这一点在程序中创建 characteristic 的时候就有体现:

在这里插入图片描述

对于通知的发送,是通过esp_ble_gatts_send_indicate 函数发送,如下图:

在这里插入图片描述

我们可以修改一下通知的值,测试一下看看:

在这里插入图片描述

接收不全? 看了下输出日志,应该是太长了,提示最大应该是20字节:

在这里插入图片描述

再改一次,这次OK:

在这里插入图片描述

.

这里还有一个地方需要说明,esp_ble_gatts_send_indicate 函数的最后一个参数,当为 false 时候,不需要得到回复,为 true 时,需要得到回复。

在这里插入图片描述

2.3.2 值 value

每一个 characteristic 都有自己的 value ,对于示例来,与 characteristic 的 value 关联的地方如下图:

在这里插入图片描述

既然知道了位置,那么和通知一样,我们简单修改测试一下:

在这里插入图片描述
.

❤️ 这里说明一下,在上面通知部分,我们看到测试示例的日志输出的提示为 attribute value too long, 我们以前说过 characteristic 的条目的实现都是通过 attribute 来表达的,所以对于notify 的最大长度为 20, 对于 characteristic value 来说也是一样的,最大长度为20。

上面的示例修改,如果数据长度超过20会有问题,手机端读取不到。

这个还有个小疑问, value 的长度大小可不可以自行设定?哪里设定?

这个问题后面如果有需要用到或者学到了再来解答,暂时先提出来。

三、示例修改(添加一个characteristic)

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

eristic)

[外链图片转存中…(img-Eb6LxxfI-1719224909792)]
[外链图片转存中…(img-8ZTPbJek-1719224909792)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值