第10节-BLE协议链路层(LL)
本篇博客的学些要结合书籍《低功耗蓝牙开发权威指南,Robin Heydon著》第7章,实际上这书只是对蓝牙原版协议的简化、摘要。
回顾以前学过的《BLE协议各层的形象化理解》和《BLE协议各层数据格式概述》

一 链路层的5种状态:
就绪态(Stanby)、扫描态(Scanning)、广播态(Advertsing)、发起态(Initiating)、连接态(Connection)。
扫描态有2种子状态:被动扫描(Passive Scanning)、主动扫描(Active Scanning)
连接态有2种子状态:主(Master Role)、从(Slave Role)

二、数据格式:
LL层可以发出:广播包、数据包。Access Address等于0x8e89bed6时,是广播包;否则是数据包。
广播包
广播包有多种:
ADC_IND(通用广播)
ADV_DIRECT_IND(定向广播)
ADV_NONCONN_IND(不可连接广播)
ADV_SCAN_IND(可扫描广播)
SCAN_REQ(扫描请求)
SCAN_RSP(扫描响应)
CONNECT_REQ(连接请求)

2. 数据包
主设备连接从设备时,主设备分配一个32位的随机数并发送给从设备,这就是access address
access address被用来表示一个连接,在连接保持期间,access address不变。
对于同一个从设备,断开连接后再重新连接,access address会重新生成
数据包有2种:
发给链路层的控制包(LLID=11b)
空包,或发给上层L2CAP的数据包(LLID=01b,10b)
L2CAP的数据包很大时,可以拆分来多次发送,有起始包(LLID=01b)、延续包(LLID=10b)
这些包的数据格式,使用Wireshark很容易解析,只需要稍有了解即可。

三、自适应跳频:
对于广播包,会在37、38、39这3个广播信道循环发送;
对于数据包,会使用自适应跳频算法,在0~36这37个数据信道中挑选可用的信道。
主设备发出CONNECT_REQ时,会含有一个hop值,就是下面公式里的hopIncrement;还会含有一个Channel Map,它是一个37位的字段,每一位代表一个数据信道。某位为1,表示对应的信道可以使用;某位为0,表示对应的信道不可使用。
举例说明跳频算法(参考《低功耗蓝牙开发权威指南,Robin Heydon著》第7章)。
1. 在CONNECT_REQ中:
hop为7,
ChannelMap = 000111100000000011100000000001100000000 (bit 0对应Channel 0)
所以:
可用的信道Used = [9,10,21,22,23,33,34,35,36]
可用的信道数numUsed=9
2.跳频示例
连接事件:

