Nordic BLE SOC 软件入门-nRF52添加服务和特征
在实际开发中用户都会遇到增加服务,增加特征,变更(增加)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 ,发送 “添加服务” 获取参考代码!
好文章,讲解的很透彻,步骤也非常的详细
谢谢!