一、 BLE控制器链路层概述

#######################################################

蓝牙链路层(Link Layer)有五个状态:就绪、广播、扫描、初始化、链接。

链接状态下有两个角色:主和从。(Master和Slave)
如果链路层支持五个状态机:
  1. 连接状态下,可以同时为主和从
  2. 连接状态下,处于从可能支持多个连接。
  3. 连接状态下,处于主可能支持多个连接。
  4. 连接状态下,链路层和另外一个链路层只能保持最多一个链接。
设备地址一定是一个6字节长度。

地址分类:公共设备地址(24bit公司分配+24bit的公司id)和随机设备地址(静态和私有--可分解和不可分解)。
物理通道
  1. 分为广播通道(37-39)和数据通道(0-36)。
  2. 两个设备通信要在同一个物理通道上,所以在一个时间要在同一个RF通道上。
  3. 通道有限,为了避免碰撞,每一个物理通道上的传输都以一个接入码为开端。
  4. 每一个链路层都在一个给定的时间使用一个物理通道。

二、空中包
#######################################################

包格式
广播通道和数据通道使用一种格式。

preamble           :用于同步

Access Address: 广播通道的都是一样的,数据通道的不一样,详见core。
PDU                   : 数据载荷
CRC                   :循环校验
广播通道PDU

PDU Type有八种

0000 ADV_IND                               :可连接非直接的广播事件

这里TxAdd表示是公共(TxAdd = 0)或者随机(TxAdd = 1)的蓝牙地址。

 
0001 ADV_DIRECT_IND                :可连接直接的广播事件
这里TxAdd表示是公共(TxAdd = 0)或者随机(TxAdd = 1)的蓝牙地址。
这里RxAdd表示是公共(RxAdd = 0)或者随机(RxAdd = 1)的蓝牙地址。
0010 ADV_NOCONN_IND              :不可连接非直接的广播事件
这里TxAdd表示是公共(TxAdd = 0)或者随机(TxAdd = 1)的蓝牙地址。
0100 ADV_SCAN_IND                     :可扫描非直接的广播事件(mark:可连接吗?)
这里TxAdd表示是公共(TxAdd = 0)或者随机(TxAdd = 1)的蓝牙地址。

 扫描PDU

SCAN_REQ:链路层在扫描状态的设备发出,链路层在广播状态的设备接收
这里TxAdd表示是公共(TxAdd = 0)或者随机(TxAdd = 1)的蓝牙地址。
这里RxAdd表示是公共(RxAdd = 0)或者随机(RxAdd = 1)的蓝牙地址。

SCAN_RSP:链路层在广播状态的设备发出,链路层在扫描状态的设备接收
这里TxAdd表示是公共(TxAdd = 0)或者随机(TxAdd = 1)的蓝牙地址。
初始化PDU

AA:接入地址

CRCInit        :
WinSize        : 用来表示transmitWindowSize,其中,transmitWindowSize =WinSize * 1.25 ms.
WinOffset     :transmitWindowOffset = WinOffset * 1.25 ms.
Interval         :connInterval = Interval * 1.25 ms
Latency        :connSlaveLatency
Timeout        :connSupervisionTimeout = Timeout * 10 ms.
数据通道PDU

#######################################################

4 Air Interface Protocol

4.1 Interface Frame Space
在同一个通道索引下,两个连续包的间隔叫做interface frame space。
4.2 TIMING REQUIREMENTS
有两种可用的时钟精度。
链路层的连接和广播事件使用active clock,其他的使用sleep clock.
4.3 LINK LAYER DEVICE FILTERING
根据地址筛选设备
筛选策略用于广播、扫描和初始化状态,都是独立的而且有各自的步骤。
4.3.1 White List
白名单有一个白名单列表,包含了设备地址和地址类型(公共或者随机)
支持链路设备筛选的必须至少能保存一个白名单。
重启以后白名单要为空。
配置白名单通过Host。
4.3.2 Advertising Filter Policy
如果不是使用直接广播方式的话,筛选策略应该被忽略,否则应该使用其中一种
  1. 链路层从白名单中处理扫描和链接请求
  2. 链路层直接处理所有扫描和连接请求
  3. 链路层从所有设备中处理扫描请求,从白名单中处理连接请求
  4. 链路层从所有设备中处理连接请求,从白名单中处理扫描请求
