当前位置: 首页 > news >正文

蓝牙学习十(扫描)

一、简介

        从之前的文章中我们知道,蓝牙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);//指针有效性&#xff0c;不能为空指针 // while (*str1 *str2) // { // if (*str1…...

交换机与队列的简介

1.流程 首先先介绍一个简单的一个消息推送到接收的流程&#xff0c;提供一个简单的图 黄色的圈圈就是我们的消息推送服务&#xff0c;将消息推送到 中间方框里面也就是 rabbitMq的服务器&#xff0c;然后经过服务器里面的交换机、队列等各种关系&#xff08;后面会详细讲&…...

1.docker

Docker 是一种容器化平台&#xff0c;可以在不同的操作系统中轻松运行和管理应用程序。它使用容器技术来打包应用程序及其所有依赖关系&#xff0c;使其可以在任何环境中运行。 Docker 的基本概念包括以下几个部分&#xff1a; 镜像&#xff08;Image&#xff09;&#xff1a;…...

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数据库分区表的详细用法

数据库版本&#xff1a;KingbaseES V008R006C008B0014 简介 分区表是一种将大型数据库表拆分为更小、更可管理的部分的技术。它通过将表数据分散存储到多个物理存储单元中&#xff0c;可以提高查询和数据维护的性能&#xff0c;并优化对大型数据集的处理。本篇文章以kingbase为…...

MySQL 索引底层探索:为什么是B+树?

MySQL 索引底层探索&#xff1a;为什么是B树&#xff1f; 1. 由一个例子总结索引的特点2. 基于哈希表实现的哈希索引3. 高效的查找方式&#xff1a;二分查找4. 基于二分查找思想的二叉查找树5. 升级版的BST树&#xff1a;AVL 树6. 更加符合磁盘特征的B树7. 不断优化的B树&#…...

XML HTTP传输 小结

what’s XML XML 指可扩展标记语言&#xff08;eXtensible Markup Language&#xff09;。 XML 被设计用来传输和存储数据&#xff0c;不用于表现和展示数据&#xff0c;HTML 则用来表现数据。 XML 是独立于软件和硬件的信息传输工具。 应该掌握的基础知识 HTMLJavaScript…...

相机标定——四个坐标系介绍

世界坐标系(Xw,Yw,Zw) 世界坐标系是一个用于描述和定位三维空间中物体位置的坐标系&#xff0c;通常反映真实世界下物体的位置和方向。它是一个惯性坐标系&#xff0c;被用作整个场景或系统的参考框架。在很多情况下&#xff0c;世界坐标系被认为是固定不变的&#xff0c;即它…...

C++:MySQL数据库的增删改(三)

1、相关API 执行所有的sql语句都是mysql_query或者mysql_real_query mysql_query无法处理带有特殊字符的sql语句&#xff08;如&#xff1a;反斜杠0&#xff09;mysql_real_query则可以避免&#xff0c;一般使用这个。 mysql_affected_rows&#xff1a;获取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

解决方法一 在资源管理器中删除该目录&#xff0c; 在程序中使用代码&#xff0c;重新建立该目录&#xff1a; if (!FileUtil.exist(destinationPath)){FileUtil.mkdir(destinationPath); }解决方法二 JDK 的版本有问题&#xff0c;换个JDK。 解决方法三 网络不好&#xf…...

LeetCode 1684. 统计一致字符串的数目

解题思路 首先用set把allowed中的字符保存&#xff0c;然后一一判断。 相关代码 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

需求&#xff1a;外部浏览器H5页面&#xff0c;跳转到uniapp开发的原生app内部。 1、uniapp内部的配置&#xff1a; &#xff08;1&#xff09;打开manifest->App常用其他设置&#xff0c;如下&#xff0c;按照提示输入您要设置的urlSchemes&#xff1a; &#xff08;2&am…...

校园圈子小程序,大学校园圈子,三段交付,源码交付,支持二开

