首页 > 其他分享 >BLE中GAP层中广播、扫描、连接等概念在LL层的具体实现

BLE中GAP层中广播、扫描、连接等概念在LL层的具体实现

时间:2023-06-15 15:55:56浏览次数:46  
标签:层中 LL 扫描 连接 广播 GAP PDU

BLE中GAP层中广播、扫描、连接等概念在LL层的具体实现

在spec中GAP的章节里对广播、扫描、连接的概念进行了说明。但缺乏具体实现的解释。

Vol 3: Core System Package [Host volume]

Part C: Generic Access Profile

而在LL层章节中则提供了相关GAP相关数据包交互的流程。

Vol 6: Core System Package [Low Energy Controller volume]

Part B: Link Layer Specification

4 Air Interface protocol

为了更好的理解BLE中GAP协议,对LL层相关基本流程进行分析是很有意义的。这里只对GAP中的传统(Legacy)广播、扫描连接进行基本分析。扩展广播和扫描连接在另外章节做分析。为了能更好的从LL层向GAP层过度,这里我们仍采用LL层中Physical channel的定义来做分类。

Advertising physical channel 的交互

广播

广播包解析

传统广播使用的基本广播包ADV_IND PDU结构如上,该PDU被包含在LL层的封包中。PDU结构包含

  • AdvA:广播地址,即MAC地址

  • AdvData:广播数据,0-31长度,格式有相关要求。

对于其他类型的广播,PDU结构会有区别。例如定向广播还会包含主机设备地址,用于指定哪个主机允许搜到该广播信号。具体情况需查询spec中的说明。

广播流程

​ 广播流程如上图,广播设备连续在37、38、39三个广播信道上发送广播包,作为一个广播事件周期。

扫描

扫描流程

​ 扫描流程为主机监听广播包后,发起扫描请求和接收扫描响应的过程。具体流程如下:

  1. 从机设备进行广播,周期性发送广播包ADV_IND

  2. 当主机监听到从机设备发送的广播包后,可以向从机设备发送扫描请求包SCAN_REQ

  3. 但从机听到主机发送的扫描请求包后,可以进行响应并发送扫描响应包

该过程用于主机设备在不与从机设备发生连接的情况下,能获取更多的信息。

需要注意的是,广播类型可以设置为不可扫描的(Non-scannable)。这样的广播主机发送扫描请求包将得不到从机的应答。

扫描请求包

基本的扫描请求包SCAN_REQ格式如上,包含:

  • ScanA:扫描设备的MAC地址
  • AdvA:广播设备的MAC地址

扫描响应包

基本的扫描响应包SCAN_RSP格式如上,包含:

  • AdvA:广播设备的MAC地址
  • ScanRspData:扫描响应数据,0-31字节。格式要求和广播数据意义。

连接

连接建立流程

连接建立流程如下:

  1. 从机发送广播包
  2. 主机收到广播包后,向从机发送连接请求包。
  3. 双方根据连接请求包中的内容,同步连接参数。然后在协商好的时间点进行连接事件(交换连接数据包)

这里的流程说明比较简略。具体的流程说明和参数解释需参考开头说的spec里的章节。

连接请求包

连接请求包内如如上,包含:

  • InitA:主机MAC地址
  • AdvA:从机MAC地址
  • LLData:连接建立参数

其中LLData中的参数包含:

  • AA:链路层的访问地址Access Address。即把LL包的AA又复制了一遍过来。

  • CRCInit:CRC校验的初始值

  • WinSize:发送窗口的大小

  • WinOffset:发送窗口的偏移

  • Interval:连接间隔

  • Latency:可以跳过的连接事件

  • Timeout:连接超时时间

  • ChM:可用连接数据信道图

  • Hop:跳频算法

  • SCA:休眠时钟精度

相关参数只做简单介绍,具体说明请参考spec。

Data Physical Channel 的交互

连接数据交互

数据通道的信息交互已经和GAP层无关了,GAP层类似于OSI中的网络层,负责将设备进行拓扑组网。现在连接已经建立,剩下的就是更高层次的通信需求。

连接数据交换过程

img

上图为连接事件中主从数据交换的过程示意图。相关过程如果要展开来讲会涉及高层次协议概念,这里读者只需了解它的本质只是简单的主从数据包交换即可。

连接数据PDU格式

数据交互部分的PDU内容与LL层和GAP层已经无关了,而是涉及L2CAP层概念,在L2CAP层中的PDU分为各种类型,例如上图是L2CAP中B帧类型的PDU结果。这里读者无需了解这个B帧是什么,只需要知道数据交互也还是以PDU形式进行的即可,而PDU中具体的内容则会在L2CAP层协议得解析文章中再做具体分析。

连接控制交互

连接控制的交互涉及到上次许多协议的概念,例如SMP层的加密请求,PHY层的通信速率改变、GAP层的连接参数更新等。这些行为具象化到LL层就是连接控制交互的各种PDU。由于本文只关注LL层和GAP层的联系,因此只以连接参数更新为例进行介绍,其他请参考spec。