四中只能一次用一种。
4.3.3 Scanner Filter Policy
  1. 链路层从白名单中处理广播包,可连接的直接广播包不包含在扫描设备地址会被忽略。
  2. 链路层从所有包中处理广播包,可连接的直接广播包不包含在扫描设备地址会被忽略。

如果支持拓展的扫描筛选策略,也可能支持

  1. 链路层从白名单中处理广播包,可连接的直接广播包z中的initA是一个可分解私有地址就不会被忽略。
  2. 链路层从所有包中处理广播包,可连接的直接广播包z中的initA是一个可分解私有地址就不会被忽略。

4.3.4 Initiator Filter Policy

  1. 链路层从白名单中的所有设备处理广播包。
  2. 链路层忽略白名单并且从一个指定的广播包中处理可连接包。

4.4 NON-CONNECTED STATES

4.4.1 Standby State
链路层的默认状态,必须不收不发,可以进入广播、扫描和初始化状态。

4.4.2 Advertising State
在这个状态,链路层发送广播PDU,处于广播事件。

四种广播事件

  1. a connectable undirected event
  2. a connectable directed event
  3. a non-connectable undirected event
  4. a scannable undirected event
广播事件类型  PDU类型  允许的响应  
    SCAN_REQ CONNECT_REQ
Connectable Undirected Event  ADV_IND YES  YES 
Connectable  Directed Event  ADV_DIRECT_IND  NO YES 
Non-connectable Undirected Event ADV_NONCONN_IND  NO  NO
Scannable Undirected Event ADV_SCAN_IND YES   NO
如果广播者在广播事件收到的PDU不是允许的就应该被忽略。如果没有收到或者忽略了PDU,那么广播这应该在下一个使用的广播信道上发PDU或者关闭广播事件
 
##Advertising Interval
广播通道:3个预留的
广播间隔:
T_advEvent = advInterval + advDelay
  1. advInterval要是20ms到10.24s,以0.625ms整数倍增减(根据事件还细分两个要求,在core中提及)
  2. advDelay是0到10ms的位随机数

 ##Connectable Undirected Event Type
广播者发送这样的广播包,和扫描者在同一个通道上面碰到,如果合适就连接,并且发送SCAN_RSP、关闭广播;如果不合适就去下一个频道继续广播。
两个ADV_IND的发送间隔要小于等于10ms。
##Connectable Directed Event Type
广播者发送这样的广播忽略SCAN_REQ,并且PDU内包含了自己和对应设备的地址,只有那个地址的设备可以初始化连接。
这种广播有低占空比和高占空比的区别。
##Scannable Undirected Event Type1
发送这种广播的广播者接收SCAN_REQ。
发送两个PDU的间隔小于等于10ms。
mark:是否可连接?
##Non-connectable Undirected Event Type
发送这种广播的广播者就是很无聊的为了不让连接。

4.4.3 Scanning State
进入扫描状态由Host指定

有两种扫描,passive和active

两个参数:scanWindow和scanInterval,必须小于等于10.24s,前者小于等于后者。

对于不重复的PDU,链路层必须发一个广播报告到HOST,并且包含广播者的设备地址和广播数据(或者扫描响应数据)。

重复的就不需要

##Passive Scanning

处于这个状态的时候,链路层只收包,不发包。

##Active Scanning

这个状态下,链路层必须根据广播PDU的类型监听广播包。

对于ADV_DIRECT_IND PDU 或 ADV_NONCONN_IND PDU,链路层不会发送SCAN_REQ的PDU。

