本文正在参与「金石方案 . 瓜分6万现金大奖」

前语

前面的蓝牙学习文章大多都是基础阐明,示例剖析,以前我就提到过假如初度触摸蓝牙开发,虽然知道基本的过程,可是每一个实质上是进行了哪些细节操作仍是彻底没头绪啊,运用这种彻底不知道底层完结的代码,可能会感觉很懵懂。

可是我主张大家先别着急,咱们首要需求认清方针:

咱们不是来研讨蓝牙协议的,咱们是来运用 ESP32-C3 跑蓝牙协议,用来 数据传输通讯的。咱们要会用 ESP—IDF 供给的示例结构,依据自己的实际需求修正代码,这就是咱们终究的意图 !(了解蓝牙协议栈的朋友就随意了 (灬ꈍ ꈍ灬))

终究咱们要完结一个小示例,经过蓝牙通讯,把传感器的数据发送给手机,然后手机也能够操控开发板上的LED灯。

咱们在上文说过蓝牙应用程序开发,就是开发 service 和 characteristic。经过API,增加自己需求的characteristic 和 service。

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

我是矜辰所致,全网同名,尽量用心写好每一系列文章,不浮夸,不迁就,认真对待学知识的咱们,矜辰所致,金石为开!

一、示例更换阐明

在咱们前面几篇文章,都是从 GATT Server 示例说起的,本来也是方案从 GATT Server 示例来做今后测验的修正结构。

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

gatt_server_service_table

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

ESP-IDF 蓝牙开发之 添加 characteristic

于是乎仍是得找到官方自己的示例阐明,细心看了一下示例阐明,官方对 GATT Server 示例其实有阐明,引荐了 gatt_server_service_table 示例,如下图:

ESP-IDF 蓝牙开发之 添加 characteristic

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

ESP-IDF 蓝牙开发之 添加 characteristic

所以咱们需求运用示例 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 以供开发者运用。

.

二、示例测验

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

ESP-IDF 蓝牙开发之 添加 characteristic

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

2.1 播送包

Server 设备还没有衔接的时分,会一向发送播送包,咱们在手机端能够点击设备检查播送包等信息。

在 gatt_server_service_table 示例程序中播送包的界说用数组raw_adv_data表示,如下图:

ESP-IDF 蓝牙开发之 添加 characteristic

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

ESP-IDF 蓝牙开发之 添加 characteristic

2.1.1 设备名称

关于咱们上一篇文章阐明的 GATT Server 示例 ,咱们直接修正宏界说就能够改动设备名称:

ESP-IDF 蓝牙开发之 添加 characteristic

可是关于本文 gatt_server_service_table 示例来说,修正宏界说并不能改动设备名称:

ESP-IDF 蓝牙开发之 添加 characteristic

阐明: 这儿咱们是看表象,或许实质上,仅仅个相关设置问题,可是咱们现在意图是快速运用,里边的实质这些咱们暂时不考虑。

在播送包中会包括一些设置好的信息,其间就有设备名称,在咱们的 gatt_server_service_table 示例中,能够看到播送包中有关于设备名称的部分:

ESP-IDF 蓝牙开发之 添加 characteristic

所以,假如咱们需求修正设备名称,咱们直接在这个数组里边修正,可是不要忘了长度,修正示例如下:

ESP-IDF 蓝牙开发之 添加 characteristic

2.2 服务与特征值

咱们点击衔接设备,能够看到 gatt_server_service_table 示例中的 Service 与 characteristic ,如下图:

ESP-IDF 蓝牙开发之 添加 characteristic

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

ESP-IDF 蓝牙开发之 添加 characteristic

2.3 读写操作

读写操作在上一篇文章中,咱们已经测验过了,换了一个示例,其实读写的简略测验仍是相同的,这儿针对几个当地再分别介绍一下。

2.3.1 告诉 notify

告诉,也算是一种可传递的消息,在咱们介绍 GATT 协议的时分讲过,假如 characteristic 具有 notify 或 indicate 操作功能时,必须为其增加响应的CCCD(characteristic descriptor),这一点在程序中创立 characteristic 的时分就有体现:

ESP-IDF 蓝牙开发之 添加 characteristic

关于告诉的发送,是经过esp_ble_gatts_send_indicate 函数发送,如下图:

ESP-IDF 蓝牙开发之 添加 characteristic

咱们能够修正一下告诉的值,测验一下看看:

ESP-IDF 蓝牙开发之 添加 characteristic

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

ESP-IDF 蓝牙开发之 添加 characteristic

再改一次,这次OK:

ESP-IDF 蓝牙开发之 添加 characteristic

.

这儿还有一个当地需求阐明,esp_ble_gatts_send_indicate 函数的最后一个参数,当为 false 时分,不需求得到回复,为 true 时,需求得到回复。

ESP-IDF 蓝牙开发之 添加 characteristic

2.3.2 值 value

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

ESP-IDF 蓝牙开发之 添加 characteristic

既然知道了方位,那么和告诉相同,咱们简略修正测验一下:

ESP-IDF 蓝牙开发之 添加 characteristic
.

这儿阐明一下,在上面告诉部分,咱们看到测验示例的日志输出的提示为 attribute value too long, 咱们以前说过 characteristic 的条意图完结都是经过 attribute 来表达的,所以关于notify 的最大长度为 20, 关于 characteristic value 来说也是相同的,最大长度为20。

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

这个还有个小疑问, value 的长度巨细可不能够自行设定?哪里设定?

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

三、示例修正(增加一个characteristic)

经过上面的基础测验,咱们开始在示例结构上增加一个新的 characteristic 。

这儿的过程我就直接运用图文阐明,我会把增加的文件名称,代码方位都截图出来:

3.1 UUID 界说

ESP-IDF 蓝牙开发之 添加 characteristic

3.2 枚举 界说

ESP-IDF 蓝牙开发之 添加 characteristic

3.3 增加属性表

ESP-IDF 蓝牙开发之 添加 characteristic
.

完结编译,遽然发现好简略= =!

经过手机检查一下作用:

ESP-IDF 蓝牙开发之 添加 characteristic

测验过后,读写操作都正常。

最后仍是得感叹一下,运用 gatt_server_service_table 增加 characteristic 真的是太便利了。

结语

本文咱们更换了一下蓝牙 GATT 学习的示例程序,经过进一步的的程序测验,让咱们更加的了解了 ESP-IDF 供给的示例结构,也知道了如何增加 characteristic。

当然这只算是咱们修正的开始,咱们接下来要在此基础上学会增加 Service,经过咱们自己增加的 Service和 characteristic 传输咱们自己的应用数据。

然后把以前传感器驱动整合进工程,最后完结咱们小方针:经过蓝牙通讯,把传感器的数据发送给手机,然后手机也能够操控开发板上的LED灯等设备。

路要一步一步走,大家先把本文的内容阐明了解学会,本文就到这,谢谢!