BLE-NRF51822-实现简单扫描器
在sdk目录
XXX:\Keil_v5\ARM\Pack\NordicSemiconductor\nRF_Examples\9.0.0\ble_central 下有官方提供的主从连接的demo.
官方的demo中实现的是主机通过名字来判断 周围的设备是否是自己要寻找的设备,如果是就发起来接。 并且连接建立后可以继续保持侦听,一共可以连接8个设备。 连接上后,从机可以通过按键button1 来让主机的对应的led亮。这个例子是要在官方板pca10028上才可以看到现象的,其他的板子如果不兼容需要自己修改button和led的引脚。
这里就在这个 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)。
如果需要区分自己判断一下就行了
BLE-NRF51822-实现简单扫描器相关推荐
- 1 nrf51822简介
本文的目的是教你如何一步步创建自己的BLE应用程序,包括使用nRF51822芯片创建一个定制的服务. 1.1 最低要求 需要有嵌入式C语言编程经验,以便完全理解本应用手册. 1.1.1 需要的工具 需 ...
- 蓝牙开发那些事儿(10)——初识BLE
其实LE和BR/EDR完全是两种不同的东西,物理层的channel数减少了一半,AFH调频算法有了新的改进, 应用场景也不同,LE主要是应用于物联网,所以从设计上来讲,有以下考虑: 功耗低,数据量少, ...
- 安卓基于BLE的蓝牙开发入门
BLE蓝牙开发简单入门 BLE背景介绍 引言 BLE简介 Gatt协议以及必备知识 蓝牙开发涉及的API介绍 BLE实战准备 真机调试 权限准备 写两个简单的页面 扫描设备主界面 扫描设备信息界面 实 ...
- BLE:CC2540学习笔记
文章转载参考:http://blog.sina.com.cn/s/articlelist_5617273496_0_1.html BLE:CC2540与CC2541相关寄存器一览 一.关于普通IO操作 ...
- 通用BLE射频芯片实现无线功能
对于通用mcu芯片制造商来说,最大的挑战是保持差异化.高质量.解决方案能力和完善匹配的开发软件.差异化意味着mcu芯片的定义需要与市场需求趋同.mcu产品差异化是指在物联网零碎化的情况下,采用传统的s ...
- android 智能设备管理,基于Android平台上BLE的智能家居控制系统设计与实现
摘 要:基于智能家居无线控制的市场需求,以集成了CSR1010低功耗蓝牙芯片的智能插座为例,在Android平台上设计了一套基于蓝牙4.0通信协议的智能家居控制系统,实现了对此智能插座的无线通断电控制 ...
- 【蓝牙】一文入门Bluez的BLE基础开发 - BLE数据收发(Python)
在阅读本文章之前,请先按照 Bluez的BLE基础开发 - BLE广播完成环境的搭建和跑完例程. Bluez 源码下载以及环境搭建 下载地址 Bluez源码下载地址 bluez-5.58 其它版本请自 ...
- 为啥需要BLE+UWB Beacon?BLE+UWB经典应用:苹果AirTag等防丢标签提示我们,或许是UWB高精度定位落地的未来发展方向
一.BLE基本特性: 低功耗:在所有有源无线通讯设备中,综合通讯距离和通讯带宽,BLE是表现最佳的无线技术: 低延迟:连接速度很快,毫秒级的连接速度: 远距离:长达数百米的通信距离: 低成本:工作在2 ...
- nrf51822-主从通信分析1
建议看该教程前,先看一下 简单扫描器实现 教程 讲解基于sdk目录下central中的两个例子. 关于主机的程序框架其实和从机都是一样的,都是基于事件驱动的框架. Main函数中完成初始化, 从机 ...
最新文章
- AbutionGraph:构建以知识图谱为核心的下一代数据中台
- python的for语句条件_Python中的条件选择和循环语句
- 收藏 | 深度学习损失函数大全
- ***如何优雅的选择字体(font-family)
- python怎么用excel-python怎么连接excel
- 面试官:你了解JVM的锁优化吗?
- SpringCloud Netflix Eureka
- Go 都在什么时候触发GC,能手动触发GC吗?
- continue语句只用于循环语句中_Java之循环语句、条件判断语句(三目运算符)、break、continue...
- php预处理的fetch函数,php 预编译查询始终fetch不到数据解决方案
- agx 安装ros opencv_Linux下配置深度学习开发环境(及ros)
- 【Java每日一题】20161124
- webx框架升级springboot遇到的问题及解决方案
- python3根据图片链接下载图片
- 计算机程序设计员国家职业资格三级(高级)操作技能考核试卷-四川考场
- Holy Grail
- [08.3][转贴][美国][动作][第一滴血1][DVD-RMVB/308M][英语中字]
- 什么是BQB认证?BQB认证蓝牙模块
- 视觉设计本地化的重要性
- ui设计范畴,ui设计分为哪几类