链路层在进入扫描状态的时候必须至少发送一个SCAN_REQ给所有的广播者(广播ADV_IND和ADV_SCAN_IND的)。

扫描者跑一个补偿过程来减少SCAN_REQ的碰撞。

有两个参数,分别是backoffCount和upperLimit。在进入的时候,这两个要写1.

4.4.4 Initiating State

ADV_IND或者ADV_DIRECT_IND符合的话就发送CONNECT_REQ。

发送了CONNECT_REQ之后,链路层离开初始化状态,作为主,进入到连接状态。

4.5 CONNECTION STATE

设备发送CONNECT_REQ或者受到了CONNECT_REQ之后就进入到这个状态

进入以后,链接被认为是创建了(created),但是没有建立起来(established)。

一个连接被建立起来的条件是(established),一旦一个数据通道的包从另外一个设备那边受到。

created和established的区别是链路层的连接超时值是否有使用。(connection supervision timeout)

两个角色,master和slave。

master控制连接事件的定时,同步。

在两个设备地址之间只能有一个连接,一个初始化这不能喝一个已经连接的广播者发送连接请求。

另外,如果一个广播者收到了连接请求的话就应该无视掉另外同样设备发出的连接请求。

 4.5.1 Connection Events

在这个事件中,主从选择收、发数据包,此时连接事件被认为是开放的。

从在收到一个从master那边发来的不理会合法CRC匹配的包的时候会一直发一个包,除非在几次以后根据Section4.5.6有其他做法。

主在收到从发来的不理会合法CRC匹配的包的时候会一直发一个包。

如果主没有收到从发来的包,那么主必须关闭连接事件。

根据4.5.6,两个设备中的任何一个都可以关闭连接事件。

两个参数connInterval和connSlaveLatency。

连接事件的开始称作一个锚点。在锚点上,主必须开始发送一个数据通道PDU到从。

连接事件的开始根据connInterval并且不能有重叠。

主必须确保一个连接事件在另外一个连接事件锚点之前的最少的T_IFS前关闭;同时slave在另外一个锚点收听包

conInterval必须是1.25的倍数,从7.5ms到4.0s,由Host指定。

"从延迟"用于使用在数量缩减的连接事件中。

connSlaveLatency不会造成一个监督超时,并且必须在0-((connSupervisionTimeout / (connInterval*2)) - 1)之间,且不能超过500.

如果在使用了从延迟没有收到包,那就会不适用从延迟,直到收到包为止。

主从都有一个16位的事件计数器(connEventCounter)

4.5.2 Supervision Timeout

这个参数是为了检查链路是否断开,记作 T(LLconnSupervision).

在连接建立(establish)之前,如果连接检查定时器达到6 * connInterval,连接必须被认为是丢失的。

connSupervisionTimeout这个参数指定了两个PDU互发间隔的最大的时间,并且必须是10ms的倍数,处于100ms到32s之间,并且必须大于((1 + connSlaveLatency) * connInterval * 2)。

断开以后链路层就离开了连接状态,转换为就绪状态。

4.5.3 Connection Event Transmit Window

这个东西用于灵活调度连接事件。

有三个参数来决定这个window

开始于一个CONNECT_REQ结束后的transmitWindowOffset + 1.25ms,

transmitWindowSize决定了window的大小,

connInterval用来计算window的偏移最大量。

transmitWindowOffset和transmitWindowSize都由链路层决定。

transmitWindowOffset必须是1.25ms的乘积,范围在0ms - connInterval之间,

transmitWindowSize必须是1.25ms的乘积,并且在小于10ms和connInterval-1.25ms之间。

 4.5.4 Connection Setup – Master Role

在连接状态下,master发送的第一个包决定了第一个连接事件的锚点,还有接下去未来连接事件的timings。

第二个连接事件开始就必须为遵循connInterval。

4.5.5 Connection Setup – Slave Role

