蓝牙BLE广播

news2024/11/14 3:30:53

这里只讨论蓝牙BLE广播

这部分可以看蓝牙标准Core Specification V5.3的卷3 Host part C。当然广播参数那一块和“控制器”层有关,只需要了解广播参数的含义和设置方法就行,控制器的细节不太容易理解。

主要目标

  • 广播参数(广播间隔、TX 功率、信道和使用的 PHY)。
  • 广播类型(可连接与不可连接、可扫描与不可扫描等)。
  • 蓝牙 LE 地址类型(公共、随机、静态、可解析等)。
  • 在蓝牙 LE 广播和 UUID 中包含数据。

广播的作用

LE设备周期性的宣布自己存在,以让别人能连接自己。这里的周期性就是“广播间隔”

发起广播端的参数

广播间隔:发送广播包的间隔。范围为20ms至10.24s,步长为0.625ms。

广播间隔越小,广播数据包发送的频率就越高,因此功耗也就越大。因此,这里需要权衡功耗与扫描仪接收广播商的广播数据包的速度(通常称为可发现性)。为了避免数据包冲突,每个广播数据包之前都会添加 0-10 毫秒的随机延迟。这可确保具有相同广播间隔的设备不会一直发生广播数据包冲突。

广播信道:无线通信都会有通信的无线信道。蓝牙 LE 设备通过 40 个不同的频道进行通信。这些频道分为三个主要广播频道和 37 个次要广播频道。

在这里插入图片描述

接收广播端的参数

和广播间隔类似,在接收端(如手机)也会有一个时间叫“扫描间隔”和“扫描窗口”。

扫描间隔:设备扫描广播数据包的间隔。
扫描窗口:设备在每个扫描间隔内扫描数据包所用的时间。
两者范围均为 2.5 毫秒至 10.24 秒,步长为 0.625 毫秒。

在这里插入图片描述
从上图可以看出,广播会在37,38,39三个广播信道上传输,因此接受也会依次在3个信道上不停地切换,并接收广播。

上图中,绿色表示37信道,浅蓝色表示38信道,深蓝色表示39信道。

广播的请求

如果想了解设备的更多信息(如更多的服务UUID、扩展的设备名称、制造商数据等),那么就需要进行广播数据请求。正式的术语叫“扫描请求”和“扫描响应”

具体流程:

  1. 外围设备(如手表),发出广播数据包,让中央设备(如手机)能扫描到广播包。
  2. 中央设备发送“扫描请求”。
  3. 外围设备回应“扫描响应”。这里就可以附加更多的信息返回给设备。
扫描请求:中央设备向外围设备发送的消息,用于请求广播包中不存在的附加信息。
扫描响应:作为对扫描请求的响应而发送的消息,包含附加用户数据。

在这里插入图片描述这个过程的作用

  1. 从上面可以看到,扫描请求和响应,可以作为未连接前,两个设备之间单向通信的一种方式。
  2. 因为广播包的长度有限,不能放入太多数据,可以用扫描响应来给出更多的设备信息。

广播的类型

外围设备可以通过多种不同的方式进行广播。

作用
有时候需要告诉别人,我这个设备,是不让别人连接的(如Becan设备),中央设备看到类型后,就不会去发起广播请求了。

广播类型的广播包的Header里面。
在这里插入图片描述

广播包类型
1. 可扫描和可连接 ( ADV_IND):这是最常见的广告类型。允许别人扫描请求。并且有响应,然后建立连接。
2. 定向可连接(ADV_DIRECT_IND):不接受扫描请求,但是特定中央设备可以快速连接的的广播。一个很好的例子是蓝牙鼠标与 PC 失去连接并且只想重新连接。在这种情况下,无需接受扫描请求,发送定向广播包以缩短连接过程会更快。
3. 不可连接且可扫描(ADV_SCAN_IND):可以有扫描请求,但是不允许建立连接。
4. 不可连接且不可扫描 ( ADV_NONCONN_IND):不能请求,也不能连接

连接、扫描、定向的含义
可连接与不可连接:确定中央设备是否可以连接到外围设备。
可扫描与不可扫描:确定外围设备是否接受来自中央设备的扫描请求。
定向与非定向:确定广播数据包是否针对特定中央设备。

在这里插入图片描述

蓝牙地址

和以太网,wifi的MAC地址的概念类似。蓝牙也有自己的“MAC”地址,就叫“蓝牙地址”

  • 每个蓝牙 LE 设备都由一个唯一的 48 位地址标识。
  • 蓝牙地址分为公共地址和随机地址。根据随机地址是否变化,随机地址又可分为静态地址或私有地址。此外,私有地址可以是可解析的,也可以是不可解析的。

下边对不同地址地址类型,详细展开:

公共地址

需要在 IEEE 注册机构注册,并且对于该设备而言是全球唯一的,并且无法删除。获取此类地址需要付费。并不是每个设备都会有这个地址,需要看厂家是否有为设备购买公共地址。

地址结构:
高24位:公司标识符(Organizationally Unique Identifier, OUI),由IEEE分配给设备制造商。
低24位:由设备制造商分配,唯一标识每个设备。

随机地址

随机地址更为常用,因为它不需要向 IEEE 注册,并且可以由用户手动配置。它既可以在设备内编程,也可以在运行时创建。随机地址又可以进一步细分为:随机静态地址(Random static address)或随机私有地址(Random private address)。

备注:随机私有地址根据可否解析,可分为“可解析私有地址”和“不可解析私有地址”。

因此随机地址一共有3种:静态随机地址,可解析的随机私有地址

静态随机地址
在设备的整个生命周期内固定不变。它可以在启动时更改,但不能在运行时更改。

地址结构:
高2位固定为11,表示这是一个静态随机地址。
剩余46位由设备在启动时随机生成,并在设备重启之前保持不变。
格式示例:11XXXXXX:YYYYYYYY:YYYYYYYY:YYYYYYYY

可解析的随机私有地址
因为目标侦听器拥有一个预共享密钥,每次地址发生变化时,他们都可以使用该密钥找出新地址。预共享密钥是身份解析密钥 (IRK),用于生成和解析随机地址。

地址结构:
高2位固定为01,表示这是一个可解析的私有地址。
剩余46位由设备通过一个密钥生成,中心设备可以通过身份解析键(Identity Resolving Key, IRK)解析出设备身份。
格式示例:01XXXXXX:YYYYYYYY:YYYYYYYY:YYYYYYYY

不可解析的随机私有地址
不可解析的私有地址无法被其他设备解析,仅用于防止跟踪。这种地址不常用。

地址结构:
高2位固定为00,表示这是一个不可解析的私有地址。
剩余46位随机生成,不能被解析出设备的身份。
格式示例:00XXXXXX:YYYYYYYY:YYYYYYYY:YYYYYYYY

总之,记住蓝牙地址一共有4种类型:公共地址:、随机静态地址、可解析随机私有地址、不可解析的随机私有地址。

广播包的帧格式

在这里插入图片描述如上是广播包的格式,其中preamble,access address,CRC都是协议栈自动计算和填充的。下面继续看看Advertisement PDU里面有啥。

Advertisement PDU

在这里插入图片描述

Header头部,

在这里插入图片描述在这里插入图片描述
PDU type:广播类型
RFU:保留
ChSel:通信channel的算法。就是通信时是怎么在通道之间跳转的。
TxAdd(Tx 地址):0 或 1,取决于发射器地址是公共的还是随机的。
RxAdd(Rx 地址):0 或 1,取决于接收地址是公开的还是随机的。
长度:有效载荷的长度。从这里可以看出广播包的有效载荷最大长度为256字节。

Payload

在这里插入图片描述AdvA:广播设备的蓝牙地址
AdvData:广播数据

AdvData:广播数据
广播数据的内容,根据广播的类型决定。上文有讲广播的类型有4种。其中有定向广播(ADV_DIRECT_IND)比较特别。后面单独拿出来。剩余3种数据结构都一样。如下

在这里插入图片描述广播数据里面可以分成很多段:AD0,AD1…ADn。每一段都有固定的格式,如上图浅蓝色部分。

