BLE - LINK LAYER SPECIFICATION
一、 BLE控制器链路层概述
蓝牙链路层(Link Layer)有五个状态:就绪、广播、扫描、初始化、链接。
- 连接状态下,可以同时为主和从
- 连接状态下,处于从可能支持多个连接。
- 连接状态下,处于主可能支持多个连接。
- 连接状态下,链路层和另外一个链路层只能保持最多一个链接。
- 分为广播通道(37-39)和数据通道(0-36)。
- 两个设备通信要在同一个物理通道上,所以在一个时间要在同一个RF通道上。
- 通道有限,为了避免碰撞,每一个物理通道上的传输都以一个接入码为开端。
- 每一个链路层都在一个给定的时间使用一个物理通道。
二、空中包
#######################################################
preamble :用于同步
PDU Type有八种
这里TxAdd表示是公共(TxAdd = 0)或者随机(TxAdd = 1)的蓝牙地址。
扫描PDU
AA:接入地址
#######################################################
4 Air Interface Protocol
根据地址筛选设备
白名单有一个白名单列表,包含了设备地址和地址类型(公共或者随机)
如果不是使用直接广播方式的话,筛选策略应该被忽略,否则应该使用其中一种
- 链路层从白名单中处理扫描和链接请求
- 链路层直接处理所有扫描和连接请求
- 链路层从所有设备中处理扫描请求,从白名单中处理连接请求
- 链路层从所有设备中处理连接请求,从白名单中处理扫描请求
- 链路层从白名单中处理广播包,可连接的直接广播包不包含在扫描设备地址会被忽略。
- 链路层从所有包中处理广播包,可连接的直接广播包不包含在扫描设备地址会被忽略。
如果支持拓展的扫描筛选策略,也可能支持
- 链路层从白名单中处理广播包,可连接的直接广播包z中的initA是一个可分解私有地址就不会被忽略。
- 链路层从所有包中处理广播包,可连接的直接广播包z中的initA是一个可分解私有地址就不会被忽略。
4.3.4 Initiator Filter Policy
- 链路层从白名单中的所有设备处理广播包。
- 链路层忽略白名单并且从一个指定的广播包中处理可连接包。
4.4 NON-CONNECTED STATES
4.4.1 Standby State
链路层的默认状态,必须不收不发,可以进入广播、扫描和初始化状态。
4.4.2 Advertising State
在这个状态,链路层发送广播PDU,处于广播事件。
四种广播事件
- a connectable undirected event
- a connectable directed event
- a non-connectable undirected event
- 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 |
- advInterval要是20ms到10.24s,以0.625ms整数倍增减(根据事件还细分两个要求,在core中提及)
- advDelay是0到10ms的位随机数
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相关推荐
- 详解BLE 空中包格式—兼BLE Link layer协议解析
BLE有几种空中包格式?常见的PDU命令有哪些?PDU和MTU的区别是什么?DLE又是什么?BLE怎么实现重传的?BLE ACK机制原理是什么?希望这篇文章能帮你回答以上问题. 虽然BLE空中包(pa ...
- 蓝牙BLE LINK LAYER剖析(二) -- PDU
DATA FORMAT The Link Layer has only one packet format used for both advertising channel packets and ...
- 蓝牙BLE LINK LAYER剖析(一) -- status and channel
一.LINK LAYER STATES 二.PHYSICAL CHANNEL
- 《计算机网络》第三章:数据链路层(The Data Link Layer)
Copyright(C)肖文栋教授@北京科技大学自动化学院 内容安排 3.1 Data Link Layer Design Issues数据链路层设计要点 3.2 Error Detection an ...
- 计算机网络笔记Part3 数据链路层(Data Link Layer)
本人计算机网络笔记总目录 计算机网络笔记Part1 概述 计算机网络笔记Part2 物理层(Physical Layer) 计算机网络笔记Part3 数据链路层(Data Link Layer) 计算 ...
- SATA系列专题之二: 2.2 Link layer链路层加扰/解扰/CRC解析
一.故事前传 我们之前说到Link layer的结构,link layer的作用大致可以包括以下几点: Frame flow control CRC的生成与检测 对数据与控制字符的Scrmable/D ...
- 【网络】计算机网络-数据链路层 Data Link Layer
目录 一.帧同步方法 1.字节计数法 2.字符填充的首尾定界法 3.比特填充的首尾标志法
- 【考研计算机网络】课堂笔记3 第三章 数据链路层_Data Link Layer
文章目录: 一:数据链路层的功能 二:组帧 三:差错控制(检错编码)
- 数据链路层(2层 Data Link Layer),交换机
数据来源 1.数据链路层属于2层 2.传输单元:帧 帧格式: 802.3 有线网卡 802.11 无线网卡,无线路由器都支持802.11 802开头的都是国际标准,是由IEEE ...
最新文章
- 删除中间结点(直接用来当前节点操作)
- 李开复:发明期已过,AI科学家创业需谨慎(附演讲视频)
- ORA-00257 解决办法
- svd协同过滤java实现_利用 SVD 实现协同过滤推荐算法
- TWebBrowser 与 MSHTML(2): 获取 window 对象的时机
- Javascript实现导航锚点滚动效果实例
- 反馈网络信息改善用户体验
- oracle crontab e,Linux运维知识之通过crontab -e编辑生成的定时任务,写在哪个文件中...
- 从入门到入土:基于Python|ACK|FIN|Null|Xmas|windows|扫描|端口扫描|scapy库编写|icmp协议探测主机|对开放端口和非开放端口完成半连接扫描|全连接扫描|
- Hive压缩存储性能测试
- contiki list 链表
- 数组元素的填充与替换、排序和复制
- VC中调用 Excel 的总结
- Win Me安装教程
- Python程序中while循环用法详解
- 关于使用 MediaPlayer.setLooping(true) 设置循环播放
- python解四元一次方程_sympy 解四元一次方程
- go: writing stat cache:, permission denied
- js距离单位换算_javascript实现的平方米、亩、公顷单位换算小程序
- Oracle 报错 28000原因和解决方法
热门文章
- android环境搭建—— 工欲善其事必先利其器
- Linux基础(十一)--Linux文件查找命令Find详解
- [转载] 基于约束放松的自适应Web服务选取方法的研究
- Freebsd上使用pf防火墙
- 蓝桥杯 ALGO-82 算法训练 输出米字形
- HBase数据模型解析和基本的表设计分析
- windows主机的linux虚拟机中使用neovim复制、粘贴
- Windows XP SP3细节官方详解
- 终结篇—用BAT文件删除远程主机系统垃圾文件的方法
- VS2005的类设计器(Class Designer)中,如果显示让类继承接口,而不是实现接口?