Slave负责监听,并且不管CRC匹配,在链接状态下都决定了第一个连接事件的锚点。

 4.5.6 Closing Connection Events

如果在数据通道PDU没有设置MD位的话就会关闭连接事件,如果开启的话就会继续发送包。

如果没master没有从slave那边收到包的话,就会关闭连接事件。

 4.5.7 Window Widening

用于 Slave和master同步连接事件

4.5.8 Data Channel Index Selection

有两件事要做

##Channel Classification

 ##Channel Selection

4.5.9 Acknowledgement and Flow Control

Ack和留空必须用于所有链路层连接。

对于每个连接,链路层有两个参数,都只有1bit:

transmitSeqNum:标记通过链路层发出去的包

nextExpectedSeqNum:用于对面ACK收到的包,或者请求重发。

两个参数要在进入到连接状态的时候设置为0。

4.6 FEATURE SUPPORT

 4.6.1 LE Encryption
• LL_ENC_REQ (Section 2.4.2.4)
• LL_ENC_RSP (Section 2.4.2.5)
• LL_START_ENC_REQ (Section 2.4.2.6)
• LL_START_ENC_RSP (Section 2.4.2.7)
• LL_PAUSE_ENC_REQ (Section 2.4.2.11)
• LL_PAUSE_ENC_RSP (Section 2.4.2.12)
• Encryption Start Procedure (Section 5.1.3.1)
• Encryption Pause Procedure (Section 5.1.3.2)

4.6.2 Connection Parameters Request Procedure
如果支持,必须支持如下:

• LL_REJECT_IND_EXT (Section 2.4.2.18)
• LL_CONNECTION_PARAM_REQ (Section 2.4.2.16)
• LL_CONNECTION_PARAM_RSP (Section 2.4.2.17)
• Connection Parameters Request Procedure (Section 5.1.7)

4.6.3 Extended Reject Indication
• LL_REJECT_IND_EXT (Section 2.4.2.18)

4.6.4 Slave-initiated Features Exchange
• LL_SLAVE_FEATURE_REQ (Section 2.4.2.15)
• LL_FEATURE_RSP (Section 2.4.2.10)

4.6.5 LE Ping

• LL_PING_REQ (Section 2.4.2.19)
• LL_PING_RSP (Section 2.4.2.20)
• LE Ping Procedure (Section 5.1.8)
• LE Authenticated Payload Timeout (Section 5.4)

4.6.6 LE Data Packet Length Extension
• LL_LENGTH_REQ and LL_LENGTH_RSP (Section 2.4.2.21)
• Data Length Update Procedure (Section 5.1.9)

4.6.7 LL Privacy
• LL Privacy (Section 6)

4.6.8 Extended Scanner Filter Policies
• Scanner Filter Policy (Section 4.3.3)

5 LINK LAYER CONTROL
LLCP包括了连接、开始和暂停加密以及其他的一些过程。

5.1.1 Connection Update Procedure
如果master或(和)slave不支持连接参数请求的过程,master可能会通过LL_CONNECTION_UPDATE_REQ PDU来初始化链接参数的更新。

slave不能发这个PDU。

如果master或(和)slave不支持连接参数请求的过程,slave可以使用L2CAP LE信号通道来改变链接参数。

如果master和slave都支持连接参数请求过程的话,slave可能会请求更新一个连接参数。

如果在都支持连接参数请求过程的情况下,为了更新链接参数,master必须使用链接参数请求。如果slave拒绝了,那么master可能使用链接更新过程来更新。

转载于:https://www.cnblogs.com/nflwolfyan/p/5569261.html

