蓝牙学习十(扫描)
一、简介
从之前的文章中我们知道,蓝牙GAP层定义了四种角色,广播者(Broadcaster)、观察者(Observer)、外围设备(Peripheral)、中央设备(Central)。

之前的学习一直都是 外围设备(Peripheral)。这篇文章,介绍下中央设备(Central)。
外围设备主要是通过广播向外发送数据,而中央设备如何发现外围设备,就需要通过扫描了。
扫描是一个在一定范围内用来寻址其他低功耗蓝牙设备广播的过程。扫描者设备在扫描过程中会使用广播信道。与广播过程不同的是,扫描过程中没有严格的时间定义和信道规则。
扫描分为主动扫描和被动扫描。
不管是主动还是被动扫描,扫描的基本流程为:设置扫描参数 -> 使能扫描 -> Controller上报扫描结果 -> 停止扫描。
二、主动扫描
主动扫描不单单可以捕获到对端设备的广播数据包,还可以捕获扫描响应数据包。
设备不断发送广播信号给主机(Observer),如果主机不开启扫描窗口,是收不到设备的广播的。主机不仅要开启射频接收窗口,而且还要主机的射频接收窗口跟广播发送的发射窗口匹配成功,主机才能收到设备的广播信号。由于这种匹配成功是一个概率事件,所以主机扫描到设备也是一个概率事件。也就是说,主机有时会很快扫描到设备,比如只需要一个广播事件。主机有时也会很慢才能扫到设备,比如需要10个广播事件甚至更多。
下图为主机主动扫描广播的过程:

控制器收到扫描数据包后,将向应用层发送一个广播报告事件(adv_report),该事件同样包括了链路层数据包的广播类型。因此,主机能够判断对端设备是否可以连接或扫描。并区分出广播数据包和扫描响应数据包。
扫描是集中器监听广播数据包和发送扫描请求的过程,它有2个定时参数需要特别注意:扫描窗口和扫描间隔。
对于每一个扫描间隔,集中器扫描的时间等于一个扫描窗口,这就意味着如果扫描窗口等于扫描间隔,那么集中器将处于连续扫描之中。
如果集中器想建立一个连接。当扫描监听到广播数据包后,将会发送连接请求。
主动扫描流程图大致如下:
2.1 、扫描参数
Host 设置BLE扫描所必须得参数到Controller。这样Controller才知晓扫描上报哪类低功耗设备信息。

LE_Scan_Type:扫描类型,主动扫描还是被动扫描。
LE_Scan_Interval:扫描间隔,控制器多久扫描一次。也就是两个连续扫描的间隔。
LE_Scan_Window:扫描窗口。每次扫描所持续的时间,在持续时间内,扫描设备一直在刚播信道上监听。
注:扫描窗口和扫描间隔这两个参数非常重要。扫描窗口的设置要小于或等于扫描间隔,并且都是0.625ms的整数倍。这两个参数决定了控制器的扫描占空比。如果把两者的时间间隔设置为相同的大小,那么控制器会进行连续扫描。每个间隔会改变扫描频率,也就是切换扫描信道。
Own_Address_Type:本端设备的扫描请求数据包中使用的地址类型。
Scanning_Filter_Policy:BLE扫描的过滤策略,也就是说接受任何广播数据或者仅仅接受报名单设备的广播数据包。实际上就是决定是否使用白名单过滤广播数据包。需要注意的是,如果定向广播数据包中的目的地址并非自己,那么该数据必须被抛弃。即使广播数据包的发送者在自己的报名单内也不例外。官方对筛选定义了如下四种情况
- #define BLE_GAP_SCAN_FP_ACCEPT_ALL 0x00:接收所有的广播包,除去广播地址不是指向该设备的定向广播
- #define BLE_GAP_SCAN_FP_WHITELIST 0x01:接收在白名单里的所有广播,除去广播地址不是指向该设备的定向广播。
- #define BLE_GAP_SCAN_FP_ALL_NOT_RESOLVED_DIRECTED 0x02:接收所有的广播包,包含定向广播包。如果广播MAC地址是私密地址,这里无法被解析。
- #define BLE_GAP_SCAN_FP_WHITELIST_NOT_RESOLVED_DIRECTED 0x03:接收白名单里所有的广播包,包含定向广播包。如果广播MAC地址是私密地址,这里无法被解析。
2.2、使能/停止扫描
Host启动和停止广播,启动扫描后,控制端发现周围环境中的广播设备。

