蓝牙BLE学习-蓝牙广播

news2024/11/28 2:35:37

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.coloradmin.cn/o/1448464.html

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

相关文章

Node.js开发-HTTP协议

HTTP协议 1) 概念2) 请求报文的组成3) HTTP 的请求行4) HTTP 请求头5) HTTP 的请求体6) 响应报文的组成7) 创建 HTTP 服务8) 获取 HTTP请求报文9) 设置 HTTP 响应报文10) 设置资源类型(mime类型)11) GET和POST请求的区别 1) 概念 HTTP(hyper…

php数组与字符串函数

php数组与字符串函数 1. php数组2. 字符串函数 1. php数组 在php中,有三种类型的数组: 数值数组 - 带有数字ID键的数组关联数组 - 带有指定的键的数组,每个键关联一个值多维数组 - 包含一个或多个数组的数组 2. 字符串函数 在PHP中&#xf…

LeetCode:70.爬楼梯

前言:好家伙,一直以为动态规划是啥高大上的,解释那么多,在我看来不过是找规律罢了, 写那么多"专业术语"咋看咋像糊弄人的 (手动扶额) 另外,通项公式虽然抽象还能接受,但是矩阵快速幂…

Spring Boot 笔记 008 创建接口_获取用户信息

1.1.1 编写userinfo接口 1.1.2 User实体类中增加转json忽略password注释 package com.geji.pojo;import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonInclude; import lombok.Data;import java.time.LocalDateTime;//lombok 在…

给定n个结点的树,其中有k个结点是特殊结点(未知),定义好结点:该结点到k个特殊结点的距离之和最小。若随机k个结点为特殊结点,求好结点个数的期望值

题目 思路: 举例: 其中黑色结点为特殊结点,可以看出,每种情况都有一个结点的s值不等于k / 2,但是是好结点,所以最后答案加一。 #include <bits/stdc++.h> using namespace std; #define int long long #define pb push_back #define fi first #define se second …

Linux释放内存

free -m是Linux上查看内存的指令&#xff0c;其中-m是以兆&#xff08;MB&#xff09;为单位&#xff0c;如果不加则以KB为单位。 如下图表示&#xff0c;&#xff08;total&#xff09;总物理内存是809MB&#xff0c;&#xff08;used&#xff09;已使用167MB&#xff0c;&…

【深度学习】: 脑部MRI图像分割

清华大学驭风计划课程链接 学堂在线 - 精品在线课程学习平台 (xuetangx.com) 代码和报告均为本人自己实现&#xff08;实验满分&#xff09;&#xff0c;只展示主要任务实验结果&#xff0c;如果需要详细的实验报告或者代码可以私聊博主&#xff0c;接实验技术指导1对1 有任…

不可错过!10款超赞实用插件框架

Cocos 游戏开发十八般武器&#xff0c;尽在 Cocos Store 今天给大家分享10款实用插件与框架&#xff01; 1. 快闪-Tab标签王(prefab标签栏) 作者&#xff1a;嘉年华&#xff08;gameWs&#xff09; 《快闪-标签王》插件&#xff0c;解决了日常开发过程中&#xff0c;经常需要通…

一起玩儿Proteus仿真(C51)——05. 红绿灯仿真(一)

摘要&#xff1a;本文介绍如何仿真红绿灯 今天来做一个红绿灯仿真的程序&#xff0c;这个程序主要包括一下这些功能&#xff1a; 模拟的路口为十字交叉路口&#xff0c;假设东西和南北方向都是双向行驶&#xff0c;因此需要设置4组红绿灯和4个倒计时显示屏。倒计时时间最长为9…

.NET高级面试指南专题七【SocketWebSocket】

Socket&#xff08;套接字&#xff09;是一种在计算机网络中实现通信的一种机制&#xff0c;它提供了一种标准的接口&#xff0c;使不同计算机上的程序能够通过网络进行数据交换。Socket允许在网络中的不同设备之间建立连接&#xff0c;进行双向的数据传输。 Socket通常用于实现…

C语言学习day13:for循环练习(生成随机数)

题目&#xff1a; 通过程序随机一个1-100的数&#xff0c;用户通过键盘输入数字 看是否匹配&#xff0c;匹配成功则跳出循环&#xff0c;失败则继续循环。 思路&#xff1a; 然后生成一个随机数需要写成死循环&#xff0c;同时需要有其他的出口可以写一个提示&#xff0c;比…

猫头虎分享已解决Bug || 任务调度失败(Cron Job Failure):CronJobError, ScheduledTaskFailure

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

炫酷3D按钮

一.预览 该样式有一种3D变换的高级感&#xff0c;大家可以合理利用这些样式到自己的按钮上 二.代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice…

URL编码算法:解决特殊字符在URL中的烦恼

引言&#xff1a; URL编码算法是一种将URL中的特殊字符转换为特定格式的编码方式。它在网络传输中起到了保护数据安全与完整性的重要作用。本文将深入探讨URL编码算法的优点与缺点&#xff0c;并介绍它在Web开发、网络安全等方面的应用。 URL编码解码 | 一个覆盖广泛主题工具…

Decian 12.x基于LNMP安装phpIPAM(IP管理系统)

phpipam是一个开源Web IP地址管理应用程序&#xff08;IPAM&#xff09;。其目标是提供轻便&#xff0c;且有用的IP地址管理系统。它是基于PHP的应用程序&#xff0c;具有MySQL数据库后端&#xff0c;使用jQuery库&#xff0c;ajax和HTML5 / CSS3功能。 在Debian 12中&…

20240212请问如何将B站下载的软字幕转换成为SRT格式?

20240212请问如何将B站下载的软字幕转换成为SRT格式&#xff1f; 2024/2/12 12:47 百度搜索&#xff1a;字幕 json 转 srt json srt https://blog.csdn.net/a_wh_white/article/details/120687363?share_token2640663e-f468-4737-9b55-73c808f5dcf0 https://blog.csdn.net/a_w…

PHP开发日志 ━━ 深入理解三元操作与一般条件语句的不同

概况 三元运算符的功能与“if…else”流程语句一致。 在一般情况下&#xff0c;三元操作替换if条件语句可以精简代码&#xff0c;并且更为直观&#xff0c;但是在下面的情况中使用三元操作将会返回警告。 借图&#xff1a; 案例 比如原代码&#xff1a; class classA{publ…

Vue3.0(六):VueX 4.x详解

Vuex4状态管理 什么是状态管理 在开发中&#xff0c;我们的应用程序需要处理各种各样的数据&#xff0c;这些数据需要保存在应用程序的某一个位置&#xff0c;对于这些数据的管理&#xff0c;就是 状态管理目前前端项目越来越复杂&#xff0c;多组件共享同一数据的状态很常见…

高校危化试剂管理:Java与SpringBoot的革新

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

机器学习2---逻辑回归(基础准备)

逻辑回归是基于线性回归是直线分的也可以做多分类 ## 数学基础 import numpy as np np.pi # 三角函数 np.sin() np.cos() np.tan() # 指数 y3**x # 对数 np.log10(10) np.log2(2) np.e np.log(np.e) #ln(e)# 对数运算 # log(AB) log(A) logB np.log(3*4)np.log(3)np.log(4) #…