BLE - LINK LAYER SPECIFICATION相关推荐

  1. 详解BLE 空中包格式—兼BLE Link layer协议解析

    BLE有几种空中包格式?常见的PDU命令有哪些?PDU和MTU的区别是什么?DLE又是什么?BLE怎么实现重传的?BLE ACK机制原理是什么?希望这篇文章能帮你回答以上问题. 虽然BLE空中包(pa ...

  2. 蓝牙BLE LINK LAYER剖析(二) -- PDU

    DATA FORMAT The Link Layer has only one packet format used for both advertising channel  packets and ...

  3. 蓝牙BLE LINK LAYER剖析(一) -- status and channel

    一.LINK LAYER STATES 二.PHYSICAL CHANNEL

  4. 《计算机网络》第三章:数据链路层(The Data Link Layer)

    Copyright(C)肖文栋教授@北京科技大学自动化学院 内容安排 3.1 Data Link Layer Design Issues数据链路层设计要点 3.2 Error Detection an ...

  5. 计算机网络笔记Part3 数据链路层(Data Link Layer)

    本人计算机网络笔记总目录 计算机网络笔记Part1 概述 计算机网络笔记Part2 物理层(Physical Layer) 计算机网络笔记Part3 数据链路层(Data Link Layer) 计算 ...

  6. SATA系列专题之二: 2.2 Link layer链路层加扰/解扰/CRC解析

    一.故事前传 我们之前说到Link layer的结构,link layer的作用大致可以包括以下几点: Frame flow control CRC的生成与检测 对数据与控制字符的Scrmable/D ...

  7. 【网络】计算机网络-数据链路层 Data Link Layer

    目录 一.帧同步方法 1.字节计数法 2.字符填充的首尾定界法 3.比特填充的首尾标志法

  8. 【考研计算机网络】课堂笔记3 第三章 数据链路层_Data Link Layer

    文章目录: 一:数据链路层的功能 二:组帧 三:差错控制(检错编码)

  9. 数据链路层(2层 Data Link Layer),交换机

    数据来源 1.数据链路层属于2层 2.传输单元:帧         帧格式: 802.3    有线网卡 802.11  无线网卡,无线路由器都支持802.11 802开头的都是国际标准,是由IEEE ...

最新文章

  1. 删除中间结点(直接用来当前节点操作)
  2. 李开复:发明期已过,AI科学家创业需谨慎(附演讲视频)
  3. ORA-00257 解决办法
  4. svd协同过滤java实现_利用 SVD 实现协同过滤推荐算法
  5. TWebBrowser 与 MSHTML(2): 获取 window 对象的时机
  6. Javascript实现导航锚点滚动效果实例
  7. 反馈网络信息改善用户体验
  8. oracle crontab e,Linux运维知识之通过crontab -e编辑生成的定时任务,写在哪个文件中...
  9. 从入门到入土:基于Python|ACK|FIN|Null|Xmas|windows|扫描|端口扫描|scapy库编写|icmp协议探测主机|对开放端口和非开放端口完成半连接扫描|全连接扫描|
  10. Hive压缩存储性能测试
  11. contiki list 链表
  12. 数组元素的填充与替换、排序和复制
  13. VC中调用 Excel 的总结
  14. Win Me安装教程
  15. Python程序中while循环用法详解
  16. 关于使用 MediaPlayer.setLooping(true) 设置循环播放
  17. python解四元一次方程_sympy 解四元一次方程
  18. go: writing stat cache:, permission denied
  19. js距离单位换算_javascript实现的平方米、亩、公顷单位换算小程序
  20. Oracle 报错 28000原因和解决方法

热门文章

  1. android环境搭建—— 工欲善其事必先利其器
  2. Linux基础(十一)--Linux文件查找命令Find详解
  3. [转载] 基于约束放松的自适应Web服务选取方法的研究
  4. Freebsd上使用pf防火墙
  5. 蓝桥杯 ALGO-82 算法训练 输出米字形
  6. HBase数据模型解析和基本的表设计分析
  7. windows主机的linux虚拟机中使用neovim复制、粘贴
  8. Windows XP SP3细节官方详解
  9. 终结篇—用BAT文件删除远程主机系统垃圾文件的方法
  10. VS2005的类设计器(Class Designer)中,如果显示让类继承接口,而不是实现接口?