【WCH蓝牙系列芯片】-基于CH582开发板—蓝牙从机中添加一组自定义128bit的UUID属性服务
-------------------------------------------------------------------------------------------------------------------------------------
在蓝牙从机中,每个服务、特征值都有一个对应的UUID。在CH582的蓝牙从机程序中默认使用的16bit的UUID。在Peripheral程序中默认的主服务的16bit的UUID是0xFFE0,特征值的16bit的UUID是0xFFE1~0xFFE5,为了完全控制UUID长度和内容,需要在新添加的属性服务中设置为128bit.
第一步:
添加一个存放属性服务的文件夹,里面包含user_gap_service.c,user_gap_service.h文件,将程序中默认的16bit的属性服务gattprofile.c和gattprofile.h全部复制到user_gap_service.c,user_gap_service.h文件中

第二步:修改主服务和属性特征值的UUID
在user_gap_service.c文件中,将原先DE 16bit的UUID全部跟换为128bit的UUID,将原先的ATT_BT_UUID_SIZE,改为ATT_UUID_SIZE,然后将UUID自定义写成128bit。这样自定义128bit的UUID,可以方便以后更改不同的需求。


第三步:
在定义BLE服务(Service)的属性类型中,为BLE设备声明一个自定义服务,并指定该服务的UUID值,将UUID的字节长度改为ATT_UUID_SIZE

在BLE服务的属性表,包括服务声明、特征值声明、特征值数据、用户描述和客户端特征配置。
在特征值数据中 ,需要将将ATT_BT_UUID_SIZE改为ATT_UUID_SIZE,这是对应自定义服务的UUID值,通过自定义UUID与其他特征区分
在特征声明、描述符等标准化属性必须使用16-bit UUID(ATT_BT_UUID_SIZE)
特征值自定义属性需使用128-bit UUID(ATT_UUID_SIZE)以保证唯一性


第五步:
定义处理GATT服务事件的回调函数,用于配置蓝牙低功耗(BLE)服务的回调函数,处理客户端对服务属性的读取和写入请求

第六步:

在读属性回调函数中,将原先的16bit的UUID程序,全部复制一遍到以下的128bit的UUID,
通过if(pAttr->type.len == ATT_BT_UUID_SIZE) 来判断,此时,请求读取数据的UUID是16位还有128位,
在128位UUID判断中,需要设置为uint64_t uuid = BUILD_UINT16(pAttr->type.uuid[12], pAttr->type.uuid[13]); ,为了能够读取到完整的UUID值,并且pAttr->type.uuid[12]和pAttr->type.uuid[13]中是的对应之前设置的UUID变化的参数值。

第七步:
在写属性回调函数中,与读属性回调函数中一样的操作,也是将原先的16bit的UUID程序,全部复制一遍到以下的128bit的UUID,
并且pAttr->type.uuid[12]和pAttr->type.uuid[13]中是的对应之前设置的UUID变化的参数值,提取最后两个字节构建16位UUID。实现某些自定义UUID设计。

第八步:
到这里128位的UUID设置已经完成,然后需要将属性服务添加在BLE中,定义一个ble_instrument_app_AddService函数,是用于添加BLE 服务,

在Peripheral_Init,从机初始化程序中,将服务进行注册添加,并且定义了五个特征值数组,通过使用 ble_instrument_app_SetParameter 函数设置每个特征值

ble_instrument_app_SetParameter 函数可以安全地设置各个特征参数的值,确保数据的正确

在Peripheral_Init,从机初始化程序中,还需将注册应用回调函数ble_instrument_app_RegisterAppCBs,将应用层的回调函数指针保存到全局变量中,以便在特征值发生变化时能够调用应用层的处理函数。如果传入的回调函数指针有效,则将保存到全局变量 ble_instrument_app_AppCBs 中

定义ble_instrument_appCBs_t 结构体,用于存储应用层的回调函数指针。ble_instrument_appChangeCB 是一个回调函数,当特征值发生变化时,系统会调用该函数进行处理,
-
特征值发生变化时,
ble_instrument_appChangeCB函数会被调用。 -
通过
paramID_2参数,可以区分是哪个特征值发生了变化。 -
使用
ble_instrument_app_GetParameter函数获取特征值的当前值,并打印出来。这样,当蓝牙从机连接上蓝牙主机之后,从机通过写属性服务写入数据时,就可以获取到,并且知道是那个通道写入的数据,写入的是什么数据。



第九步:
添加发送通知数据的使能函数ble_instrument_app_Notify,使能时,确保 connHandle 是有效的连接句柄,否则通知发送会失败

在Peripheral中,定义专门用于发送NOTIFY数据的函数,先是判断数据长度,获取通知数据的长度,然后分配内存用于存储通知数据,调用 simpleProfile_Notify 函数向连接的设备发送通知数据。

在定义一个performPeriodicTask函数,将通知数据通过TMOS任务,一秒一次的速度发送到主机上。


这样整体的服务也就添加完成,通过BLE调试助手验证整个服务是否成功。



测试程序如下:
通过网盘分享的文件:31-基于CH582开发板—蓝牙从机中添加一组自定义128bit的UUID属性服务
链接: https://pan.baidu.com/s/1tJdKFnbeqHWp9M6HGWYEYA 提取码: xkx3
--来自百度网盘超级会员v5的分享
浙公网安备 33010602011771号