Chinaunix首页 | 论坛 | 博客
  • 博客访问: 601606
  • 博文数量: 165
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1554
  • 用 户 组: 普通用户
  • 注册时间: 2013-10-23 22:57
个人简介

我本仁慈,奈何苍天不许

文章分类

全部博文(165)

文章存档

2018年(1)

2016年(33)

2015年(5)

2014年(34)

2013年(92)

分类: 嵌入式

2016-07-21 14:12:33

原文地址:BLE-NRF51822-实现简单扫描器 作者:ifndef


sdk目录

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




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


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


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




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




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

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

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

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




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

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

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





在判断到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参数定义




值的意义依次为:

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这个事件的处理了。





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


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




打印结果如图所示




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


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



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

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

阅读(2081) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~