为什么要分段?为了节省数据包的空间,一个段就代表一个有效数据。
如下示例
在这里插入图片描述
如果想在广播包里展示如上的信息。我们通常会这么写

  • Complete list of 16-bit Service UUlDs:0x180D.0x180F,0x180A
  • Complete Local Name: Zephyr HeartrateSensor

如上简单直观,但是会发现标题行已经占据了很大的篇幅,要知道蓝牙的广播包能存放的有效数据长度就几十个字节。为了解决这个问题。蓝牙标准预先定义好了广播数据类型(在Generic Access Profile.pdf定义)。并用数字表示,比如Complete Local Name:用数字0x09表示,Complete list of 16-bit Service UUlDs用数字0x03代替。这样,只需要2个字节,就可以表示需要三四十个字节的标题。

下图似乎蓝牙广播是,实际传输的广播包原始数据Raw data。Details是具体解析出来的分段数据。
在这里插入图片描述

zephyr的广播数据类型(AD Type),定义在这个头文件里面。
https://docs.nordicsemi.com/bundle/ncs-latest/page/zephyr/connectivity/bluetooth/api/gap.html#c.BT_DATA_FLAGS

综上所述:
要看到广播数据包的内容,需要做如下动作

  1. 先提取出整个ADV data
  2. 根据AD length,分离出第一个AD0,同样的剥离出AD1,ADn
  3. 根据AD type得知后面数据是什么数据。

蓝牙BLE的实例程序

这部分另外开文章展开。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1927350.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL学习记录 —— 이십일 MySQL服务器配置与管理(1)

文章目录 1、配置和默认值2、系统变量和选项1、介绍2、常用选项3、使用系统变量 3、常用服务器配置4、查看状态变量5、MySQL数据目录 mysql的服务端就是mysqld,d就是daemon,守护进程的意思。 配置文件中[mysqld]部分时服务器支持的启动选项。服务器的部…

flv文件转换成mp4?这四种转换方法肯定可以帮到你!

flv文件转换成mp4?FLV格式曾一度以其独特的地位,为视频传输领域注入了新的活力,然而,随着时间的流逝和技术的进步,这种格式也出现了很多问题,其最大的困扰在于兼容性的局限,尽管在某些特定场合下…

客户管理必备:快速学会群发微信信息新技能!

当我们用微信向客户传递祝福、福利等重要信息时,随着微信好友人数不断增加,在微信里挑选好友发送信息,既费时又费力,还容易因个人疏忽导致重要客户遗漏。 为了有效地解决上述问题,企业可以借助微信管理系统中群发管理功…

卸载wps office的几种方法收录

​ 第一种方法: 1.打开【任务管理器】,找到相关程序,点击【结束任务】。任务管理器可以通过左下角搜索找到。 2.点击【开始】-【设置】-【应用】-下拉找到WPS应用,右键卸载,不保留软件配置 …

不会用电子商务知识库?五项基本方法让你业务增长100%

电子商务公司正努力增加利润并减少支出。该行业正在不断发展,预计到 2040 年,95% 的所有购买行为都将通过电子商务进行。话虽如此,竞争依然激烈——95% 的客户表示,客户服务是决定是否与公司开展业务的关键因素。在购买过程中更快…

tomcat搭建

目录 1 Tomcat简介 2 Tomcat安装 2.1 安装JDK 2.2 安装Tomcat 3 Tomcat目录结构 3.1 tomcat主目录介绍 3.2 Tomcat配置文件目录介绍 3.3 Tomcat web管理功能 1 Tomcat简介 Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta 项目中的一个…

1985年-2020年中国历年私人汽车保有量统计报告

数据来源于国家统计局,为1985年到2020年中国每年私人汽车拥有量(包括客车、货车和其他汽车)。2020年,中国私人汽车拥有量为2.43亿辆。 数据统计单位为:万辆 数据说明: 私人汽车包括私人载客汽车和私人载…

如何预防最新的baxia变种勒索病毒感染您的计算机?

引言 在当今数字化时代,网络安全威胁层出不穷,其中勒索病毒已成为企业和个人面临的重大挑战之一。近期,.baxia勒索病毒以其高隐蔽性和破坏性引起了广泛关注。本文将详细介绍.baxia勒索病毒的特点、传播方式,并给出相应的应对策略…

