由于ESP32的gatt demo有很多个,然后不太好选择,测试时官方推荐基础型,修改服务特性时又推荐gatt_server_service_table 示例,因此使用起来又很麻烦,然后基础型可以和mesh兼容,table又不行,因此需要在基础型上新增特性和服务增删改查操作。并且广播设备名称修改也存在坑!!

首先修改设备名称为blufi_***,因为Blufi这个软件只能扫描出设备名为blufi打头的设备。此处有第一个坑。此处修改设备名不能只简单的修改设备名,也不知道乐鑫为什么会这样设计。

esp32 s3 gtp本地化_服务器

这里修改设备名称时需要遵循设备广播数据包格式

0x0B, 0x09, 'B','L','U','F','I','_','D','E','M','O'

第一字节:数据总长度

第二字节:数据属性,0x09为设备名属性

第3~N字节:真正的有效数据

官方数据属性表

esp32 s3 gtp本地化_服务器_02

此时此刻利用ESP的blufiAPP进行扫描能扫描到我们的设备

esp32 s3 gtp本地化_vscode_03

但是,设备是能扫描到了,但是无法正常连接,此时查看乐鑫文档可知,需要能够支持如下服务才能够和Blufi连接

esp32 s3 gtp本地化_物联网_04

由于gatts_service的demo中不具有此服务和此二特性,因此需要人为添加。但是,通过网上的搜索发现,官网和各个博主都推荐使用 gatt_server_service_table 示例去进行修改,(但是我们就头铁,也有功能需求原因)因此我们就只能自己想办法修改了。

此时由于demo中已经存在一个0X00FF的服务,因此,我们可以走个捷径,把这个0X00FF改为0XFFFF,这个特性就有了。当然也可以添加一个,这个就是抄一个即可。

esp32 s3 gtp本地化_物联网_05

此时已经有了这个服务了,我们只需要再添加一个特性即可

首先我们先添加一个特性ID(由于0XFF01已经有了)

esp32 s3 gtp本地化_服务器_06

我们只需要抄ff01即可

由于函数esp_ble_gatts_add_char()的功能为把Characteristic 添加到service中,因此我们调用此函数将FF02特性也添加到服务中

esp32 s3 gtp本地化_esp32 s3 gtp本地化_07

此时我们会发现由于同时添加两个特性,因此会很容易出现问题而报错,因此不能将其放在此处。经过查看log可发现,添加特性结束后会进入ESP_GATTS_ADD_CHAR_DESCR_EVT事件。所以我们采用的方法为,将0XFF01继续放在之前的位置,将0XFF02放入到ESP_GATTS_ADD_CHAR_DESCR_EVT事件回调函数调用

esp32 s3 gtp本地化_物联网_08

esp32 s3 gtp本地化_物联网_09

如果对FF02的添加位置不加以限制将会出现死循环添加现象,由此引入变量is_c_char,更多特性添加也可使用此方法。

此时利用蓝牙助手扫描发现我们还是无法看到FF02,难道是添加没有成功?肯定是还有地方没有修改,再仔细研读代码,我们会发现,原来是长度被我们限制了

esp32 s3 gtp本地化_物联网_10

原来是句柄数定义少了,那怎么定义句柄数呢。

官方有说明

句柄数定义为4,num_handle:该服务所需的句柄数 service、characteristic declaration、 characteristic value、characteristic description 的句柄数总和。Demo中用的是4(1+3),如果有两个特征,则为7(1+3+3).

此时再将我们的句柄数修改后,蓝牙助手扫描查看,和要求长得一样了,利用EspBluFi扫描连接测试完成,大功告成!!!

有更多关于ESP32 GATT_SERVICE属性和服务添加删除和交互问题欢迎评论区留言讨论!