蓝牙BLE学习-蓝牙广播

1.概念

       什么叫做广播,顾名思义就像广场上的大喇叭一样,不停的向外传输着信号。不同的是,大喇叭传输的是音频信号,而蓝牙传输的是射频信号。

       BLE使用的是无线电波传递信息,就是将数据编码,调制到射频信号中发射。BLE使用的射频频率是2.4GHz。跟WIFI、Zigbee等协议使用的是同一频段。

       那如何做到使用同一频段而有不相互干扰呢?首先要知道的是2.4G指的不是某一个频率,而指的是一个频段(2400MHz-2483.5MHz)。在这个频段内每隔2M为一个信道,共40个信道。2.4G频段是一个用于短距离,无须执照使用的开放频段。意思就是可以免费使用。为了不占用更多的资源从而造成相互干扰,每个设备在使用时,同一时刻,只会在一个信道进行工作,不会占用其他信道。一个BLE设备,在任一时刻,只能选择40个信道之中的一个进行发射或监听。

 

       BLE将信道划分为广播信道和数据信道。广播信道只有3个,37、38、39。剩下的37个信道全都是数据信道0-36。

       在广播事件中,每一个广播事件都会在3个广播信道中进行数据传输,而且每一个事件都是从最小的信道编号开始传输。也就是说当广播事件来了,数据包从广播信道37、38、39中依次进行传输。

 

2. 广播间隔

       设备每次广播时,会在3个广播信道发送相同的报文。这些发送报文的动作被称为一个广播事件。除了定向广播外,其他广播事件均可以选择20ms-10.28s不等的间隔。通常,一个广播中的设备会每一秒广播一次。两个相邻的广播事件之间的时间被称为“广播间隔”。

       设备周期性的发送广播会有一个问题:由于设备间的时钟会不同程度的漂移,两个设备可能在很长一段时间同时广播而造成干扰。为了防止这一情况的发生,除定向广播外的其他广播类型,发送时间均会有些许波动。实现方式为,在上一次广播事件后加入“0-10ms"的随机延迟。这意味着,即使两个设备广播间隔相同,并在相同信道及时间点上发送造成了冲突,但他们发送下一个广播事件时也很大概率不会冲突。

        所以,两个相邻的广播事件之间的时间间隔T_advEvent为:

 T_AdvEvent = advInterval + advDelay

       其中,advInterval必须是0.625ms的整数倍,范围是20ms-10.24s之间。对于可扫描非定向广播和不可连接非定向广播者两种广播类型,该值最好不小于100ms,即160个0.625ms。advDelay是LL层分配的一个随机数,范围为0-10ms。

 

        在实际的设置中,通过设置Advertising_Interval_Min(最小广播间隔)和Advertising_Interval_Max(最大广播间隔)这两个参数来调整广播间隔。都是以0.625ms为单位。如果要固定广播间隔为某一个值,需要将这两个参数设置为同一个值即可。

 3. 广播类型

 3.1非定向可连接广播事件(ADV_IND)

      ADV_IND就是链路层通过广播信道发送广播的事件。发送的PDU(Protocol Data Unit-协议数据单元)是ADV_IND_PDU-通用广播报文。这个报文发送之后可以接收由扫描者发送的SCAN_REQ_PDU-扫描请求,或者由发起者发送的CONNECT_REQ_PDU-连接请求。而接收后链路层需要在同一个信道上进行扫描或回复发起者的应答。当接收的数据报文不符合广播滤波协议,要么就用下一个广播信道进行广播,要么就停止广播事件。如果接收到的SCAN_REQ_PDU通过了滤波协议,那么广播者需要在150±2us内在同一信道回复SCAN_RSP_PDU-扫描应答报文。如果接收到CONNECT_REQ_PDU,则进入连接状态,这个时候并不需要进行应答。

       需要注意的是,一个广播事件中,相邻两个ADV_IND_PDU之间的时间需要不大10ms。

       接下来分类一下此类广播事件中广播包的发送情况。

(1)仅仅有广播PDUS 

(2)在广播事件中有SCAN_REQ_PDUSSCAN_RSP_PDUS

注:当有扫描请求包在广播事件中的中间信道上收到时,T_IFS(帧间隔)为150us。

(3)在广播事件的结尾有SCAN_REQSCAN_RSP

 

(4)在广播事件的中间接收到CONNECT_REQ-连接请求包。没有应答

 

3.2 定向可连接广播事件(ADV_DIRECT_IND)

       这个广播是为了快速建立链接。这种报文包含两个地址:广播者地址和发起者地址。发起者收到发给自己的定向广播报文后,可以立刻发送连接请求事件作为回应,并立刻进入连接状态。

       定向广播事件有特殊的时序要求。完整的广播事件必须每3.75ms之内重复一次,即3.75ms内在37、38、39三个广播信道上全部发送一次报文。这样的方法使得扫描设备只需要扫描3.75ms即可收到定向广播设备的消息。

3.3 非定向不可连接事件(ADV_NONCONN_IND)

       该广播的时间要求与通用广播事件相同。此外,该事件只向外发射广播报文,但是不可以被连接,也不接收任何信息。是唯一一个只有发射而没有接收的广播类型。ibeacon发出的就是这种类型的广播。

3.4 非定向可发现不可连接事件(ADV_DISCOVER_IND/ADV_SCAN_IND)

       该广播的时间要求与通用广播事件相同,应答也是SCAN_REQ和SCAN_RSP。这个广播和通用广播的区别是,它不能建立连接。

       注:所谓的定向和非定向针对的是广播对象,如果是针对特定的对象进行广播(在广播包PDU中包含目标对象的MAC),则为定向广播。反之为非定向广播。可连接和不可连接指的是是否接受连接请求。如果是不可连接的广播类型,它将不应答连接请求报文。可扫描广播类型会回应扫描请求。

不同的广播类型对应的扫描请求和连接请求如下图:

4.广播响应包

        广播包有两种:广播包(Advertising Data)和响应包(Scan Response)。其中广播包是每个设备必须广播的,而响应包是可选的。

        广播包在蓝牙5.0协议栈核心中介绍如下:

 

      应答包介绍如下:

 

      每个包都是31字节,数据包中分为有效数据(significant)和无效数据(non-significant)

      有效数据部分:包含若干个广播数据单元,称为AD Structure。AD Structure的组成是:第一个字节是长度值Len,表示接下来的Len个字节是数据部分。数据部分的第一个自己表示数据的类型AD Type,剩下的len-1个字节是真正的数据AD Data。

      无效数据部分:因为广播包的长度必须是31个字节,如果有效数据部分不到31字节,则剩余部分用0补全。

     广播响应包是为了给广播一个额外的31字节数据,用于主机在主动扫描情况下,反馈数据使用。

5. 广播数据包分析

软件工具:wireshark

硬件抓包工具:nrf52840 dongle

使用wireshark抓到的数据包分为两个部分,一部分是软件自己添加的内容,另一部分才是广播出来的数据

5.1 软件添加部分 

 软件添加的大部分内容可以不关注。这里需要关注的内容如下:

这里主要关注信道时间戳

这里我们截取三个相邻的广播包来分析一下:

 

       上边截取了相邻的三个广播数据包。可以看到1号的信道为37,开始到结束时间为296us。2号的信道为38,开始到结束时间为296us。3号的信道为39,开始到结束时间为296us。1号到2号的间隔为1000us左右,2号到3号的间隔为1000us左右。

        可以看到,此时广播是从37信道开始,依次为37、38、39信道。当在39信道广播数据后,收到了SCAN_RSP。此时则停止广播。下次再进行广播的话,又从37信道开始。

     如果说在一次广播事件中,没有广播到39信道就收到SCAN_RSP会如何呢?就算收到了SCAN_RSP,依旧会继续广播。见下图: 

 

     从上图可以看到,1号广播是37信道,并且在37信道接收到了SCAN_RSP。而此时广播事件并没有停止,而是继续在3839信道进行广播 

6.广播数据内容 

非定向可连接广播事件(ADV_IND)

 蓝色数据部分就是真实广播的内容。这里进行拆分。总共分为6部分。

 

Access Address(目标地址):

4字节,小端。上图的值为 0x8e89bed6。所以BLE设备的广播帧都是使用这个地址。

6.1 PDU Header(PDU 包头) 

PDU Header 虽然只有2字节。但是包含了很多内容。 

PDU Header拆分如下: 

PDU type为广播类型:

  ADV_IND:非定向可连接广播,即通用广播

  ADV_DIRECT_IND:定向可连接广播,即快速广播。

  ADV_NONCONN_IND:非定向必可连接广播,即不能建立连接的广播。

  ADV_SCAN_IND:扫描帧,是由scanner(手机、平板、PC)发出的。主动扫描时使用。

  SCAN_REQ:扫描请求帧,是由scanner(手机、平板、PC)发出的。只在scanner想从advertiser获取更多的广播数据的时候才由scanner发出。

  SCAN_RSP:当advertiser收到SCAN_REQ时的回应。

  CONNECT_REQ(CONNECT_IND):scanner(手机、平板、PC)向advertiser发送的连接请求。

  本次抓的数据,使用的就是ADV_IND。

 

 6.2 PDU data payload

Advertising Address (广播设备MAC地址) 

Advertising Data (广播包数据)

 广播包数据都是以 长度+内容来表示的。比如这里我们抓的数据。

 

02 01 06为一组,11-00为一组。 

 长度为0201表示指令类型, 表示当前设备不支持经典蓝牙,是通用可发现模式。