- LE_Scan_Enable:使能还是停止扫描。
- Filter_Duplicates:是否开启广播重复过滤。开启后可避免主机在BLE扫描期间接收到重复的低功耗设备信息,该值只有在扫描使能才会生效。
2.3、上报扫描结果
BLE扫描过程中一个或多个低功耗蓝牙设备对主动扫描作出响应,或者在被动扫描期间收到了广播。控制器一次将扫描到的信息上报给应用层。

三、被动扫描
在被动扫描中,扫描者仅仅去监听广播包,而不向广播者发送任何数据。
一旦扫描参数设置完成,主机就可以启动扫描。扫描过程中,如果控制器接收到符合过滤策略和其他规则的广播数据包,则发送一个LE Advertising Report事件给主机。除了广播者的设备地址外,报告事件还包括广播数据包中的数据,以及接受广播数据包时的信号接受强度(RSSI)。可以利用该信号强度以及位于广播数据包中的发送功率,共同确定信号的路径损失,从而给出大致的范围。这个应用就是防丢器和蓝牙定位。被动扫描不需要向从机发送任何数据。
下图是被动扫描的过程:

相关文章:
蓝牙学习十(扫描)
一、简介 从之前的文章中我们知道,蓝牙GAP层定义了四种角色,广播者(Broadcaster)、观察者(Observer)、外围设备(Peripheral)、中央设备(Central)。 之前的学习…...
(26)4.7 字符函数和字符串函数
#include<stdio.h> #include<string.h> #include<assert.h> //int my_strcmp(const char* str1, const char* str2) //{ // assert(str1 && str2);//指针有效性,不能为空指针 // while (*str1 *str2) // { // if (*str1…...
交换机与队列的简介
1.流程 首先先介绍一个简单的一个消息推送到接收的流程,提供一个简单的图 黄色的圈圈就是我们的消息推送服务,将消息推送到 中间方框里面也就是 rabbitMq的服务器,然后经过服务器里面的交换机、队列等各种关系(后面会详细讲&…...
1.docker
Docker 是一种容器化平台,可以在不同的操作系统中轻松运行和管理应用程序。它使用容器技术来打包应用程序及其所有依赖关系,使其可以在任何环境中运行。 Docker 的基本概念包括以下几个部分: 镜像(Image):…...
ThinkPHP审计(2) Thinkphp反序列化链5.1.X原理分析从0编写POC
ThinkPHP审计(2) Thinkphp反序列化链子5.1.X原理分析&从0编写POC 文章目录 ThinkPHP审计(2) Thinkphp反序列化链子5.1.X原理分析&从0编写POC动态调试环境配置Thinkphp反序列化链5.1.X原理分析一.实现任意文件删除二.实现任意命令执行真正的难点 Thinkphp反序列化链5.1.…...
KingbsaeES数据库分区表的详细用法
数据库版本:KingbaseES V008R006C008B0014 简介 分区表是一种将大型数据库表拆分为更小、更可管理的部分的技术。它通过将表数据分散存储到多个物理存储单元中,可以提高查询和数据维护的性能,并优化对大型数据集的处理。本篇文章以kingbase为…...
MySQL 索引底层探索:为什么是B+树?
MySQL 索引底层探索:为什么是B树? 1. 由一个例子总结索引的特点2. 基于哈希表实现的哈希索引3. 高效的查找方式:二分查找4. 基于二分查找思想的二叉查找树5. 升级版的BST树:AVL 树6. 更加符合磁盘特征的B树7. 不断优化的B树&#…...
XML HTTP传输 小结
what’s XML XML 指可扩展标记语言(eXtensible Markup Language)。 XML 被设计用来传输和存储数据,不用于表现和展示数据,HTML 则用来表现数据。 XML 是独立于软件和硬件的信息传输工具。 应该掌握的基础知识 HTMLJavaScript…...
相机标定——四个坐标系介绍
世界坐标系(Xw,Yw,Zw) 世界坐标系是一个用于描述和定位三维空间中物体位置的坐标系,通常反映真实世界下物体的位置和方向。它是一个惯性坐标系,被用作整个场景或系统的参考框架。在很多情况下,世界坐标系被认为是固定不变的,即它…...
C++:MySQL数据库的增删改(三)
1、相关API 执行所有的sql语句都是mysql_query或者mysql_real_query mysql_query无法处理带有特殊字符的sql语句(如:反斜杠0)mysql_real_query则可以避免,一般使用这个。 mysql_affected_rows:获取sql语句执行结果影响…...
golang - 简单实现linux上的which命令
本文提供了在环境变量$PATH设置的目录里查找符合条件的文件的方法。 实现函数 import ("fmt""os""path""strings" )// 实现 unix whtich 命令功能 func Which(cmd string) (filepath string, err error) {// 获得当前PATH环境变量en…...
推荐一个好用的数据库映射架构
SqlSugar ORM 优点: SqlSugar 是 .NET 开源 ORM 框架,由 Fructose 大数据技术团队维护和更新,是开箱即用最易用的 ORM 优点: 【低代码】【高性能】【超简单】【功能综合】【多数据库兼容】【适用产品】 支持 .NET .NET framework.net core3.1.ne5.net6.net7.net8 .net…...
(013)window的Idea运行程序 Amazon java.nio.file.AccessDeniedException
解决方法一 在资源管理器中删除该目录, 在程序中使用代码,重新建立该目录: if (!FileUtil.exist(destinationPath)){FileUtil.mkdir(destinationPath); }解决方法二 JDK 的版本有问题,换个JDK。 解决方法三 网络不好…...
LeetCode 1684. 统计一致字符串的数目
解题思路 首先用set把allowed中的字符保存,然后一一判断。 相关代码 class Solution {public int countConsistentStrings(String allowed, String[] words) {Set<Character> set new HashSet<>();int reswords.length;for(int i0;i<allowed.len…...
uniapp-设置UrlSchemes从外部浏览器H5打开app
需求:外部浏览器H5页面,跳转到uniapp开发的原生app内部。 1、uniapp内部的配置: (1)打开manifest->App常用其他设置,如下,按照提示输入您要设置的urlSchemes: (2&am…...
校园圈子小程序,大学校园圈子,三段交付,源码交付,支持二开
介绍 在当今的数字化时代,校园社交媒体和在线论坛成为了学生交流思想、讨论问题以及分享信息的常用平台。特别是微信小程序,因其便捷性、用户基数庞大等特点,已逐渐成为构建校园社区不可或缺的一部分。以下是基于现有资料的校园小程序帖子发…...
基于kmeans的聚类微博舆情分析系统
第一章绪论 1.1研究背景 如今在我们的生活与生产的每个角落都可以见到数据与信息的身影。自从上十世纪八十年代的中后期开始,我们使用的互联网技术已经开始快速发展,近些年来云计算、大数据和物联网等与互联网有相领域的发展让互联网技术达到了史无前例…...
【Docker常用命令(四)】
目录 Docker常用命令(四)注意 Docker常用命令(四) docker pause docker pause 命令用于暂停容器中的所有进程。docker pause CONTAINER [CONTAINER...]常用子命令和选项:无特定常用选项。docker port docker port 命令…...
黑豹程序员-Spring Task实现定时任务
定时任务 项目中,我们有一个特殊的要求,无需人为去触发,而是自动去触发程序。通常有一定的频率,每天,某时等。 实现的四种方式 1、java自身提供定时任务java.util.Timer类,但太过简单,几乎无…...
云原生安全当前的挑战与解决办法
云原生安全作为一种新兴的安全理念,不仅解决云计算普及带来的安全问题,更强调以原生的思维构建云上安全建设、部署与应用,推动安全与云计算深度融合。所以现在云原生安全在云安全领域越来受到重视,云安全厂商在这块的投入也是越来…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...
苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会
在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...
Axure 下拉框联动
实现选省、选完省之后选对应省份下的市区...
DiscuzX3.5发帖json api
参考文章:PHP实现独立Discuz站外发帖(直连操作数据库)_discuz 发帖api-CSDN博客 简单改造了一下,适配我自己的需求 有一个站点存在多个采集站,我想通过主站拿标题,采集站拿内容 使用到的sql如下 CREATE TABLE pre_forum_post_…...
何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡
何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡 背景 我们以建设星云智控官网来做AI编程实践,很多人以为AI已经强大到不需要程序员了,其实不是,AI更加需要程序员,普通人…...
[拓扑优化] 1.概述
常见的拓扑优化方法有:均匀化法、变密度法、渐进结构优化法、水平集法、移动可变形组件法等。 常见的数值计算方法有:有限元法、有限差分法、边界元法、离散元法、无网格法、扩展有限元法、等几何分析等。 将上述数值计算方法与拓扑优化方法结合&#…...
