蓝牙----蓝牙协议栈Host层

news2024/10/2 8:21:29

蓝牙协议栈----Host层

  • 蓝牙物理层基本信息
  • 链路层的状态机
    • 进入连接态的步骤
    • 主动扫描与被动扫描
    • 链路层通信模式
  • 蓝牙地址
    • 蓝牙设备地址
    • 蓝牙标识地址
    • 蓝牙接入地址
  • 蓝牙广播信道管理
  • 蓝牙数据信道跳频


蓝牙协议栈Host层包括PHY、LL、HCL层,注重关注PHY物理层和LL链路层。

蓝牙物理层基本信息

► 蓝牙使用高斯频移键控GFSK
► 频率范围2.4000 GHz - 2.4835GHz,又划分为40个channel,
► 第一个通道的中心频率是2402MHz,最后一个通道的中心频率是2480MHz
► 有效频率偏移为:±185kHz

LE 物理层的四种工作模式:

  • LE 1M sym/s:三种模式,非编码模式,S=2映射编码模式,S=8映射编码模式。
  • LE 2M sym/s:1种模式, 非编码模式。

2M因为传输速率更快,所以具有更低的功耗
1Mcode因为由编码传递适用FEC纠错码,所以具有更远的连接距离

物理层调制方式符号速率信息速率通信距离数
LE 1M PHY1M sym/s1Mb/s1Mb/s1
LE CodedPHY S=21M sym/s1Mb/s500kb/s2
LE CodedPHY S=81M sym/s1Mb/s125kb/s4
LE 2M PHY1M sym/s2Mb/s2Mb/s0.8

链路层的状态机

  • Standby State(就绪态):设备上电后,设备处于就绪态
  • advertising State(广播态):设备进行广播数据和扫描响应数据发送。广播态在链路层有两种变化:广播态设备停止广播进入就绪态。广播态的设备收到发连接请求后进入连接态。
  • Scanning(扫描态):设备监听哪些设备正在广播,扫描态的设备停止扫描进入就绪态。
  • Initiating(发起态):设备处于发起态进而发起连接,处于发起态的发起者,收到想连接设备的广播报文,链路层会向其发起连接请求并进入连接态,广播者也进入了连接态
  • Connection(连接态):主设备从发起态进入连接态,从设备从广播态进入连接态。
    在这里插入图片描述

进入连接态的步骤

广播态不断发送广播
扫描态扫描到广播进入就绪态,再由就绪态进入发起态
发起态进入连接态;广播态进入连接态

主动扫描与被动扫描

  • 主动扫描:广播态设备接收了广播报文后,发送扫描请求给广播设备,并接收广播设备的扫描响应数据。
  • 被动扫描:广播态设备仅侦听正在广播的设备,并接收其发送的广播报文。

链路层通信模式

  • Advertiser — Scanner:广播者与扫描者之间通过广播信道传输数据,是一种一对多的通信方式,进行广播者到扫描者的单方向通信。
  • Master/Central — Slave/Peripheral:主从设备通过数据信道传输数据,是一种一对一的通信方式,没对主从机进行各自的双向通信。

蓝牙地址

蓝牙设备地址Device Addres
蓝牙标识地址Identity Address
蓝牙接入地址Access address

蓝牙设备地址

设备地址Device Addres为48bit有两大类公共地址、随机设备地址,一共有四种:
1.公共地址
公共设备地址创建时需要获得IEEE分配的MAC地址块
2.随机设备地址

随机静态地址:电源重启后设备赋予新的静态地址值
在这里插入图片描述

可解析的私有地址:为生成可解析私有地址设备必须有本地身份解析码(IRK)或对等身份解析码(IRK)。
可解析私有地址通过IRK和随机产生的24位随机数来生成。可解析私有地址的随机数被称为prand值。
一端通过IRK和Prand生成Hash,Prand和Hash做为可解析的私有地址发送;
发送另一端用接收到的Prand和使用的IRK计算得到Hash,与接收到的Hash比较,相同代表识别成功。
在这里插入图片描述

不可解析的私有地址
在这里插入图片描述

私有地址是实现蓝牙设备隐私(Privacy)的技术基础

蓝牙标识地址

► 如果一个设备仅支持public address, 那么该public address 可以作为这个设备的indentify address,在配对过程中使用
► 如果一个设备支持random static address,同样可以作为indentify address使用
► 如果一个设备使用的是resolvable private address,通过IRK解析之后的地址,是indentify addres