超时导致SparkContext构造失败的问题探究

文章目录 1.前言2. 基于事故现场对问题进行分析2.1 日志分析2.2 单独测试Topology代码试图重现问题 3. 源码解析3.1 Client模式和Cluster模式下客户端的提交和启动过程客户端提交时在两种模式下的处理逻辑ApplicationMaster启动时在两种模式下的处理逻辑 3.2 两种模式下的下层角…

谷粒商城P85发布商品时规格参数不显示问题

P85讲,发布商品,点击下一步之后,发现规格参数不显示 打开控制台发现报错forEach...错误 查了问题原因,发现返回的分组中个别组的关联属性(attrs)可能为null 所以这个时候,需要确保后端返回的attrs不能为null 方式1…

【可视化大屏系列】Echarts之饼图绘制

本文为个人近期学习总结,若有错误之处,欢迎指出! Echarts之饼图绘制 前言1.需求2.实现效果3.大概思路4.代码实现子组件写法父组件写法5.附加(1)圆环饼图的绘制(2)南丁格尔玫瑰饼图A.半径展示数据的大小B.面积展示数据的大小前言 在前文页面布局、DataV 的使用、Echarts…

低代码:企业数字化转型的核心工具

在全球数字化浪潮风起云涌的当下,企业面临着前所未有的市场挑战与内部需求变化,急需以更快速、更灵活的方式响应。在这一关键时期,JNPF快速开发平台以其卓越的性能和广泛的功能覆盖,逐渐成为企业数字化转型的核心工具。 JNPF深度…

使用Godot4组件制作竖版太空射击游戏_2D卷轴飞机射击-最高分和数据记录(十一)

文章目录 得分界面修改数据显示数据记录资源 使用Godot4组件制作竖版太空射击游戏_2D卷轴飞机射击(一) 使用Godot4组件制作竖版太空射击游戏_2D卷轴飞机射击-激光组件(二) 使用Godot4组件制作竖版太空射击游戏_2D卷轴飞机射击-飞船…

贪心算法案例

1.买卖股票的最佳时机 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔…

机器学习开源分子生成系列(2)-基于三维形状和静电相似性的DeepFMPO v3D安装及使用

前言 本文是基于 3D 的分子生成方法DeepFMPO v3D的介绍及安装使用。 一、DeepFMPO v3D是什么? github代码介绍文章 在药物发现中,如何寻找具新颖性和结构多样性的候选分子是颇受药物设计科学家关注的问题。通过虚拟筛选的化学空间搜索往往会受限于筛选…

嵌入式linux相机 框图

摄像头读取数据显示到LCD流程 重点:摄像头数据(yuyv,mjpeg,rgb)(640,320)与LCD显示数据(RGB)(480,240)不同;需要转换&…

JVM:运行时数据区

文章目录 一、总览二、程序计数器1、介绍2、程序计数器在运行中会出现内存溢出吗? 三、栈1、介绍2、栈帧的组成部分(1)局部变量表(2)操作数栈(3)帧数据(3)栈内存溢出&…

js中使用原型链增加方法后,遍历对象的key-value时会遍历出方法

原因:js使用原型链实现方法时,这个方法默认是可迭代的,所以在遍历时就会被遍历出来, 例: Array.prototype.remove function(n){return this.slice(0,n).concat(this.slice(n1,this.length));}var cc ["cccaaaa…

【算法】Splay详解

Splay 引入 Splay旋转操作splay操作插入操作查询x排名查询排名为x删除操作查询前驱/后继模板Splay时间复杂度分析 进阶操作截取区间区间加,区间赋值,区间查询,区间最值区间翻转原序列整体插入指定位置插入整体插入末尾区间最大子段和 一些好题…

【windows|014】TCP协议详解

🍁博主简介: 🏅云计算领域优质创作者 🏅2022年CSDN新星计划python赛道第一名 🏅2022年CSDN原力计划优质作者 ​ 🏅阿里云ACE认证高级工程师 ​ 🏅阿里云开发者社区专家博主 💊交流社…