介绍 在当今的数字化时代&#xff0c;校园社交媒体和在线论坛成为了学生交流思想、讨论问题以及分享信息的常用平台。特别是微信小程序&#xff0c;因其便捷性、用户基数庞大等特点&#xff0c;已逐渐成为构建校园社区不可或缺的一部分。以下是基于现有资料的校园小程序帖子发…...

基于kmeans的聚类微博舆情分析系统

第一章绪论 1.1研究背景 如今在我们的生活与生产的每个角落都可以见到数据与信息的身影。自从上十世纪八十年代的中后期开始&#xff0c;我们使用的互联网技术已经开始快速发展&#xff0c;近些年来云计算、大数据和物联网等与互联网有相领域的发展让互联网技术达到了史无前例…...

【Docker常用命令(四)】

目录 Docker常用命令&#xff08;四&#xff09;注意 Docker常用命令&#xff08;四&#xff09; docker pause docker pause 命令用于暂停容器中的所有进程。docker pause CONTAINER [CONTAINER...]常用子命令和选项&#xff1a;无特定常用选项。docker port docker port 命令…...

黑豹程序员-Spring Task实现定时任务

定时任务 项目中&#xff0c;我们有一个特殊的要求&#xff0c;无需人为去触发&#xff0c;而是自动去触发程序。通常有一定的频率&#xff0c;每天&#xff0c;某时等。 实现的四种方式 1、java自身提供定时任务java.util.Timer类&#xff0c;但太过简单&#xff0c;几乎无…...

云原生安全当前的挑战与解决办法

云原生安全作为一种新兴的安全理念&#xff0c;不仅解决云计算普及带来的安全问题&#xff0c;更强调以原生的思维构建云上安全建设、部署与应用&#xff0c;推动安全与云计算深度融合。所以现在云原生安全在云安全领域越来受到重视&#xff0c;云安全厂商在这块的投入也是越来…...

Qt——Qt实现数据可视化之QChart的使用总结(使用QChart画出动态显示的实时曲线)

【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! 《项目案例分享》 《极客DIY开源分享》 《嵌入式通用开发实战》 《C++语言开发基础总结》 《从0到1学习嵌入式Linux开发》...

(React生命周期)前端八股文修炼Day8

一 React的生命周期有哪些 React组件的生命周期可以分为三个主要阶段&#xff1a;挂载&#xff08;Mounting&#xff09;、更新&#xff08;Updating&#xff09;和卸载&#xff08;Unmounting&#xff09;。React类组件的生命周期方法允许你在组件的不同阶段执行代码。 挂载…...

考研||考公||就业||其他?-------愿不再犹豫

大三下了&#xff0c;现在已经开学一个多月了&#xff0c;在上个学期的时候陆陆续续吧周围有的行动早的人已经开始准备考研了&#xff0c;当然这只是下小部分人吧&#xff0c;也有一部分人是寒假可能就开始了&#xff0c;更多的则是开学的时候&#xff0c;我的直观感受是图书馆…...

使用 Selenium 和 OpenCV 识别验证码(使用 Java)

验证码的自动识别对于爬虫来说是一个常见的挑战。在这篇文章中&#xff0c;我们将展示如何使用 Selenium 和 OpenCV&#xff0c;结合 Java&#xff0c;来自动化识别网站上的验证码。 配置 Maven 依赖 首先&#xff0c;我们需要在 Maven 项目中添加 Selenium 和 OpenCV 的依赖。…...

什么是数据库?如何安装SQL Server(超详细版)

文章目录 什么是数据库数据库与数据库管理系统数据库系统之间的区别和联系数据库在生活中的应用 安装SQL Server数据库系统要求 安装步骤(超详细)安装前的准备 安装SSMS 什么是数据库 数据库&#xff0c;顾名思义&#xff0c;是存储数据的“仓库”。它不仅仅是简单的数据存储&…...

Golang 开发实战day08 - Multiple Return values

Golang 教程08 - Multiple Return values 1. Multiple return values 1.1 如何理解多个返回值&#xff1f; Go语言中的多返回值&#xff0c;就像你听了一首歌曲yellow&#xff0c;可以从歌曲里反馈出忧郁和害羞&#xff01;Goland的多个返回值就类似于如此&#xff0c;设定一…...

