static void ble_evt_dispatch(ble_evt_t * p_ble_evt)
{
ble_conn_params_on_ble_evt(p_ble_evt);
ble_nus_on_ble_evt(&m_nus, p_ble_evt);
on_ble_evt(p_ble_evt);
}
在任何与BLE相关的事件被协议栈上抛上来给app时,ble_evt_dispatch就会被调用。从而将事件抛给各个
服务函数或处理模块,这里是将事件抛给了
连接参数管理处理函数ble_conn_params_on_ble_evt
Uart服务的事件处理函数ble_nus_on_ble_evt (nus为Nordicuart server)
通用的事件处理函数on_ble_evt
不同的事件在事件结构体ble_evt_t中通过id来区分。不同是事件处理函数通常也只是处理自己感情
去的事件。
static uint32_t rx_char_add(ble_nus_t *p_nus, const ble_nus_init_t *p_nus_init)
sec_params_init
安全参数的初始化。主要设置:
超时时间:比如配对过程中某一步的确认超过这个时间还未收到那么便是超时。
Bond:是否绑定。如果需要绑定,配对过程会有第三步的密钥分发,然后app将密钥存储在flash这样下次
就可以避免了下次重复配对的过程。
MITM:是否需要中间人保护。
Io_caps:本设备的I/O能力。比如有显示屏,有键盘。
当使能了MITM并且两端设备一个有键盘,一个有显示屏时,配对过程中就会显示一个配对码,对端设备
通过键盘再输入。
如果没有MITM保护配对过程中的信息是很容易被监听到的。但是如果有了MITM因为这个配对码信息是
一端显示一端输入,并不会通过链路传输。因为除了两端设备不会有第三个设备知道。因此后续的链路加密
就很难被破解。
OOB:与MITM类似,只是配对码不是通过键盘输入而是通过两端设备的通信通道传输,比如NFC,当然前提
是该通信链路是安全的。不如也没必要绕个弯而不直接用BLE来传输了。
加密密钥的大小在7-16字节之间。
advertising_start:
广播的类型有四种:
通用广播:用途最广的广播方式。可以被扫描到,以及可以被连接。
定向广播:用来快速建立和目标设备建立连接。报文中包含自己以及目标地址。
不可连接广播:只广播数据,不可以被扫描以及连接。
可发现广播:可以被扫描(回复扫描相应数据),不可以被连接。
静态密码设置:
交换的信息包括:
两端设备的输入输出能力如:是否有显示屏,键盘等。
是否需要绑定(如果设置了绑定配对的)。
是否需要MITM,是否使用OOB等
配对的过程不仅只是输入配对码这样,后续还会根据输入的配对码,以及两端设备交换的随机数来生成
链路密钥来加密链路以及分配后续的长期密钥,身份解析密钥等需要的密钥。
typedef struct BlkMyServiceTag{
uint16_t conn_handle; // 连接后用 来记录下句柄,供续使连接后用
uint16_t service_handle; // 保存服务的句柄
ble_gatts_char_handles_t handle; //保存特性句柄
}BlkMyService;
BlkMyService my_service; // 这个全局变量保存了我们的服务相关信息
Nordic的SDK将flash操作封装成一个pstorage模块。模块提供了很好用的flash操作接口。
实现动态广播的方法是: 广播->停止广播->修改参数->重启广播