当前位置: 首页 > 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;云安全厂商在这块的投入也是越来…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

Linux简单的操作

ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统&#xff0c;可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析&#xff1a;自动解析Markdown文档结构PPT模板分析&#xff1a;分析PPT模板的布局和风格智能布局决策&#xff1a;匹配内容与合适的PPT布局自动…...

Windows安装Miniconda

一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)

引言 在人工智能飞速发展的今天&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;已成为技术领域的焦点。从智能写作到代码生成&#xff0c;LLM 的应用场景不断扩展&#xff0c;深刻改变了我们的工作和生活方式。然而&#xff0c;理解这些模型的内部…...

MySQL的pymysql操作

本章是MySQL的最后一章&#xff0c;MySQL到此完结&#xff0c;下一站Hadoop&#xff01;&#xff01;&#xff01; 这章很简单&#xff0c;完整代码在最后&#xff0c;详细讲解之前python课程里面也有&#xff0c;感兴趣的可以往前找一下 一、查询操作 我们需要打开pycharm …...