主从设备之间可以发送数据,主设备可以从某个channel发送数据给从设备,从设备使用同一个channel向主设备回复数据。这一来一回就是一个连接事件。
有时候,从设备为了省电,没有回复数据,这也是一个channel;
主设备发送下一个包时,使用另一个channel,这是另一个连接事件。
|
连接事件 计数器 |
fn+1=(fn+hop)mod37 |
fn+1能用吗 |
remappingIndex = fn+1 mod 9 |
重映射的最终要用的信道 Used[remappingIndex] |
|
0 |
7 |
不 |
7 |
35 |
|
1 |
14 |
不 |
5 |
33 |
|
2 |
21 |
可 |
21 |
|
|
3 |
28 |
不 |
1 |
10 |
|
4 |
35 |
可 |
35 |
|
|
5 |
5 |
不 |
5 |
33 |
连接事件计数器为0时(一个事件对应一个channel),fn =0, hop=7----->fn+1= 7,从数组used中可以看出,fn+1是不能用的。因为used 数组中元素的个数为9,所以remappingIndex =7 mod 9 =7------->used[7]=35
连接事件计数器为1时,fn =7, hop=7----->fn+1=14,从数组used中可以看出,fn+1是不能用的。因为used 数组中元素的个数为9,所以remappingIndex =14 mod 9 =5------->used[5]=33
第10节-BLE协议链路层(LL)的更多相关文章
- 第13节-BLE协议L2CAP层
学习资料:官方手册 Vol 3: Core System Package [Host volume] Part A: Logical Link Control and Adaptation Proto ...
- 第12节-BLE协议HCI层的数据格式
学习资料: 1. 蓝牙协议core_v5.0.pdf <Vol 2: Core System Package [BR/EDR Controller volume]>的“Part E: Ho ...
- 第11节-BLE协议HCI层的硬件接口
本篇博客由韦东山视频整理所得 如何控制链路层让其发出广播包.数据包?通过HCI层向它发出命令,也可以通过ATT层.L2CAP层向LL层发出数据. 学习资料: 蓝牙协议core_v5.0.pdf < ...
- 第03节-BLE协议各层数据格式概述
本篇博客根据韦大仙的视频,整理所得. 对于BLE系统,它分为上下两块.上面那一块,我们称为host主机.下面这一块是controller,你可以简单的认为它就是一个蓝牙芯片. 对于host这一块,它运 ...
- 第02节-BLE协议各层的形象化理解
本篇博客根据韦大仙视频,整理所得. 先上框图: ATT层 从ATT开始看,在上篇博客讲的医院结构里面有个检验室,检验室可以得到各项结果,但是它并不知道这些结果代表什么含义.类比的在BLE协议栈里面,A ...
- 第15节_BLE协议GATT层
学习资料:官方手册 Vol 3: Core System Package [Host volume] Part G: Generic Attribute Profile (GATT) 这篇文章格式比较 ...
- 第16节_BLE协议GAP层
学习资料:官方手册 Vol 3: Core System Package [Host volume] Part C: Generic Access Profile 下面这个图是BLE协议各层跟医院的各 ...
- 第14节_BLE协议ATT层
下面这个图是BLE协议各层跟医院的各个科室的类比图: 跟医院类比,ATT层就是化验室,通过它可以得到各种检查结果──属性.这些检查结果之间有什么联系,它们组合起来体现了什么,化验室是不知道的,这些得由 ...
- 第05节-BLE协议物理层(PHY)
对于软件的人来说,物理层关注的内容会少一点.在前面的博客中,我们以快递员类比物理层,对于快递员来说,道路千万条,这条不通换另外一条.对于物理层来说也是一样的,它有很多频率,这个频率有冲突了,将会切到另 ...
随机推荐
- [LeetCode] 901. Online Stock Span 股票价格跨度
Write a class StockSpanner which collects daily price quotes for some stock, and returns the span of ...
- [LeetCode] 142. Linked List Cycle II 单链表中的环之二
Given a linked list, return the node where the cycle begins. If there is no cycle, return null. To r ...
- Pytorch循环神经网络LSTM时间序列预测风速
#时间序列预测分析就是利用过去一段时间内某事件时间的特征来预测未来一段时间内该事件的特征.这是一类相对比较复杂的预测建模问题,和回归分析模型的预测不同,时间序列模型是依赖于事件发生的先后顺序的,同样大 ...
- Spring Boot 知识笔记(集成zookeeper)
一.本机搭建zookeeper伪集群 1.下载安装包,复制三份 2.每个安装包目录下面新建一个data文件夹,用于存放数据目录 3.安装包的conf目录下,修改zoo.cfg配置文件 # The nu ...
- zlib: 不同语言,比如go, php, python 压缩的结果可能不同
1.这个是实际工作中发现的问题,一边用了go语言对一个文件进行了zlib压缩,然后我用 php 写了个脚本对同一个文件进行zlib压缩,但是生成的两个文件不同,当时一直以为是压缩参数选择错了,后来经过 ...
- Visual Studio 调试系列11 远程调试
系列目录 [已更新最新开发文章,点击查看详细] 你可以调试已部署在另一台计算机的 Visual Studio 应用程序. 要进行此操作,可使用 Visual Studio 远程调试器. 01 ...
- Java 获取所有子类信息
我以前的博客(Java Scala获取注解的类信息)介绍过通过Reflections工具通过使用特定注解的类的信息,其实本工具也可以获取接口,抽象类,类等的所有子类信息.使用方法如下: Reflect ...
- boolean 属性的定义规范
[强制]POJO类中的任何布尔类型的变量,都不要加is前缀,否则部分框架解析会引起序列化错误.说明:在本文MySQL规约中的建表约定第一条,表达是与否的值采用is_xxx的命名方式,所以,需要在< ...
- Java连载17-赋值类运算符&字符串的连接运算符
一.赋值运算符 1.赋值类运算符包括两种: (1)基本赋值运算符:= (2)扩展的赋值运算符: += -= *= /= &= 赋值类的运算符优先级:先执行等号右边的表 ...
- linux重定向 null和zero
文件描述符 linux下一切皆文件 文件描述符,是内核为了高效管理已经被打开的文件所创建的索引,用于指向被打开的文件,所有执行I/O操作的系统调用都通过文件描述符; 文件描述符是一个简单的非负整数,用 ...