本篇博客主要是用来记录我使用官方样例学习nRF51822 蓝牙广播以及配对的过程。主要是方便自己以后温习查看使用,其中有很多不全面的地方以及可能有些错误的地方,欢迎各大博友指出。
使用的样例还是app_ble_hrs,样例下载步骤可以查看我的同系列笔记三。
主函数初始化代码:
然后我从主函数的初始化代码开始一个一个往下面看
1、ble_stack_init ( )
ble_stack_init () 函数下包含了相关的SoftDevice模块的基本初始化模块。
SOFTDEVICE_HANDLER_INIT()设置系统时钟晶振以及是否需要具有事件调度程序。
softdevice_ble_evt_handler_set()设置蓝牙事件处理的回调函数入口
------->其中的 ble_evt_dispatch()函数是蓝牙在广播过程中会不断调用的函数,所以函数里面调用的处理蓝牙断开和连接的相关函数也会被频繁调用。
其中我们需要对蓝牙断开连接进行监控操作就应该在 ble_bondmngr_on_ble_evt()函数里面进行操作,至于这个频繁调用的频率应该跟我们后面配置的蓝牙广播的间隔时间有关。
softdevice_sys_evt_handler_set()设置系统事件处理的回调函数入口
-------->其中的sys_evt_dispatch()函数会在收到系统事件后,从系统事件中断处理程序中调用此函数
2、bond_manager_init()
bond_manager_init()其中包括了初始化持久存储模块 pstorage_init()以及一些绑定管理模块需要初始化的一些数据参数,这些我们使用的时候都可以按照样例的配置来。
3、gap_params_init()
gap_params_init()通用访问配置文件的参数配置,其中包括了设置蓝牙设备的名字 sd_ble_gap_device_name_set();设置蓝牙发送广播连接的最小和最大间隔时间。
4、advertising_init()
advertising_init()中包括了蓝牙相关服务uuid的初始化,这个是我们在具体使用时创建多个服务时就需要依次用一个UUID进行匹配。 在一个蓝牙设备中可以有多个服务,每一个服务可以包含多个特征值,每个特征值都可以有属于它的多个属性,例如长度、宽度等
5、services_init()
services_init()就是对我们在第四个函数 advertising_init()中定义的服务进行进一步的结构初始化。其中相关服务结构体的初始化定义可以参考 nRF51 SDK-s110 SoftDevice 下的相关描述(直接在右上角输入你想查找的结构体或者函数名即可)
6、conn_params_init()
这个是我们在使用时需要注意根据需要更改的函数。主要是初始化连接参数模块的功能结构体,包括连接状态更新之后的第二次广播的时间间隔,连接失败前尝试的总次数以及发生错误时要调用的函数入口。
7、sec_params_init()
对安全性相关的参数进行初始化的功能函数。使用时可以采用样例提供的配置,有特殊需求时就根据需要更改。
8、advertising_start()
主要是其中调用了一个开始广播的函数sd_ble_gap_adv_start(),通过查看API接口函数可以找到,若是想要停止广播则调用函数sd_ble_gap_adv_stop()即可。
总结:
通过代码分析之后可以知道,nRF51822 蓝牙广播配对的主要过程大致为:BLE堆栈的初始化---->绑定(必要)参数的初始化----->通用访问配置的初始化------>广播相关参数的初始化----->服务相关的初始化-------->连接参数的初始化----->安全参数的初始化----->开始广播
其中这些参数的具体配置都需要根据我们的具体需求进行更改,特别需要注意的是 BLE堆栈初始化 时,设置的连接和系统处理函数,这两个函数里面的操作极其重要。
参考链接