本篇博客的学些要结合书籍《低功耗蓝牙开发权威指南,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)的更多相关文章

  1. 第13节-BLE协议L2CAP层

    学习资料:官方手册 Vol 3: Core System Package [Host volume] Part A: Logical Link Control and Adaptation Proto ...

  2. 第12节-BLE协议HCI层的数据格式

    学习资料: 1. 蓝牙协议core_v5.0.pdf <Vol 2: Core System Package [BR/EDR Controller volume]>的“Part E: Ho ...

  3. 第11节-BLE协议HCI层的硬件接口

    本篇博客由韦东山视频整理所得 如何控制链路层让其发出广播包.数据包?通过HCI层向它发出命令,也可以通过ATT层.L2CAP层向LL层发出数据. 学习资料: 蓝牙协议core_v5.0.pdf < ...

  4. 第03节-BLE协议各层数据格式概述

    本篇博客根据韦大仙的视频,整理所得. 对于BLE系统,它分为上下两块.上面那一块,我们称为host主机.下面这一块是controller,你可以简单的认为它就是一个蓝牙芯片. 对于host这一块,它运 ...

  5. 第02节-BLE协议各层的形象化理解

    本篇博客根据韦大仙视频,整理所得. 先上框图: ATT层 从ATT开始看,在上篇博客讲的医院结构里面有个检验室,检验室可以得到各项结果,但是它并不知道这些结果代表什么含义.类比的在BLE协议栈里面,A ...

  6. 第15节_BLE协议GATT层

    学习资料:官方手册 Vol 3: Core System Package [Host volume] Part G: Generic Attribute Profile (GATT) 这篇文章格式比较 ...

  7. 第16节_BLE协议GAP层

    学习资料:官方手册 Vol 3: Core System Package [Host volume] Part C: Generic Access Profile 下面这个图是BLE协议各层跟医院的各 ...

  8. 第14节_BLE协议ATT层

    下面这个图是BLE协议各层跟医院的各个科室的类比图: 跟医院类比,ATT层就是化验室,通过它可以得到各种检查结果──属性.这些检查结果之间有什么联系,它们组合起来体现了什么,化验室是不知道的,这些得由 ...

  9. 第05节-BLE协议物理层(PHY)

    对于软件的人来说,物理层关注的内容会少一点.在前面的博客中,我们以快递员类比物理层,对于快递员来说,道路千万条,这条不通换另外一条.对于物理层来说也是一样的,它有很多频率,这个频率有冲突了,将会切到另 ...

随机推荐

  1. Linux性能优化实战学习笔记:第五十六讲

    一.上节回顾 上一节,我带你一起梳理了,性能问题分析的一般步骤.先带你简单回顾一下. 我们可以从系统资源瓶颈和应用程序瓶颈,这两个角度来分析性能问题的根源. 从系统资源瓶颈的角度来说,USE 法是最为 ...

  2. [LeetCode] 466. Count The Repetitions 计数重复个数

    Define S = [s,n] as the string S which consists of n connected strings s. For example, ["abc&qu ...

  3. oracle--报错 ORA-00257

    [oracle@oracle01 ~]$ rman target/ RMAN-: =========================================================== ...

  4. Spring 常犯的十大错误,这坑你踩过吗?

    阅读本文大概需要 9 分钟. 1.错误一:太过关注底层 我们正在解决这个常见错误,是因为 “非我所创” 综合症在软件开发领域很是常见.症状包括经常重写一些常见的代码,很多开发人员都有这种症状. 虽然理 ...

  5. [解決方案]IIS配置后报错500.21

    如果报错这个信息,那么就是aspnet未注册造成的,需要安装一下 步骤: 1.打开CMD 2.输入cd %windir%\Microsoft.Net\Framework\v4.0.30319 3.执行 ...

  6. ApartmentState.STA

    需要设置子线程 ApartmentState 为 STA 模式,但 Task 又不能直接设置 ApartmentState,因此需要用 Thread 来封装一下. using System.Threa ...

  7. Zuul的使用,路由访问映射规则

    一.Zuul的介绍 Zuul包含了对请求的路由和过滤两个最主要的功能: 其中路由功能负责将外部请求转发到具体的微服务实力上,是实现外部访问统一入口基础而过滤器功能则负责对请求的处理过程进行干预,是实现 ...

  8. 《Linux就该这么学》培训笔记_ch02_一些必须掌握的Linux命令

    本文在原来作者的基础上做一些符合自己的修改.原文参考: <Linux就该这么学>培训笔记_ch02_一些必须掌握的Linux命令.     本章的内容虽然多,基本都是书本原话,但是笔记能精 ...

  9. Loj #2529. 「ZJOI2018」胖

    Loj #2529. 「ZJOI2018」胖 题目描述 Cedyks 是九条可怜的好朋友(可能这场比赛公开以后就不是了),也是这题的主人公. Cedyks 是一个富有的男孩子.他住在著名的 The P ...

  10. Docker底层原理介绍

    1.docker介绍 1.1什么是docker Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻 ...