【WCH蓝牙系列芯片】-基于CH582开发板—蓝牙从机模式修改蓝牙服务
-------------------------------------------------------------------------------------------------------------------------------------
在上一篇【WCH蓝牙系列芯片】-基于CH582开发板—添加一组自定义属性服务这篇博客中,
通过手机连接蓝牙,观察到在这个程序中添加一组自定义的属性服务,自定义包含五种不同属性的服务,包含可读、可写、通知、可读可写、安全可读。(write、read、notify等功能)。
下面将讲述如何在其他不同的char中添加自己想要的属性服务,在UUID为0Xffe3中添加,在Simple Profile Characteristic 3 Properties中添加一个notify属性,之前只有一个可写的属性。
<第一步>
<修改为>
<第二步>
添加用于存储每个连接的Client Characteristic Configuration(客户端特性配置)的数组。
<第三步>
根据模仿char4的配置,在char3中定义添加notify属性的配置
<第四步>
在SimpleProfile_AddService中,将添加一个char3的初始化,初始化所有连接的Client Characteristic Configuration特性的属性为默认值,可以确保在开始使用Client Characteristic Configuration之前具有正确的初始配置。
<第五步>
在simpleProfile_HandleConnStatusCB(用于处理连接状态的改变的回调函数)中,将添加一个char3的初始化,初始化所有连接的Client Characteristic Configuration特性的属性为默认值。
<第六步>
根据已有的char4通知函数,模仿写一个char3的通知函数,在原有的char4通知函数中红色框子中的函数改为char3的通知的参数。
定义两个宏定义,用于表示simpleProfileChar4和simpleProfileChar3在属性数组中的位置,通过使用这些宏,可以方便地指定和获取目标特性的值。
这里设置的宏定义值,与char3的通知函数将简单配置文件(simpleProfile)中属性表(simpleProfileAttrTbl)中第SIMPLEPROFILE_CHAR3_VALUE_POS位置对应的句柄(handle)赋值给指针pNoti->handle,可以使用该句柄来获取或操作属性的值。
这里设置的宏定义的值是与每个char的value所在位置是对应的。
这里的SIMPLEPROFILE_CHAR4_VALUE_POS定义为5,是在simpleProfileAttrTbl里面就查到// Characteristic 4 Declaration之前的所有服务的数量,所以就是将这个宏定义为5,就是找char4的NOTIFY的handle值。
#define SIMPLEPROFILE_CHAR4_VALUE_POS 5 这个定义的就是为了找char4的NOTIYF的服务特征的handle值,
如果以后在char1,char2,char3里面添加了NOTIYF的服务特征,都需要分别定义,并寻找属性表中所在的位置,然后在通过simpleProfile_Notify这个函数进行仿真写每一个NOTIYF的设置的handle值
<第七步>
在gattprofile.h中添加simpleProfile_Notify_char3函数声明
<第八步>
此时可以调用发送来验证通知功能是否正常。在peripheral.c中添加用于发送通知给连接设备的peripheraChar3特征,模仿之前的peripheraChar4 特征的函数差不多。
<第九步>
再编写一个用于执行char3周期性任务的函数
<第十步>
在用于处理外围设备任务(Peripheral Task)的事件中,加入char处理周期性事件的函数,作为调用。
<第十一步>:验证
从手机连接蓝牙后,会查看到在UUID为0Xffe3中添加一个notify通知。
新添加的notify通知接收数据与设置的数据是吻合的,数据为0x77,原先的notify通知接收数据功能也是正常,接收数据为0x88。