不想错过我的推送,记得右上角-查看公众号-设为星标,摘下星星送给我
欢迎大家加入2022届数字IC交流群,QQ群号 1060380138
版权声明:本文为CSDN博主「流云IoT」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/m0_37621078/article/details/107724799
前篇博文LE States and Packets[1] 已经介绍了LE 设备在不同通信模式下承担不同的角色,为了方便管理蓝牙设备在多个角色间的切换,链路层使用了状态机来管理蓝牙当前的状态及该状态下支持的通信模式。同时,也介绍了BLE 链路层的两种基本报文格式,以及在不同物理信道上传输时PDU (Protocol Data Unit) 结构的差异。
LE Link Layer States and transport architecture
BLE 设备链路层的报文是上层应用数据的载体,也是通信双方实现无线传输的基础,了解了这些基本报文结构,接下来看通信双方如何传输这些报文。
从BLE 链路层状态迁移图可知,LE 设备可支持三种广播通信模式:
Advertising event types, PDUs used, and allowable response PDUs
先看短报文的广播通信模式,比较基本的广播通信是广播者在3 个固定广播信道上轮流发送广播报文,扫描者在 3 个固定广播信道上依次扫描附近空间中是否有Scannable 广播报文(比如ADV_IND、ADV_SCAN_IND等),如果附近有可扫描广播报文且广播时间在扫描窗口范围内,扫描者就可以接收到广播者发出的广播报文。
下图给出了基本的广播通信过程示意图,扫描者需要在相同的广播信道才能接收到广播报文,因此扫描窗口的时间一般大于一次广播事件(广播者在所有被使用的广播信道上依次发送广播报文的过程,右图给出了广播事件开始与结束的标识,ADV_IND 是一个广播报文)的时间:
Advertising and scanning
两个广播事件之间的间隔时间称为Advertising interval,广播间隔advInterval 支持的范围是 20ms — 10485.76 s 且为0.625 ms 的整数倍(本文展示的是Bluetooth 5.2 的标准,跟Bluetooth 4.x 的标准有所不同)。扫描窗口scanWindow 与扫描间隔scanInterval 时间设置应小于40.96 s,且scanWindow 的值不能大于scanInterval 的值,建议scanWindow 的值不小于advInterval。
Advertising events perturbed in time using advDelay
为了避免多个广播者可能在很长一段时间同时广播造成干扰,两个广播事件之间的时间间隔T_advEvent 会在广播间隔advInterval 的基础上再加上一个0 — 10ms 的随机延时advDelay。这样,即使两个广播者的advInterval 相同,并在相同的信道和时间点上同时发送造成干扰,也会在下一个广播事件因随机延时advDelay 的不同而避开相互干扰。
扫描者支持主动扫描和被动扫描两种模式,前面介绍的扫描者仅侦听并接收广播报文属于被动扫描,主动扫描则是指扫描者可以向特定广播者发送扫描请求报文,广播者收到扫描请求报文后在相同的广播信道上向其回复扫描响应报文(扫描请求与响应过程也会计算在一个Advertising Event 中),扫描者就可以从广播者获得更多的附加信息。主动扫描与被动扫描过程图示如下(右图中的T_IFS 指的是相同信道上两个连续报文之间的时间间隔,值为 150 us):
Active and passive scanning for Legacy Advertising PDU
前篇博客介绍过,Legacy Advertising PDU 可以承载的广播数据最长为31 字节,如果想承载更多的广播数据,可以使用Extended Advertising PDU,不仅单个报文可承载最大254 字节广播数据,还可借助AUX_CHAIN_IND 报文在后面链接更多广播数据。Secondary Advertising PDU 都靠ADV_EXT_IND 报文引导,使用扩展广播报文的主动扫描与被动扫描过程图示如下:
Active and passive scanning for Extended Advertising PDU
注:我们从前篇博文中知道非扩展广播报文的AdvData 最大为31 octets(跟byte 一样都表示8 bits),扩展广播报文的AdvData 最大为254 octets,前面我们也知道非定向广播事件的间隔时间最小为20 ms + 5 ms(随机时延按平均值5 ms 计),可以大概计算非扩展广播报文的最大通信速率为 8 * 31 bytes / 25 ms = 9.92 Kbps,扩展广播报文的最大通信速率为8 * 254 bytes / 25 ms = 81.28 Kbps。如果再算上传输扫描响应报文,最大通信速率可以double,也即分别为19.84 Kbps 和 162.56 Kbps,通信速率依然比较低,且因为单向通信、不加密传输、没有确认应答机制,广播通信属于不可靠通信。
Initiator 侦听到Connectable 广播报文后会发送连接请求报文(比如ADV_DIRECT_IND、ADV_IND等),以便双方建立连接(Initiator 侦听Connectable 广播报文的过程跟Scanner 侦听Scannable 广播报文的过程类似)。如果要建立连接的双方知道对方的Device Address(或MAC Address),广播者可以发送定向广播报文ADV_DIRECT_IND 实现快速连接,如果是首次连接不知道对方Device Address 发送ADV_IND 广播报文也是支持Connectable 的。
Advertising and Initiating
Connectable directed advertising 除了支持前面介绍的low duty cycle mode 外,还支持更快速的high duty cycle mode,这两种模式区别如下:
BLE 低功耗主要是靠大幅降低通信时间,让LE 设备大部分时间都处于睡眠状态实现的。对于面向连接的LE 设备,只在需要传输数据时才建立连接,数据传输完成马上关闭连接并进入睡眠状态。对于连接双方已经知道对方Device Address 的情况,尽快建立连接能降低响应延迟同时降低功耗,因此BLE 为connectable directed advertising提供了high duty cycle mode,让通信双方建立连接的时间可以缩短到3.75 ms 。不过high duty cycle mode 比较耗电,因此该模式持续时间比较短(不超过1.28 秒),若在high duty cycle mode 持续期间未能成功连接,则可以切换到low duty cycle mode 继续尝试连接。
Low duty cycle and High duty cycle mode
前篇博客介绍过,Initiator 使用Primary Physical channel 发送CONNECT_IND 后直接进入Connection State,发起者并不知道对方是否接收到了CONNECT_IND 报文,双方建立连接后在发送CONNECT_IND 报文的LE 1M PHY 上通信(后续可以通过PHY Update procedure 更换到其它PHY)。Initiator 使用Secondary Physical channel 发送AUX_CONNECT_REQ 后,还需要等待对方回复AUX_CONNECT_RSP 报文,接收到对方回复的报文后才进入Connection State,进入连接状态前多了个确认过程,双方建立连接后在发送AUX_CONNECT_REQ 报文的PHY 上通信(可以是LE 1M PHY、LE 2M PHY 或LE Coded PHY),Initiator 向目标设备发送AUX_CONNECT_REQ 并接收响应的过程图示如下:
Connectable directed advertising event
Isochronous Broadcaster 与Synchronized Receiver 之间可以单向传输BIG(Broadcast Isochronous Group,比如音频数据流),每个BIG 由一个或多个BIS(Broadcast Isochronous Stream) 组成,同一BIG 中BIS 的最大数目为 31,同一BIS 的多个数据报文之间具有时间上的承继关系。
在一个BIG 中,每个BIS event 的时间间隔 ISO_Interval (取值范围为 5ms — 4 s)是一样的,同一个BIS event 内多个BIS Data PDU 报文传输(也即Subevent)之间的时间间隔 Sub_Interval (取值范围在MPT + T_MSS 到 ISO_Interval 之间)也是一样的。每个BIG 中一般会包含一个 Control subevent(也即发送BIG Control PDU 报文),主要用来管理BIG 使用的物理信道以及BIG 传输的终止条件。
BIG and BIS events
BIG 的广播参数比较多,Synchronized Receiver 如果想接收BIG 等时同步数据流信息,需要先获得BIGInfo,BIGInfo 包含了BIG 全部的参数信息,格式如下(Fields描述可以参阅Bluetooth Core Specification_v5.2[2],本文就不展开介绍了)。Synchronized Receiver 可以接收AUX_SYNC_IND 报文中的 ACAD (Additional Controller Advertising Data) field 获得BIGInfo,再根据BIGInfo 在特定的Isochronous 信道上侦听BIG 中的BIS 报文。
Format of BIGInfo
AUX_SYNC_IND 报文是在Periodic 信道中传输的,属于Periodic advertising events,每两个AUX_SYNC_IND 报文发送的周期间隔为Periodic Advertising Interval,取值范围是 7.5 ms — 81.91875 s,且为1.25 ms 的整数倍。
periodic advertising events
设备A 向周围广播周期同步报文AUX_SYNC_IND ,并与设备B 建立BIG synchronizes,传输BIS Data Packet 的过程图示如下:
Device B synchronizes with a BIG
注:我们从前篇博文中知道Broadcast Isochronous PDU的Payload 最大为251 octets,前面我们也知道Sub_Interval 的间隔时间最小为MPT + T_MSS,其中MPT 是传输最大BIS 报文花费的时间,从前篇博文可以计算得到MPT = 8 * (2 + 4 + 258 + 3) / 2 + 160 = 1228 us,T_MSS 指的是Minimum Subevent Space 值为 150 us,由此可以大概计算 Isochronous Broadcast 的最大通信速率为 8 * 251 bytes / (1228 + 150) = 1.457 Mbps,完全可以满足音频传输的速率需求,但因为单向通信、没有确认应答机制,等时同步广播通信也属于不可靠通信。
如果周围空间中广播者的数量过多,扫描者可能会扫描到很多数据,但扫描者可能只关心其中的一小部分广播数据(比如只关心来自某些广播者的数据),其它不关心的数据对于扫描者来说相当于垃圾信息。如果扫描者接收并处理所有的数据,到上层再处理甄别这些数据,显然效率较低,不仅平白增加了功耗,还可能增大响应时延,因此有必要在底层链路层就提供一定的报文过滤策略。
BLE 链路层如何实现报文过滤呢?本文开头介绍多种Advertising PDU 可以通过Connectable、Scannable、Directed 三个属性的组合来区分,这些属性实际上也是一种报文过滤机制。其中Directed PDU 主要是通过Device Address field 实现报文过滤的,链路层提供的White List 过滤策略实际上也是通过Device Address field 实现报文过滤的。
White List 是链路层用于报文筛选过滤的Device Address List,其中包含设备地址和设备地址类型(public or random address)。白名单由上层Host 配置,链路层会根据白名单中的条目匹配报文中的设备地址及设备类型字段,如果链路层应用了白名单且设备地址匹配通过才接收并处理相应的报文,设备重置后白名单将清空。
基于白名单,链路层可实现的设备过滤策略如下(下面的过滤策略将忽略定向广播报文):
Advertising filter policy 决定了Advertiser 的链路层怎么处理扫描请求和连接请求,包括如下过滤策略(由Host 根据需求配置,同一时刻只能配置一种):
Scanner filter policy 决定了 Scanner 的链路层怎么处理广播报文或扫描响应报文,包括如下过滤策略(由Host 根据需求配置,同一时刻只能配置一种):
Initiator filter policy 决定了Initiator 的链路层怎么处理广播报文,包括如下过滤策略(由Host 根据需求配置,同一时刻只能配置一种):
Periodic sync establishment filter policy 决定了 Scanner 的链路层在尝试与periodic advertising train 同步时怎么处理广播报文,包括如下过滤策略(由Host 根据需求配置,同一时刻只能配置一种):
前面介绍的广播通信都是单向的,由于单向通信无法获得接收者的确认信息,不能保证广播报文的可靠传输。如果通信双方要进行安全可靠的双向通信,就要建立连接,在数据信道上基于连接进行通信。
前面介绍的Advertiser — Initiator 通信模式,当Initiator 侦听到Connectable 广播报文就会向目标设备发起连接请求,Advertiser 正确响应连接请求后,双方成功建立连接,均进入Connection State。建立连接的双方Master — Slave 就可以在数据信道上进行一对一安全可靠的双向通信。
从LE 链路层支持的报文种类可以看出,LE 设备支持两种连接通信模式:
建立连接的双方长时间维持连接也需要耗电,这与LE 低功耗的目标不符。如果通信双方知道对方的Device Address,可以使用High duty cycle connectable directed advertising 在最短3.75 ms 内快速建立连接。
如果建立连接的时间足够短(也即响应时延足够小),自然不需要长时间维持连接,在双方需要通信时快速建立连接,数据传输完成后及时关闭连接以节省功耗,在下次需要通信时再快速建立连接。像这种每次建立连接后完成一次双向报文传输的过程称为Connection event,两次连接事件之间的时间间隔称为Connection Interval。
Connection events
上图中连接间隔Connection_Interval 的取值范围是7.5 ms — 4 s,且为1.25 ms 的整数倍。连接间隔的设置也有要求,如果连接间隔设置过小会增加功耗,如果连接间隔设置过大会增大响应时延,因此连接间隔支持的最大值只有 4 秒。
但有些设备比如传感器需要的通信频率可能很低,也即需要的连接间隔比较大比如以分钟甚至小时计,如果设置远小于需求的连接间隔将会平白增加功耗、降低续航时间。为了让LE 设备尽可能降低功耗,同时保证将响应时延控制在可接受范围内,BLE 协议允许LE 从设备在没有数据传输需求的情况下跳过一定数目的连接事件,继续保持睡眠以降低功耗,这是LE 从设备一个重要的低功耗设计;在有数据传输需求的情况下不跳过连接事件,以保证及时响应。
LE 从设备跳过一定数目连接事件的过程称为从机延迟Slave Latency,Slave_Latency 的值表示在没有数据传输需求时可以跳过的连接事件的数目,取值范围在0 — 499 之间。当LE 从设备有数据传输需求时,可以不受Slave Latency 的限制,尝试在下一个连接事件到来时建立连接并传输数据,以尽可能降低响应时延。
Slave Latency
由于Slave Latency 可以让LE 从设备跳过一定数目的连接事件,在LE 从设备没有数据传输需求的情况下,真实有效的连接间隔将不再是Connection Interval,而是Effective Connection Interval = Connection_Interval × (1 + Slave_Latency)。
双方维持的连接可能会由于各种原因而中断,比如设备超出范围、受到严重干扰、电源故障等,而且这些可能是在没有任何事先通知的情况下发生的,因此有必要监测连接状态。我们知道TCP 连接保活功能就是通过周期性发送保活探测报文来监测连接双方是否仍处于活动状态,如果其中一方由于某些原因处于非活动状态,另一方将关闭该连接并释放相应的资源。
BLE 也采用了类似的机制,通过一个TLLconnSupervision计时器来监测双方的连接状态,当发生有效连接事件时(也即双方成功建立连接并有报文传输)将该计时器复位。在建立连接之前,如果TLLconnSupervision 达到 6 * Connection_Interval(或者TCISconnSupervision 达到 6 * ISO_Interval)则判断连接建立失败,停止继续尝试建立连接。
在连接成功后,如果TLLconnSupervision 达到Connection supervision timeout(可由Host 配置该值),则判断当前连接已丢失,通信双方终止该连接并释放相应资源。Connection_supervision_timeout 的取值范围是 100 ms — 32 s(应为10 ms 的整数倍),表示两个成功连接事件之间允许的最长时间间隔,该值建议设置为大于 2 * Connection_Interval × (1 + Slave_Latency)。根据Connection_supervision_timeout 的配置值,可以缩小Slave_Latency 的取值范围,也即上限为 (Connection_supervision_timeout / (2 * Connection_Interval)) - 1 和 500 中较小的的整数。
当Master 发出/Slave 收到连接请求报文后,双方就自动进入Connection State,开始在数据信道上收发报文,双方连接建立过程的时序如下:
Master and Slave Connection setup
Master 发出连接请求报文CONNECT_IND 后,会在(transmitWindowDelay + transmitWindowOffset) 到 (transmitWindowDelay + transmitWindowOffset + transmitWindowSize) 这个发送时间窗口transmit window 内向Slave 发送第一个Packet (M->S)。同理,Slave 接收到连接请求报文CONNECT_IND 后,也会在相应的时间窗口transmit window 内尝试接收第一个Packet (M->S)。
Master 发出第一个Packet (M->S) 后,将以此为起点Anchor point,以Connection_Interval 为周期,接着发送后续的Packet (M->S) 并接收来自Slave 的Packet (S->M),收发一个或多个Packet 的过程称为Connection event。同理,Slave 接收到第一个Packet (M->S)后(如果没有收到在下一个连接周期继续尝试接收),也以此为起点Anchor point,以Connection_Interval 为周期,接收后续的Packet (M->S) 并向Master 发送自己的Packet (S->M)。
了解了Master 与Slave 建立连接通信的过程,再回顾前篇博文谈到的连接参数,就比较容易理解了。
CONNECT_IND Payload and LLData fields
LLData Fields | Description |
---|---|
AA | ACL connection’s Access Address,不同的连接有不同的值,可以通过接入地址来区分不同的连接。 |
CRCInit | 用于CRC 计算的一个初始值,由Link Layer随机生成。 |
WinSize | 也即transmitWindowSize,最小值是 1.25 ms,最大值是 (Connection_Interval - 1.25 ms) 与 10 ms 中的较小者,且为1.25 ms 的整数倍。 |
WinOffset | 也即transmitWindowOffset,取值范围是 0 — Connection_Interval,且为1.25 ms 的整数倍。 |
Interval | 也即Connection_Interval,取值范围是7.5 ms — 4 s,且为1.25 ms 的整数倍。 |
Latency | 也即Slave_Latency,最小值为0,最大值为(Connection_supervision_timeout / (2 * Connection_Interval)) - 1 和 500 中较小的的整数。 |
Timeout | 也即Connection_supervision_timeout,取值范围在 100 ms — 32 s之间,且为10 ms 的整数倍,建议大于 2 * Connection_Interval × (1 + Slave_Latency)。 |
ChM | Channel Map,用于标识当前使用和未使用的Physical Channel。 |
Hop | HopIncrement,和ChM一起决定了数据传输过程中的跳频算法,该值为 5 — 16 之间的一个随机值。 |
SCA | master’s Sleep Clock Accuracy,用于定义最差的Master睡眠时钟精度,更高精度的时钟可以提高通信的稳定性和响应及时性。 |
CONNECT_IND PDU 中的ChM 与Hop field都与BLE 的跳频算法或者信道选择算法相关,BLE 链路层为connection events提供的信道选择方法如下(BLE 还为 periodic advertising events 和 isochronous event 提供了Channel Selection algorithm #2,也即ACL 连接事件可以使用两种信道选择算法中的任何一种,周期同步事件和 ISO 等时事件只能使用第二代信道选择算法,CSA #2还可以为每个子事件生成信道索引,整个计算过程比较复杂,本文只介绍CSA #1 的原理,想详细了解CSA #2 可以参考Core_v5.2—page2988):
Block diagram of Channel Selection algorithm #1 & #2
Channel Selection algorithm #1 主要分为两个步骤:
前篇博文Data Physical Channel PDU[3] 部分已经介绍了连接成功建立后的报文传输过程,如何通过NESN 和SN field 实现应答确认与流控机制,如何通过MD field 主动结束当前连接事件,本文就不再赘述了。值得一提的是,LL Data PDU 在通常情况下支持的最大载荷只有27 octets,跟前面介绍的广播报文类似,只有在启用扩展特性后LL Data PDU 的最大载荷才会达到251 octets。
Valid ranges for data PDU length management parameters
注:从上面的连接通信过程可知,BLE 面向连接的通信速率是由Connection_Interval 和每个Connection Event 中传输的数据量决定的。很多平台为了保证Master 的性能,会限制Connection_Interval 的最小值,比如IOS 限制Connection_Interval_Min >= 20ms,这里取Connection_Interval = 25 ms 作为通信速率估算参数。每个Connection Event 发送报文的时间窗口大小为transmitWindowSize,这里取最大值 10 ms,看在该时间窗口内能发送多少有效数据,非扩展LE Data Packet 最大载荷为27 octets,扩展LE Data Packet 最大载荷为251 octets,采用默认的LE 1M PHY 报文格式,在10 ms 内可以传输的非扩展数据报文数目为 10 * 1000 / (336 + 160 + 150) = 15,在10 ms 内可以传输的扩展数据报文数目为10 * 1000 / (2128 + 160 + 150) = 4,考虑到在transmitWindowSize 内不只是发送报文,还要为接收报文留出时间,因此将上面的数据都减半。由此可计算出ACL 传输非扩展数据报文的最大速率为 8 * 8 pcs * 27 bytes / 25 ms = 69.12 Kbps,ACL 传输扩展数据报文的最大速率为 8 * 2 pcs * 251 bytes / 25 ms = 160.64 Kbps,如果采用LE Coded PHY 报文格式传输速率更低。
Connected Isochronous 通信跟前面介绍的Broadcast Isochronous 通信有点类似,不同的是Connected Isochronous 是面向连接的双向通信,在Master 与 Slave 之间可以双向传输CIG(Connected Isochronous Group,比如音频数据流)。每个CIG 由一个或多个CIS(Connected Isochronous Stream) 组成,同一CIG 中CIS 的最大数目为 31,同一CIS 的多个数据报文之间具有时间上的承继关系。
CIG 在创建其第一个CIS 时就存在了,其所有组成CIS 都应具有相同的Master。Host 为每个CIG 分配一个标识符CIG_ID,同时为其每个CIS 分配一个标识符CIS_ID,不同的CIS 必须具有不同的CIS_ID,如果某个CIS 被终止其CIS_ID 可以被复用。
在一个CIG 中,每个CIS event 的时间间隔 ISO_Interval (取值范围为 5ms — 4 s)是一样的,但每个CIS anchor point 相对CIG synchronization point 的 CIS_Sync_Delay 可能不同。CIS_Sync_Delay和CIG_Sync_Delay 是Master 链路层向Slave 链路层提供的时序参数,用于上层应用层实现等时数据流的同步。
每个CIS event 内多个Subevent(也即CIS Data PDU 报文传输)之间的时间间隔Sub_Interval (取值范围在SE_Length 到 ISO_Interval 之间,SE_Length 值为MPTM + T_IFS + MPTS + T_MSS,其中T_IFS 和T_MSS 的值均为150 us)也是一样的。通过适当的设置Sub_Interval 的值和不同CIS anchor point 之间的间距,CIG 中的CIS 可以顺序排列或交错排列,排列关系如下图示:
CIG event and CIS event
CIG 的连接参数比较多,如何为创建CIG 及其组成的CIS 配置参数呢?回顾BIG 的广播参数BIGInfo 是借助Periodic advertising 中的AUX_SYNC_IND 报文传输的,接收者获得BIGInfo 信息后就可以与广播者同步BIG广播参数,然后接收BIG 中的BIS 等时同步数据流了。CIG 借助什么报文传输相关的连接参数呢?
Connected Isochronous 通信需要连接双方同步CIG 连接参数,前面我们已经建立了Master 与Slave 之间的连接,完全可以借助前面介绍的Asynchronous Connection 传输CIG 连接参数,待连接双方完成CIG 连接参数同步后,就可以开始传输CIG 等时同步数据流了。因此,每个CIG 都跟一个ACL 是相关联的,CIG 中连接参数的同步与更新需要借助ACL 完成传输,具体来说就是借助LL Control PDU 报文完成连接双方CIG 参数同步的。LL Control PDU 中跟CIG/CIS 相关的控制报文总类展示如下,可以看到这些控制报文中包含了前面介绍的CIG和CIS 相关的所有参数:
LL Control PDU about CIG/CIS
设备A 与设备B 之间在建立ACL 连接后,创建CIS 并传输CIS Data PDU 的过程图示如下:
Device A establishes a CIS with a slave
注:我们从前篇博文中知道Connected Isochronous PDU的Payload 最大为251 octets,前面我们也知道Sub_Interval 的间隔时间最小为SE_Length = MPTM + T_IFS + MPTS + T_MSS = 2 * 1228 + 150 + 150 = 2756 us,由此可以大概计算Isochronous Connection 的最大通信速率为 8 * 251 bytes / 2756 us = 728.6 Kbps,再借助LC3 音频编码方案,也可以传输清晰的音频流,如果只是单向听歌,还可以进一步提高Isochronous Connection 的最大通信速率。
连接建立之后,Master或Slave可以借助Link Layer Control Protocol (LLCP),通过LL Control PDU,对连接进行管理控制,LL Control Protocol 支持的控制报文种类如下:
LL Control PDU opcodes
LL Control PDU 支持的控制方法描述如下:
Connection update
Slaver-initiated / Master-initiated Connection Parameters Request procedure
Channel map update
Disconnect from master / Slave
Start and restart LE Encryption procedure
Master / Slave Feature Exchange procedure
Master / Slave Version Exchange procedure
Successful LE Ping
Data length update
Master-initiated / Slave-initiated PHY Update procedure
Requesting minimum number of used channels
Master or slave-initiated Constant Tone Extension Request procedure
Periodic Advertising Sync Transfer by scanner / advertiser
Device A requests SCA from Device B
Device A establishes a CIS with a slave
Device A Terminates an established CIS
LL Power Change Indication procedure when device adjusts TX power autonomously
[1]
LE States and Packets: https://blog.csdn.net/m0_37621078/article/details/107697019
[2]
Bluetooth Core Specification_v5.2: https://www.bluetooth.com/specifications/bluetooth-core-specification/
[3]
Data Physical Channel PDU: https://blog.csdn.net/m0_37621078/article/details/107697019
[4]
TLS 1.2/1.3 加密原理: https://blog.csdn.net/m0_37621078/article/details/106028622
[5]
《Bluetooth Core Specification_v5.2》: https://www.bluetooth.com/specifications/bluetooth-core-specification/
[6]
《BLE技术揭秘》: http://doc.iotxx.com/BLE技术揭秘
[7]
《蓝牙协议分析》: http://www.wowotech.net/sort/bluetooth
END