在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. 1 nrf51822简介

    本文的目的是教你如何一步步创建自己的BLE应用程序,包括使用nRF51822芯片创建一个定制的服务. 1.1 最低要求 需要有嵌入式C语言编程经验,以便完全理解本应用手册. 1.1.1 需要的工具 需 ...

  2. 蓝牙开发那些事儿(10)——初识BLE

    其实LE和BR/EDR完全是两种不同的东西,物理层的channel数减少了一半,AFH调频算法有了新的改进, 应用场景也不同,LE主要是应用于物联网,所以从设计上来讲,有以下考虑: 功耗低,数据量少, ...

  3. 安卓基于BLE的蓝牙开发入门

    BLE蓝牙开发简单入门 BLE背景介绍 引言 BLE简介 Gatt协议以及必备知识 蓝牙开发涉及的API介绍 BLE实战准备 真机调试 权限准备 写两个简单的页面 扫描设备主界面 扫描设备信息界面 实 ...

  4. BLE:CC2540学习笔记

    文章转载参考:http://blog.sina.com.cn/s/articlelist_5617273496_0_1.html BLE:CC2540与CC2541相关寄存器一览 一.关于普通IO操作 ...

  5. 通用BLE射频芯片实现无线功能

    对于通用mcu芯片制造商来说,最大的挑战是保持差异化.高质量.解决方案能力和完善匹配的开发软件.差异化意味着mcu芯片的定义需要与市场需求趋同.mcu产品差异化是指在物联网零碎化的情况下,采用传统的s ...

  6. android 智能设备管理,基于Android平台上BLE的智能家居控制系统设计与实现

    摘 要:基于智能家居无线控制的市场需求,以集成了CSR1010低功耗蓝牙芯片的智能插座为例,在Android平台上设计了一套基于蓝牙4.0通信协议的智能家居控制系统,实现了对此智能插座的无线通断电控制 ...

  7. 【蓝牙】一文入门Bluez的BLE基础开发 - BLE数据收发(Python)

    在阅读本文章之前,请先按照 Bluez的BLE基础开发 - BLE广播完成环境的搭建和跑完例程. Bluez 源码下载以及环境搭建 下载地址 Bluez源码下载地址 bluez-5.58 其它版本请自 ...

  8. 为啥需要BLE+UWB Beacon?BLE+UWB经典应用:苹果AirTag等防丢标签提示我们,或许是UWB高精度定位落地的未来发展方向

    一.BLE基本特性: 低功耗:在所有有源无线通讯设备中,综合通讯距离和通讯带宽,BLE是表现最佳的无线技术: 低延迟:连接速度很快,毫秒级的连接速度: 远距离:长达数百米的通信距离: 低成本:工作在2 ...

  9. nrf51822-主从通信分析1

    建议看该教程前,先看一下  简单扫描器实现  教程 讲解基于sdk目录下central中的两个例子. 关于主机的程序框架其实和从机都是一样的,都是基于事件驱动的框架. Main函数中完成初始化, 从机 ...

最新文章

  1. AbutionGraph:构建以知识图谱为核心的下一代数据中台
  2. python的for语句条件_Python中的条件选择和循环语句
  3. 收藏 | 深度学习损失函数大全
  4. ***如何优雅的选择字体(font-family)
  5. python怎么用excel-python怎么连接excel
  6. 面试官:你了解JVM的锁优化吗?
  7. SpringCloud Netflix Eureka
  8. Go 都在什么时候触发GC,能手动触发GC吗?
  9. continue语句只用于循环语句中_Java之循环语句、条件判断语句(三目运算符)、break、continue...
  10. php预处理的fetch函数,php 预编译查询始终fetch不到数据解决方案
  11. agx 安装ros opencv_Linux下配置深度学习开发环境(及ros)
  12. 【Java每日一题】20161124
  13. webx框架升级springboot遇到的问题及解决方案
  14. python3根据图片链接下载图片
  15. 计算机程序设计员国家职业资格三级(高级)操作技能考核试卷-四川考场
  16. Holy Grail
  17. [08.3][转贴][美国][动作][第一滴血1][DVD-RMVB/308M][英语中字]
  18. 什么是BQB认证?BQB认证蓝牙模块
  19. 视觉设计本地化的重要性
  20. ui设计范畴,ui设计分为哪几类

热门文章

  1. 亚马逊抢甲骨文的 Java 饭碗,推出 Corretto
  2. 程序员编程10大原则,请牢牢记住
  3. Fluentd初探 简介与安装
  4. Statement和PraparedStatement区别
  5. oracle字段求和_oracle大纲
  6. oracle 获取当月的1号_ORACLE认证大师(OCM)
  7. php mongo分页查询,PHP操作Mongodb之高级查询篇
  8. 数据机房气流组织的常见类型及应用
  9. 高低配系统直流控制电源技术知识点
  10. 台湾高校首创气体灭火数位实境教育馆