PDU基本结构

连接控制PDU基本结构如上,其中:

  • Opcode:为operation码,指示是何种操作,在上一篇PDU总结中对所有的控制PDU都进行了总结,详情情况上一篇博客。

  • CtrData:具体操作内容。

连接参数更新

连接参数更新的流程如上图。详细说明参考spec如下章节

Vol 6: Core System Package [Low Energy Controller volume]

Part B: Link Layer Specification

5 Link Layer control

5.1 Link Layer control procedures

连接参数更新请求包

连接参数更新请求包的Opcode为0x00,即LL_CONNECTION_UPDATE_IND。CtrData中包含连接参数,具体内容和连接请求包一样。

总结

LL层作为支撑,将上层协议的各种概念都具象化为一种种PDU,然后组成包发到空中。通过对PDU的内容结构,PDU的交互方式进行分析了解,才能更好的明白上次协议的各种概念。

标签:层中,LL,扫描,连接,广播,GAP,PDU
From: https://www.cnblogs.com/simpleGao/p/17483115.html

相关文章

  • SQL中的 collation level 是什么?
    yyy问了一个更具体的问题:Collation我理解了,但是CollationLevel是什么概念呢?好问题!CollationLevel的用途是,当两个Collation做比较时,CollationLevel可以规定以哪个Collation为标准来做比较。详见下面的函数实现(特别关注collationlevel不相等的那几行代码【Line75~80】......
  • springboot项目启动失败之 org.springframework.boot.env.OriginTrackedYamlLoader.cr
    1、检查一下父项目的module的依赖是否,以及版本是否一致。例如<dependency><groupId>org.yaml</groupId><artifactId>snakeyaml</artifactId><version>1.30</version></dependency>2、如何知道自己的org.yaml的版本,可以双击Shift键,输入如图所示,注意划红线的地方就是......
  • 队列Rollback的设计
    有一个队列包含了N个block,每个block是队列中的一个元素。block很大,一个block中可以容纳M个item(M>1)。这个队列的基本使用模式就是:不断的有item过来,往block里面填充,一旦block满,就创建一个新的block,后继item都填往新block。rollback的定义:最后一个item填充到block中后,由于出现了某种错......
  • BLE中GAP层的PDU类型表
    在蓝牙的spec中Host卷GAP篇中对有关广播、扫描、连接以及相关扩展的概念和流程进行了解释和说明。但是如果只看这些抽象的理论是比较难以理解的,而在controller卷LL篇中给出了这些抽象概念的具象化实现,也就是各种各样类型的PDU包。通过对GAP层在LL层中PDU部分的各种实现情况,可以让......
  • JAVA面试题解惑系列(四)——final、finally和finalize的区别
    关键字:java面试题finalfinallyfinalize作者:臧圩人(zangweiren)final、finally和finalize的区别是什么?这是一道再经典不过的面试题了,我们在各个公司的面试题中几乎都能看到它的身影。final、finally和finalize虽然长得像孪生三兄弟一样,但是它们的含义和用法却是......
  • Cannot Reference “XxxClass.xxx” Before Supertype Constructor Has Been Called
    百度翻译:在调用超类型构造函数之前无法引用“XxxClass.xxx”-----我的理解:一个类的构造器方法还未执行的时候,我们无法使用类的成员属性或成员方法。 下面是此错误的示例代码publicclassMyExceptionextendsRuntimeException{privateinterrorCode=0;......
  • 从 SpringApplication 认识 Spring 应用启动过程
    一、SpringApplication是什么?Spring应用的启动类。二、SpringApplication执行了什么?创建ApplicationContext实例ApplicationContext就是我们所说的容器实例。注册CommandLinePropertySourceCommandLinePropertySource的作用是将命令行参数输出为Spring属性。......
  • MEF.postman_collection.json
    { "info":{ "_postman_id":"c41bc34c-dec8-4270-b3a4-e9a53b36c705", "name":"MEF", "schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json" }, "item......
  • 一招解锁Triller无水印视频下载技能,支持安卓和ios!!
    最近比较爱玩triller,一个类似抖音的短视频平台,不同的是Triller平台的用户群体覆盖了全球200多个国家和地区,好比只面向国内的群体内容更丰富,这也是我现在喜欢用它的原因之一,唯一的缺点就是上面的视频下载下来会有水印,呜呜呜哭死我了!我连找了三天,终于被我找到了能无水印下载triller视......
  • MySQL数据库运维实录--通过MySQL Shell Dump/Load 实现数据库对象的逻辑备份与恢复
    [mysql@node01~]$mysqlshMySQLJS>\connectroot@node01:3306MySQLnode01:3306sslJS>util.dumpInstance('/home/mysql/backup')[mysql@node01~]$scp-rbackup/*node02:/home/mysql/backup/util.dumpInstance的关键特性1,多线程备份。并发线程数由thr......