6.3 扫描应答 

 数据结构与ADV_IND是相同, PUD type:显示为0100,即为SCAN_RSP

 

 

        与ADV_IND不同的是,SCAN_RSP中的advertising data变成了Scan Response Data。

        因为SCAN_RSP是对SCAN_REQ的回应,所以其中会包含一些其他的信息。这些信息是程序中自己设置的。此次抓的包中内容为外貌和设备名称。scanner也就是获得了这些内容,才知道扫描到的设备是什么类型,叫什么名字。  

 7.连接请求

 通过wireshark抓取到的连接请求包如下图:

Access Address:固定广播地址。

Packet Header:包含了PUD类型为连接请求包(Connect_ind),发送地址和接收地址类型。

Initiator Address:初始地址,也就是主机的地址

Advertising Address:广播者地址,也就是设备的MAC地址。

Link Layer Data:负载信息,可以展开介绍。

 

 Access Address:接入地址

 CRC Init:CRC校验

 Window Size:传输窗口大小,2.5ms

 Window Offset:传输窗口偏移,2.5ms

 Interval:连接间隔30ms

 Latency:潜伏周期0

 Timeout:连接最大超时时间5000ms

 Channel Map:信道映射,可用的信道为1,不可用的为0.

 

Hop:调频增加(跳频算法使用)

Sleep Clock Accuracy:主机睡眠时间精度

Connect_IND数据包中的一些信息,在Nrf connect中也是可以看到的。

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

go 语言爬虫库goquery介绍

文章目录 爬虫介绍goquery介绍利用NewDocumentFromReader方法获取主页信息Document介绍通过查询获取文章信息css选择器介绍goquery中的选择器获取主页中的文章链接 爬取总结 爬虫介绍 爬虫,又称网页抓取、网络蜘蛛或网络爬虫,是一种自动浏览互联网并从网…

《直到黎明》中的人物性格——萨曼莎·戈登

在Supermassive Games开发的交互式恐怖冒险游戏《直到黎明》中,萨曼莎戈登是一位关键角色,其性格塑造丰富而立体,包含了多重维度的人性刻画。以下将从几个核心性格特点出发,深入探讨萨曼莎戈登这一角色。 一、勇敢坚韧 萨曼莎面对游戏中极端恶劣的生存环境与持续不断的恐怖…

openssl3.2 - osslsigncode工程的学习

文章目录 openssl3.2 - osslsigncode工程的学习概述笔记工程库地址工程的编译osslsigncodeM工程文件列表osslsigncodeM工程搭建细节原始工程实现的改动自己封装的包含openssl和curl的实现osslsigncodeM工程命令行的用法备注 - VS2019调试环境备注 - 如果要单步openssl的API学学…

STM32F407移植OpenHarmony笔记9

继上一篇笔记,已经完成liteos内核的基本功能适配。 今天尝试启动OHOS和XTS兼容性测试。 如何启动OHOS? OHOS系统初始化接口是OHOS_SystemInit(void),在内核初始化完成后,就能调用。 extern void OHOS_SystemInit(void); OHOS_Sys…

ChatGPT高效提问—prompt常见用法(续篇三)

ChatGPT高效提问—prompt常见用法(续篇三) 1.1 多选项 ​ 多选项技术为模型提供了一个清晰的问题或任务,并附带一组预先定义的潜在答案。这种方法在生成仅限于特定选项集的文本方面表现出色,适用于问答、文本补全和其他任务。利…

Elasticsearch:混合搜索是 GenAI 应用的未来

在这个竞争激烈的人工智能时代,自动化和数据为王。 从庞大的存储库中有效地自动化搜索和检索信息的过程的能力变得至关重要。 随着技术的进步,信息检索方法也在不断进步,从而导致了各种搜索机制的发展。 随着生成式人工智能模型成为吸引力的中…

『运维备忘录』之 Kubernetes(K8S) 常用命令速查

一、简介 kubernetes,简称K8s,是用8代替名字中间的8个字符“ubernete”而成的缩写,是一个开源的,用于管理云平台中多个主机上的容器化的应用。kubernetes是基于容器技术的分布式架构解决方案,具有完备的集群管理能力&a…

vue3-内置组件-Suspense

Suspense (实验性功能) <Suspense> 是一项实验性功能。它不一定会最终成为稳定功能&#xff0c;并且在稳定之前相关 API 也可能会发生变化。 <Suspense> 是一个内置组件&#xff0c;用来在组件树中协调对异步依赖的处理。它让我们可以在组件树上层等待下层的多个嵌…

机器学习系列——(十五)随机森林回归

引言 在机器学习的众多算法中&#xff0c;随机森林以其出色的准确率、对高维数据的处理能力以及对训练数据集的异常值的鲁棒性而广受欢迎。它是一种集成学习方法&#xff0c;通过构建多个决策树来进行预测和分类。本文将重点介绍随机森林在回归问题中的应用&#xff0c;即随机…

电力负荷预测 | 电力系统负荷预测模型(Python线性回归、随机森林、支持向量机、BP神经网络、GRU、LSTM)

文章目录 效果一览文章概述源码设计参考资料效果一览 文章概述 电力系统负荷预测模型(Python线性回归、随机森林、支持向量机、BP神经网络、GRU、LSTM) 所谓预测,就是指通过对事物进行分析及研究,并运用合理的方法探索事物的发展变化规律,对其未来发展做出预先估计和判断。…

【TCP】高频面试题

前言 在IT行业的求职过程中&#xff0c;传输控制协议&#xff08;TCP&#xff09;作为网络通信的核心协议之一&#xff0c;其相关面试题常常出现在各大公司面试中。TCP的稳定性和可靠性是支撑互联网数据传输的基石&#xff0c;因此&#xff0c;对TCP有深入理解不仅能够帮助求职…

架构之模板方法等模式的使用

目录 一、程序编写背景 二、编程思路讲解 - 类图 - 实现逻辑 - 工厂模式 - 模板方法模式 接口类&#xff08;代码&#xff09;抽象类&#xff08;代码&#xff09;具体实现类&#xff08;代码&#xff09;工厂类&#xff08;代码&#xff09;注册类&#xff08;代码&…

【Linux技术宝典】Linux入门:揭开Linux的神秘面纱

文章目录 官网Linux 环境的搭建方式一、什么是Linux&#xff1f;二、Linux的起源与发展三、Linux的核心组件四、Linux企业应用现状五、Linux的发行版本六、为什么选择Linux&#xff1f;七、总结 Linux&#xff0c;一个在全球范围内广泛应用的开源操作系统&#xff0c;近年来越来…

【Linux学习】线程详解

目录 十八.多线程 18.1 线程与进程 18.2 内核视角看待创建线程与进程 18.3 线程优缺点总结 线程的优点&#xff1a; 线程的缺点&#xff1a; 线程的用途&#xff1a; 18.4 线程与进程的联系 十九.线程控制 19.1 POSIX线程库 19.2 线程创建 19.3 线程等待 19.4 线程终止 19.5 线…

ChatGPT高效提问—prompt实践(生成VBA)

ChatGPT高效提问—prompt实践&#xff08;生成VBA&#xff09; 2. 生成VBA函数操作Excel ​ 当前Excel表格数据无背景颜色&#xff0c;区分不明显。假如我们想美化数据展示效果&#xff0c;把标题行设置为浅蓝色&#xff0c;其余奇数行设置为橙色&#xff0c;该怎么操作呢&am…

开启Android学习之旅-1

最近在学习《第一行代码 Android》&#xff0c;两天看书把所有代码都敲了一遍。由于之前没有接触过 Kotlin&#xff0c;导致了囫囵吞枣&#xff0c;跟着书会敲&#xff0c;离开就忘了。Android 大佬开发的各种框架、控件好像大部分都用了 Kotlin。看他们的源码&#xff0c;理解…

AI 消灭软件工程师?| 新程序员

【导读】“AI 是否会取代软件工程师”是自大模型爆火以来程序员们最为关心的一大话题&#xff0c;事关编程的未来与我们每一位程序员。本文作者 Babel CEO、多年的资深程序员张海龙深入技术本质&#xff0c;为我们进行了答疑解惑。 本文精选自《新程序员 007&#xff1a;大模型…

书生谱语-大语言模型测试demo

课程内容简介 通用环境配置 开发机 InterStudio 配置公钥 在本地机器上打开 Power Shell 终端。在终端中&#xff0c;运行以下命令来生成 SSH 密钥对&#xff1a; ssh-keygen -t rsa您将被提示选择密钥文件的保存位置&#xff0c;默认情况下是在 ~/.ssh/ 目录中。按 Enter …

【HTTP】localhost和127.0.0.1的区别是什么?

目录 localhost是什么呢&#xff1f; 从域名到程序 localhost和127.0.0.1的区别是什么&#xff1f; 域名的等级划分 多网站共用一个IP和端口 私有IP地址 IPv6 今天在网上逛的时候看到一个问题&#xff0c;没想到大家讨论的很热烈&#xff0c;就是标题中这个&#xff1a; …

如何把手机平板变为电脑的屏幕

文章目录 安装软件运行效果结尾 本文首发地址 https://h89.cn/archives/181.html 最新更新地址 https://gitee.com/chenjim/chenjimblog 闲置的手机平板、触屏音箱等&#xff0c;均可作为电脑的扩展屏&#xff0c;为电脑增加一块显示屏&#xff0c;本文介绍如何使用免费的软件s…