如何成为一名优秀的工程师下

身为工程师&#xff0c;理所当然要重视实践&#xff0c;自然科学不管发展到何时都离不开实验。 电子学本身就是 为了指导工程实践。所以不要谈空洞的理论。现在很多毕业生都面临这样的问题&#xff0c;总是谈一些空洞的理论&#xff0c;甚至错误的但还不以为然的理论。实践可以…...

Docker【1】:Docker制作Oracle19C镜像

Docker【1】&#xff1a;Docker制作Oracle19C镜像 1、参考官方文档2、下载相关文件2.1、工具包2.2、Oracle安装包 3、制作镜像3.1、拷贝下载的oracle安装包到制作工具对应版本目录下3.2、开始制作镜像包3.3、制作完成 4、导出导入镜像4.1、镜像导出4.2、镜像导入 5、运行Oracle…...

Layui三级联动插件使用方法

Layui高版本中没有在提供三级联动这个动画了&#xff0c;而是封装成了一个插件&#xff0c;使用方式也很简单 官网 省市县区三级联动下拉选择器 layarea - Layui 第三方扩展组件平台 (layuion.com)https://dev.layuion.com/extend/layarea/#doc html页面约束 整个选择器需要…...

使用iPhone/安卓手机代替门禁卡

文章目录 基础知识ID卡和IC卡ID卡技术IC卡技术IC卡加密方式手机NFC只能模拟IC卡&#xff0c;而不支持ID卡电梯卡可能使用滚动码验证方式&#xff0c;不支持使用手机模拟 &#xff08;IC类型&#xff09;门禁卡验证方式仅验证ID&#xff08;卡号&#xff09;验证ID分区信息 iPho…...

服务器怎么运行网站/人力资源培训机构

一&#xff1a;Docker资源限制 1.系统压力测试工具 stress 是一个压力测试工具&#xff0c;功能&#xff1a;测试系统、完全高负荷和监督这些设备运行的用户。 安装&#xff1a; [rootvcc ~]# yum install stress -y测试场景举例 测试CPU负荷 [rootvcc ~]# stress –c 4 增…...

长春品牌网站建设公司/全国疫情排行榜

.dds格式的图像文件常作为存储游戏资源的各种文件格式用PhotoShop打开的时候需要一个插件下载地址:http://vilylei.purpgame.com/ext/dds.8bi下载下来后,将这个插件放在ps安装目录下的 Plug-ins\ 目录下即可使用转载于:https://www.cnblogs.com/vilyLei/articles/2081144.html...

wordpress支持手机端嘛/足球世界排名国家最新

private void draw(Point p, Canvas canvas) {if (!isFinished) {path new Path();//将向量(0&#xff0c;radius)旋转起始角度&#xff0c;第一个控制点根据这个旋转后的向量计算Point t new Point(0, this.radius).rotate(MyUtil.degrad(this.startAngle));//第一个端点&am…...

做的网站空白了/百度在线咨询

find找到非零元素的索引和值语法&#xff1a;1. ind find(X)找出矩阵X中的所有非零元素&#xff0c;并将这些元素的线性索引值(linear indices&#xff1a;按列)返回到向量ind中。如果X是一个行向量&#xff0c;则ind是一个行向量&#xff1b;否则&#xff0c;ind是一个列向量…...

优秀国外网站大全/上海培训机构整顿

如果 get_template() 找不到给定名称的模板&#xff0c;将会引发一个 TemplateDoesNotExist 异常。 假设你的 DEBUG项设置为 True&#xff0c;而你有没有建立current_datetime.html 这个模板文件&#xff0c;你会看到Django的错误提示网页&#xff0c;告诉你发生了 TemplateDoe…...

专业建设 验收 网站/千锋教育官方网

行内元素(inline element)&#xff0c;又叫内联元素&#xff0c;内联元素只能容纳文本或者其他内联元素&#xff0c;常见的行内元素<span>,<a>. 块元素(block element),块元素一般都是从新行开始&#xff0c;可以容纳文本&#xff0c;其他内联元素和其它块元素&…...