一般来说,蓝牙从机是比较常见的,因为其能提供一些服务。
主机通常就是接收数据的一方,只需要能够正确接收数据即可,比如一些手机APP就能充当主机的角色,这是因为手机可以接收蓝牙信号。如果有一些设备不具备蓝牙接收功能,但是也希望能够接收蓝牙从机的数据,那么就需要自己去实现一个蓝牙主机,就比如台式机,通常本身并不具备蓝牙接收功能,这时候,就可以购买一个蓝牙hub通过USB接入台式机,这时候,主机就充当一个透传的中间设备,将从机的数据透传到台式机上。
接下来,就认识下蓝牙主机吧。
扫描
主动扫描和被动扫描
如果需要从机发送扫描响应,就需要主动扫描,被动扫描只会接收广播,不会发送扫描请求,只有发送扫描请求才会收到扫描响应。
配置步骤
基本使用流程如下:
LOG初始化log_init
串口初始化uart_config
指示灯初始化leds_init
电源管理初始化power_management_init
协议栈初始化ble_stack_init,注册BLE事件回调函数ble_evt_handler
定义扫描器实例
NRF_BLE_SCAN_DEF(m_scan); //定义名称为m_scan的扫描器实例
扫描初始化scan_init
这里面需要设置扫描参数m_scan_param,初始化扫描器nrf_ble_scan_init时注册扫描事件处理函数scan_evt_handler,添加过滤器nrf_ble_scan_filter_set,使能过滤器nrf_ble_scan_filters_enable,这里要注意,在过滤器中注册的不是要过滤掉的,而是过滤器允许通过的,而且使能的过滤器类型必须是已经添加的。
启动扫描scan_start
关于获取扫描数据,直接参考手册3.4节以及对应工程实例
可以看到,其实主机中真正核心的步骤就三个,其他GATT和GAP等等,因为都属于服务,是从机的内容,所以此处无需配置。
关于扫描过滤
仔细想想,过滤器里注册的,应该是不符合要求的,还是符合要求的呢?
应该是符合的,因为符合要求的,可能就是指定的那几个,如果要填不符合的,那么就有千千万万个,是不可能全部填进去的。
白名单
也就是说,要通过的目标,要么在白名单中,要么在过滤器中。
过滤类型
添加过滤器nrf_ble_scan_filter_set
使能过滤器nrf_ble_scan_filters_enable
更多类型过滤,可直接参考文档和实验
以上是扫描阶段,当扫描到匹配的广播设备时,主机就会向从机发起连接。
发起连接
操作步骤如下:
注意,就算没有数据发送,一旦建立连接,主从机也会定时发送空包以维持连接事件,保持心跳。
手册中有这样的一句话
应该是如果不交换MTU并且不更新连接参数,那么,双方可能就无法正常通信,从而导致断开。
MTU交换
MTU交换仅在客户端连接期间发送一次,而非定期协商。
只有客户端可以发起MTU请求。
MTU交换属于属性协议,是由程序中的GATT模块处理的,因此需要加入GATT部分的代码。
1、头文件
2、NRF_BLE_GATT_DEF(m_gatt); //定义名称为m_gatt的GATT模块实例
3、初始化GATT,gatt_init,这里注册了GATT回调函数gatt_evt_handler
4、GATT处理函数
5、设置sdk_config.h
连接参数更新
使用协商式的连接参数更新
BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST://连接参数更新请求