蓝牙接入地址

32Bit,用于标识一个蓝牙通信事件

蓝牙广播信道管理

BLE有12个channel与wifi的常用信道不重合,其中37,38,39用于广播,所有BLE设备共用这三个信道广播

► 每包广播数据,都会在37、38、39三个信道上依次发送一次。
► 广播信道的随机延时:每一个广播包实际发送的广播间隔,会+10ms以内的随机延时,避免和其他设备产生冲撞。
► 广播信道不允许发送超过37字节的数据。
►广播信道不支持5.0协议的2M PHY的传输速率。

蓝牙数据信道跳频

信道地图:
信道评估依靠RSSI(接收信号强度指示)PER(分组错误率)对每一个物理信道的可用性进行分类标注为可用或不可用。对于标注为不可用的物理信道在跳频时不予选用。信道地图由低功耗蓝牙连接中的中心设备绘制并提供给与其相连接的周边设备。

跳频公式:
f(n+1)=(fn+hop)mod37
fn:为上一次连接事件使用的信道索引(初始时此值为0);
f(n+1):为首次计算的下一次连接事件使用的信道索引;
hop:为跳频参数值,取值范围为5到16,由中心设备决定并在发起连接时通知与其连接的周边设备

CSA#1:
► 根据跳频算法计算后当f_(n+1) 为信道地图中的可用信道时直接使用
► 当f_(n+1) 为信道地图中的不可用信道时则重新计算。
○ 重新计算算法: f_new= f_(n+1) mod N,
f_new 为重新计算得到的信道地图索引所对应的信道 (信道地图中的可用信道从0开始升序编号)
N:指信道地图中可用信道数量。

CSA#2:跳频阶跃hop不是固定的。
hop每次计算的目的是:每个连接事件与先前的连接事件相比发生在最小频率偏移,避免干扰和多路径衰落效应。

跳频#1只适用于连接信道,跳频#2可以用在广播信道和连接信道。

自适应跳频AFH:允许蓝牙通过识别固定的干扰源并将其从可用信道列表中排除来适应环境。
信道地图重新获取,需要传递的参数:
新的信道图:channel Map
瞬时:设备双方使用新的channel Map的切换时间。

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

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

相关文章

微服务入门篇:Eureka注册中心(作用,搭建Eureka客户端和服务端)

目录 1.提供者与消费者2.Eureka的作用3.搭建EurekaServer1.配置服务端2.配置客户端3.复制实例操作4.服务拉取 1.提供者与消费者 ①服务提供者:一次业务中,被其它微服务调用的服务。(提供接口给其它微服务) ②服务消费者:一次业务中,调用其它微…

嵌入式学习-C++-Day3

嵌入式学习-CDay3 一、思维导图 二、作业 1.设计一个Per类,类中包含私有成员:姓名、年龄、指针成员身高、体重,再设计一个Stu类,类中包含私有成员:成绩、Per类对象p1,设计这两个类的构造函数、析构函数和拷贝构造函数。 #inclu…

UBUNTU中NGINX的负载均衡和环境搭建

1.准备三台ubuntu版本的虚拟机 2.开始安装,下载,解压,以及编译nginx所需的环境依赖 这里需要注意我们创建了一个新的目录 /home/nginx,所以在编译中记得更改 然后再编译过程中我们会发现提示无法编译,原因是缺少c语言的插件&…

Java 字符串 06 练习-字符串拼接、反转、金额转换(黑马)

代码: //import java.util.Scanner; public class practice{public static void main(String[] args) {int arr [] {1,2,3,4};String str arrToString(arr);System.out.println(str);}public static String arrToString(int [] arr){if(arrnull){return "&q…

让B端管理软件既美观又实用的解决方案来了

hello宝子们...我们是艾斯视觉擅长ui设计和前端开发10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩! 让B端管理软件既美观又实用的解决方案来了 在当今数字化时代,B端管理软件已…

每日一题——LeetCode2859.计算K置位下标对应元素的和

