在实际开发中用户都会遇到增加服务,增加特征,变更(增加)UUID的情况。

本文在SDK17.0的ble_app_uart例程上,硬件使用Nordic官方开发板PCA10040,添加1个服务,并在此服务下添加1个特征,且此服务与特征的UUID均不相同(UUID base也不相同)。

 

(UUID是什么:http://wywiot.com/blenote-whatisuuid/


准备工作

1.备份例程代码。这一步不是必须的,但为建议的,尽量不要修改SDK中原本的代码。

复制ble_app_uart文件夹,并命名为ble_app_uart_add_uuid。

2.备份服务文件。这一步不是必须的,但为建议的,尽量不要修改SDK中原本的代码。

将SDK中nus服务相关文件,复制粘贴到工程文件夹下,并重命名。

(一般来说,每个服务使用其自己的.c和.h文件,本文就在nus服务的基础上添加。)

3.替换项目中的服务文件。将工程项目中ble_nus.c文件替换为前面步骤准备的 ble_nus_modify.c

 

4.添加头文件路径。按照下图描述的顺序,添加头文件 ble_nus_modify.h 的路径。

 

5.修改头文件。将main.c 和 ble_nus_modify.c 中引用的头文件由 ble_nus.h 修改为ble_nus_modify.h

 

6.编译项目。编译项目无误后,进入下一步。


添加UUID

按照本文目的,将添加2个UUID,且各UUID的base不同。在sdk_config.h中,按下图方法,修改NRF_SDH_BLE_VS_UUID_COUNT 的数量为3(默认为1)。NRF_SDH_BLE_VS_UUID_COUNT代表非SIG UUID的个数。其数量会影响到协议栈使用RAM的空间。

如果用户项目中有其他个数的非SIG UUID,请自行按照需求修改。

 

在ble_nus_modify.c中添加实际的UUID宏定义,用户可以根据喜好或者项目要求修改,偷懒的可以随便改改,如下图所示。

新增服务的UUID base为(LSB){0x88, 0x88, 0x88, 0x88, 0x88, 0xE5, 0xA9, 0xE0, 0x93, 0xF3, 0xA3, 0xB5, 0x00, 0x00, 0x40, 0x6E}

新增特征的UUID base为(LSB){0x66, 0x66, 0x66, 0x66, 0x66, 0xE5, 0xA9, 0xE0, 0x93, 0xF3, 0xA3, 0xB5, 0x00, 0x00, 0x40, 0x6E}

新增服务的16bit UUID为 0x1234

新增特征的16bit UUID为 0x4567

 

完成之后,编译下载到DK板上(别忘了下载协议栈),此时代码是不能正常跑的,打开RTT 查看log,根据log修改应用层的RAM start和size。


添加服务及相关代码

1.按照下图,添加服务和特征的handle、UUID type、回调函数 等数据结构。

UUID type是协议栈分给各base UUID的序号,每个base UUID都有其自己的UUID type,它可以认为是base UUID的识别号码。相同的base UUID,有相同的UUID type。

 

2.在ble_nus_init 中添加新的服务和特征。

因为是新添加服务,新添加的特征又在这个服务中,所以添加新的服务和特征需要在原本函数末尾添加,不要插在原函数内容中间。

本文添加的这个特征,既可以发送数据(notify)也可以接收数据(write),实际使用根据需要选择。

添加代码如下:

 

3.回调函数及相关处理的添加。

将初始化时的新增char的回调函数指针,赋值给服务的数据结构中。

p_nus_init->new_data_handler 作为新增char的回调,后续程序调用会使用到。

 

在on_write事件中,依葫芦画瓢的添加新增char的处理。新增时注意使用正确的handle!

在on_hvx_tx_complete函数中,依葫芦画瓢的添加新增char的tx complete事件。新增时注意使用正确的handle!

4. 新增char的发送函数。

新增char如果有notify或indicate的属性,则需要一个发送函数。

下图为新增发送函数 ble_nus__new_data_send,用于使用新增char来notify。此发送函数与原版发送函数不同的地方仅为handle的处理。

 

至此,本文添加一个服务和特征的方法就介绍完了!


添加应用层代码

添加完服务文件中的相关代码后,还需要添加应用文件中的代码来使用和测试上述添加的效果。

1.添加应用层新服务(新char)的回调函数。

在service_init函数中,添加nus_new_data_handler作为新增的回调函数,新增的char收到数据后,会输出相应的log。

2.在uart_event_handle中添加新增char的发送函数。

收到串口数据后通过新增的char发送给手机。

此处仅为测试功能,产品代码不要在回调中做循环等可能占用时间较多的事情!

产品代码不建议这样添加!要发送的话,放在main loop中发送!


测试

编译烧录代码,使用nrf connect 连接设备,并查看蓝牙的服务。

可以看到服务的数量,特征的数量,它们的UUID,特征的性能都与前面代码设置的一样!

 

新增服务和特征的收发数据功能测试与官方例程相同的方式,这里不再赘述!

需要注意的是,log级别可以调整为DEBUG,可以看到更多的log信息。

 


参考代码

关注公众号  LazycatRadio  ,发送 “添加服务” 获取参考代码!

 

2 对 “Nordic BLE SOC 软件入门-nRF52添加服务和特征”的想法;

发表评论