BLE-NRF51822-实现简单扫描器

在sdk目录

XXX:\Keil_v5\ARM\Pack\NordicSemiconductor\nRF_Examples\9.0.0\ble_central  下有官方提供的主从连接的demo.


BLE-NRF51822-实现简单扫描器_第1张图片

官方的 demo 中实现的是主机通过名字来判断 周围的设备是否是自己要寻找的设备,如果是就发起来接。 并且连接建立后可以继续保持侦听,一共可以连接 8 个设备。 连接上后,从机可以通过按键 button1  来让主机的对应的 led 亮。这个例子是要在官方板 pca10028 上才可以看到现象的,其他的板子如果不兼容需要自己修改 button led 的引脚。


这里就在这个 central的例子上做一个简单的侦听器。


官方demo里面的main函数很简单如下图所示


BLE-NRF51822-实现简单扫描器_第2张图片

app_trace_init用来初始化打印模块,工程默认是关闭打印宏的,所以这个函数你右击找到的定义是空的。需要通过定义ENABLE_DEBUG_LOG_SUPPORT来打开打印功能。


BLE-NRF51822-实现简单扫描器_第3张图片

然后就是LED初始化,按键初始化(这个按键初始化是用来设置一个从深度睡眠中唤醒的引脚)。 协议栈初始化。

Client_handling_init初始化主要是用来注册自己想要找到的服务。比如你注册了服务A和对应的处理函数, 那么等主从机连接上后,并且服务发现完成后,就会判断发现的服务中是否有你之前注册的想要找的服务A有就会执行对应的回调处理函数。这个例子中我们没有用到,暂时不用关心。

Device_manager_init 用来初始化设备管理了,管理绑定信息之类的,这里也不需要用到

初始化完成后,调用 scan_start就可以进行广播了。


BLE-NRF51822-实现简单扫描器_第4张图片

前面一部分是判断 是否有正在处理的flash访问操作。如果有就暂时不启动广播,没有才会启动广播。  如果前面真的做了flash访问操作,并且没有完成岂不是不能广播了?

如果真有,广播会在flash操作完成后进行。相关代码如下

Flash操作完成首先会进入下面代码


BLE-NRF51822-实现简单扫描器_第5张图片
BLE-NRF51822-实现简单扫描器_第6张图片

在判断到flash访问完成后,清除正在访问flash的标志,并且调用启动广播函数scan_start。

scan_start最终调用如下协议栈API

uint32_t sd_ble_gap_scan_start

(

ble_gap_scan_params_t const * 

p_scan_params

)


找到m_scan_param参数定义


BLE-NRF51822-实现简单扫描器_第7张图片


值的意义依次为:

0,表示只侦听广播,不主动发起scan_req请求。

0,表示侦听所有广播包,不做过滤。

NULL,没有白名单

扫描间隔,和扫描窗口。(比如1s的间隔和0.5s的窗口,那么每1s就会启动侦听,但是只侦听0.5s,只会休眠。等待下一个1s到来)

0,表示没有扫描超时,即设备会一值侦听除非主动关闭扫描


启动广播之后,设备就会不断侦听其他设备的广播。

当收到广播数据后,协议栈会上抛一个BLE_GAP_EVT_ADV_REPORT事件给上层,所以实现一个简单的侦听器,我们直接在事件处理中添加一个BLE_GAP_EVT_ADV_REPORT事件的分支,并在该分支中提取收到的广播数据就可以了。


官方的例子里面已经有针对 BLE_GAP_EVT_ADV_REPORT这个事件的处理了。



BLE-NRF51822-实现简单扫描器_第8张图片

代码中就是从广播数据中提取了 设备名 然后判断是不是自己要连的那个设备。


我们不需要动这些代码,直接在前面添加广播数据的打印就可以了。如图所示


BLE-NRF51822-实现简单扫描器_第9张图片

打印结果如图所示


BLE-NRF51822-实现简单扫描器_第10张图片


    关于adv data的数据怎么解析,参考 教程 ble广播数据解析。


广播数据结构体中还有一个scan_rsp 没有使用


BLE-NRF51822-实现简单扫描器_第11张图片

这个为是用来区分 当前的广播数据是普通广播数据,还是收到的扫描响应数据(扫描者发送了scan_req,如果广播者可以响应则会回复scan_rsp)。

如果需要区分自己判断一下就行了

你可能感兴趣的:(NRF51822)