方法一 枚举法: 通过不断地将目标数值与 1 进行按位与操作,并根据结果判断最低位是否为 1,从而统计其中包含的 1 的个数。 如果1的个数等于K就加上该值。 var sumIndicesWithKSetBits function(nums, k) {function countOnes(num) {let cou…

谷歌企业开发者如何申请邓白氏码?

邓白氏编码是具有唯一性的9位数标识符,由 Dun & Bradstreet 分配给各组织,用于验 证商家,一个公司可免费申请一个。没有邓白氏编码,则不能注册单位开发者账号。 申请和接收邓白氏码是无需支付任何费用的,全程免费…

09.Elasticsearch应用(九)

Elasticsearch应用(九) 1.搜索结果处理包括什么 排序分页高亮返回指定字段 2.排序 介绍 Elasticsearch支持对搜索结果排序,默认是根据相关度算分来排序 支持排序的字段 keyword数值地理坐标日期类型 排序语法 GET /[索引名称]/_sear…

MVC架构模式与三层架构

提示:博客中的图片来源于动力节点在B站的视频讲解。 MVC架构模式与三层架构 一、三层架构二、MVC(model view controller)1.MVC 框架的工作流程(1)JSP Servlet javabean实现MVC。(2)SSM&#…

力扣1035. 不相交的线

动态规划 思路: 思路同 力扣1143. 最长公共子序列假设 dp[i][j] 为 nums1 长度 i 和 nums2 长度 j 能够组成不想交线的个数;可知 dp[0][j] 0(nums1 长度为 0 不能组成线);同理 dp[i][j] 0;转移方程&…

python就业如何?和C++相比该选择哪个更好?

python就业如何?和C相比该选择哪个更好? 在开始前我有一些资料,是我根据网友给的问题精心整理了一份「C的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家&#xff…

202410读书笔记|《半小时漫画青春期》——成为自己世界的星星,这才是最要紧的事儿

202410读书笔记|《半小时漫画青春期:心理篇》——成为自己世界的星星,这才是最要紧的事儿 一、一到考试就焦虑,怎么办?二、以前情绪挺淡定,现在咋动不动就爆发?三、追星那么开心,为啥还要我小心…

CHS_07.2.2.4_3+调度算法:多级队列调度算法

CHS_07.2.2.4_3调度算法:多级队列调度算法 多级对列调度算法 接下来 多级对列调度算法 看一个图你就明白了 如果一个系统采用多级对列调度算法 那么 这个系统会按照进程的类型设置多个对列 并且给不同的对列设置不同的优先级 举个例子 分为系统进程 交互式进程以…

力扣算法-Day19

344.反转字符串 编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 你可以假设数组中的所有字符都是 ASCII 码表中的…

5|领域建模实践(上):怎样既准确又深刻地理解业务知识?

上节课咱们完成了事件风暴,梳理了系统的行为需求。但你可能也发现了,其实还有些微妙的业务概念还没有澄清,这就要靠领域建模来完成了。 建立领域模型是 DDD 的核心。要建好领域建模,需要理论和实践相结合。由于我们的模型有一定的…

5.【SpringBoot3】文件上传

1. 文件上传到本地 需求分析 在用户更换头像或发布文章时,需要携带一个图片的 url 地址,该 url 地址是当用户访问文件上传接口,将图片上传成功后,服务器返回的地址。所以,后台需要提供一个文件上传接口,用…

Unity2020.3打包ARFoundation问题记录

文章目录 前言一、打包成功后再打包失败(重启工程后)二、URP管线总结 前言 在Unity 2020.3版本中使用ARFoundation进行打包时,遇到一些小问题。本文简要记录了其中一些问题及解决方法,以备不时之需。 一、打包成功后再打包失败&a…

嵌入式培训机构四个月实训课程笔记(完整版)-Linux ARM平台编程第四天-Bootloader编写2(物联技术666)

链接:https://pan.baidu.com/s/1eb94AaDM-cIZsbr929Isbw?pwd1688 提取码:1688 上午:bootloader的编写 下午:bootloader 教学内容: 1、vivi vivi有关nandflash MTD分区表控制命令: part show: …

python爬虫采集下载中国知网《出版来源导航》论文文献下载_PDF文档_数据采集知网爬虫论文Python3

时隔一年,很久没更新博客了。今天给大家带来一个python3采集中国知网 :出版来源导航 这个是网址是中国知网的,以下代码仅限于此URL(出版来源导航)采集,知网的其他网页路径采集不一定行,大家可以…

C++:vector容器(memcpy浅拷贝问题、迭代器失效问题)

文章目录 一. vector 的介绍二. vector 的使用1. string 和 vector<char> 的区别2. 为什么 vector 没有 find() 接口 三. vector 的模拟实现1. vector 的基本框架2. memcpy 和 memmove 的浅拷贝问题3. vector 迭代器失效问题4. 模拟代码 一. vector 的介绍 vector 的文档…