蓝牙规范-Vol 6:低功耗控制器 Part B 链路层规范 章节4.4-4.5 空口协议-2

文章目录

4.4 不可链接状态

4.4.1 待机态

待机状态为链路层默认状态,链路层在待机状态不会发送或接收数据包,链路层可以通过进入广播态,扫描态,发起态,同步态或同步广播态来离开待机态。

4.4.2 广播态

链路层可以直接通过Host来进入广播态,当处于广播态时,链路层在广播事件,定期广播事件或者两个事件中发送广播PDUs。

每个广播事件由一个或多个广播PDUs使用主要广播广播信道索引进行发送,广播事件在广播PDU在每一个用到的主要广播信道索引处(见Section 4.4.2.1)都发送完成后进行关闭。广播事件中有些PDUs可能会被忽略,导致广播事件较晚开始或提前结束或整个广播事件被忽略以适应其他的功能。

两个连续的广播事件的事件间隔定义见Section 4.4.2.2
广播事件可以是以下几种类型之一:

  • 可链接可扫描非定向广播事件
  • 可链接的非定向广播事件
  • 可链接的定向广播事件
  • 不可扫描不可链接的非定向广播事件
  • 不可扫描不可连接的定向广播事件
  • 可扫描的非定向广播事件
  • 可扫描的定向广播事件

每一个广播事件中,用到的每一个主要广播信道索引最多只能发送一个广播PDU。除非特别指出,主要广播信道索引可以以任意顺序使用,这个顺序在不同的事件中可以不同。

广播事件类型决定了允许的响应PDUs,表4.2指出了每种广播事件允许的响应类型。可链接可扫描的非定向事件,可链接的非定向事件,可链接的定向事件统称为可链接事件,剩下的事件统称为不可连接事件。可链接可扫描的非定向事件,可扫描的非定向事件,可扫描的定向事件统称为可扫描事件,剩下的称为不可扫描事件。
在这里插入图片描述
如果广播者收到一个广播事件没有明确允许的PDU,则需要忽略掉。如果没有收到PDU或收到的PDU被忽略,则广播者需要在下一个用到的首要广播信道索引处发送广播PDU或结束广播事件。

4.4.2.1 广播信道索引选择

广播事件使用3个预定义的首要广播物理信道,首先广播信道索引可以选择用或者不用。

对于AUX_ADV_INDAUX_CHAIN_IND PDUs,AuxPtr字段的channel index子字段中使用的次要广播信道索引是具体实现的。建议使用足够多的信道来避免信道冲撞。

每一个定期广播都有一个16位的事件计数器(paEventCounter),计数器的初始值是特定实现的。这个计数器在每一个定期广播间隔进行加1(见Section 4.4.2.3),无论AUX_SYNC_IND PDU是否真的被传输,paEventCounter在达到0xFFFF以后切换位0x0000,AUX_SYNC_IND PDUs应使用带有这个计数器的信道选择算法#2(见Section 4.5.8.3)。

链路层使用Host选择的首要或次要广播信道索引,所使用的首要和次要广播信道索引在进入广播态时生效。链路层不需要使用所有的Host标注为unknow的次要信道。

4.4.2.2 广播事件

广播事件定义为一个或多个广播PDUs在首要广播物理信道上发送,每一个用到的广播信道索引一个广播事件最多可以发送一个PDU,通常PDU在每一个广播事件中会在所有用到的广播信道索引处进行发送,广播事件可以在收到CONNECT_IND或者发送SCAN_RSP的时候进行提前关闭。

在次要广播物理信道上发送的广播包不是广播事件的一部分,使用ADV_EXT_IND PDU的广播事件可能也是扩展广播事件的一部分,所有的在同一个广播事件的包含AuxPtr字段的ADV_EXT_IND PDUs都需要指向同一个AUX_ADV_IND包。

4.4.2.2.1 广播间隔

对于所有在低占空比模式下应用的非定向广播事件或可连接的定向广播事件,同一个广播序列的两个连续广播事件(T_advEvent)的开始之间的时间间隔(见Section 4.4.2.10)计算如下:

T_advEvent = advInterval + advDelay

广播间隔(advinterval)为0.625ms的整数倍,范围为20ms到10485.759375s

advDelay为一个0ms-10ms之间的一个伪随机值,由链路层为每一个连接事件生成。

如图4.5所示,使用advDelay对广播事件的事件进行微调,以降低时间冲突:
在这里插入图片描述

4.4.2.2.2 扩展广播事件

扩展广播事件在广播事件的起始位置开始,包含广播事件的PDUs以及他们的附属子集。扩展广播事件在最后一个这样的PDU后面结束。

多个扩展广播事件可能彼此互相重叠,这可能发生在多个广播事件的包含AuxPtr字段ADV_EXT_IND PDUs指向同一个AUX_ADV_IND包,或不同的广播事件插入到ADV_EXT_IND PDUsAUX_ADV_IND PDU.之间。

T_advEvent, advIntervaladvDelaySection 4.4.2.2.1具有相同的含义。

图4.6扩展广播事件重叠的示例:
在这里插入图片描述
辅助广播段开始于扩展广播事件的第一个AUX_ADV_IND PDU,在扩展广播事件结束的时候结束(一个辅助广播段可以属于多个扩展广播事件)。同一个广播的两个辅助广播段不能互相重叠。

图4.7展示了辅助广播段属于多个扩展广播事件的情况的示例:
在这里插入图片描述
广播者不应该把放在辅助广播段内的PDUs分隔开,这样两个PDUs就会在同一个接收窗口内。如果广播者发送一个带有偏移Tms的AuxPtr字段的PDU,那么在这个PDU的辅助包开始后的2.5*T us内,不应该在与辅助包相同的射频信道上传输任何其他数据包。

4.4.2.2.3 定期广播事件

当使用可链接可扫描的非定向广播事件类型时,链路层会发送广播标志(ADV_IND PDUs)。

可链接可扫描的非定向广播事件类型允许扫描者或发起者使用扫描请求或连接请求来响应,扫描者可以通过发送扫描请求(SCAN_REQ PDU)来获取广播者的更多的信息。发起者可以通过发送连接请求(CONNECT_IND PDU)来请求链路层进入连接态。

链路层需要在扫描者或发起者发起请求的同一个首要广播信道索引处进行监听。

如果广播者收到了它的广播过滤策略允许的来自从扫描者的包含设备地址的SCAN_REQ PDU,则它需要在同样的首要广播信道索引处回复一个SCAN_RSP PDU。在SCAN_RSP PDU发送以后,或它的广播过滤策略不允许处理SCAN_REQ PDU的时候,广播者需要切换到下一个用到的首要广播信道索引来发送另一个ADV_IND PDU或关闭广播事件。

如果广播者收到了它的广播过滤策略允许的来自发起者的包含设备地址的CONNECT_REQ PDU,则链路层需要推出广播态并以Section 4.5.5中定义的slave角色进入连接态。如果广播过滤策略不允许处理接收到的CONNECT_REQ PDU,则广播者需要切换到下一个用到的首要广播信道索引来发送另一个ADV_IND PDU或关闭广播事件。

在一个广播事件中连续两个ADV_IND PDU的起始位置的时间间隔需要小于或等于10ms,广播事件需要在广播间隔内结束。

图4.9展示了使用所有的首要广播信道索引,并且没有收到SCAN_REQ PDUCONNECT_IND PDU的广播事件的情况:
在这里插入图片描述
图4.10和4.11分别展示了使用所有的首要广播索引信道,并且在这期间收到了SCAN_REQ PDU和发出SCAN_RSP PDU的情况:
在这里插入图片描述
在这里插入图片描述
图4.2展示了在第二个首要广播信道索引处收到CONNECT_IND PDU的广播事件的情况:
在这里插入图片描述
如果链路层加密已经启用,那么也应遵循Section 6.2.1的要求。

4.4.2.4 可连接的定向广播事件类型

当使用可链接的定向广播事件类型时,链路层发送定向广播标志。

可链接的定向广播事件类型允许发起者应答因此广播者和发起者都可以进入连接态。

可链接的定向广播事件类型可以使用ADV_DIRECT_IND PDU(见Section 4.4.2.4.1到4.4.2.4.3)或ADV_EXT_IND PDU(见Section 4.4.2.4.4)。可链接的定向广播事件中使用这两种PDU类型中的一种。

如果使用了链路层加密,则也应该符合Section 6.2.2中的要求。

4.4.2.4.1 使用ADV_DIRECT_IND的可链接定向广播

当在LE Coded PHY上使用可连接的定向广播事件类型时,这个过程不应该被使用。

使用ADV_DIRECT_IND的可连接的定向广播事件类型允许发起者在首要广播物理信道上使用连接请求来进行应答以建立ACL连接。

ADV_DIRECT_IND PDU同时包含发起者的设备地址和广播者的设备地址,只有符合发起者的设备地址的发起者才可以通过发送CONNECT_IND PDU给广播者来建立一个ACL连接。

在广播者发送每一个ADV_DIRECT_IND PDU之后,广播者需要在同一个首要广播信道索引上监听CONNECT_IND PDUs,任何收到的SCAN_REQ PDUs都要被忽略掉。

如果广播者收到的CONNECT_iND PDU包含它的设备地址并且发起者的设备地址在ADV_DIRECT_IND PDU中,则链路层需要退出广播态并以Section 4.5.5中定义的slave角色进入连接态。

其他情况下,广播者需要使用下一个使用到的首要广播信道索引去发送另一个ADV_DIRECT_IND PDU或关闭这个广播事件。

可连接的定向广播可以用在高占空比或地占空比模式,这在下面的两个章节中会进行描述。低占空比模式的可链接定向广播用来
需要与特定的设备进行重连,但对时间没有要求或不知道主设备是否在范围内 的情况下使用。高占空比模式的可链接定向广播用来在需要快速建立连接的场景中使用(例如重连)。

注意:高占空比模式的可链接定向广播是一种功率和带宽密集的广播方式,仅在需要进行快速连接的场景中使用。

4.4.2.4.2 低占空比模式的可链接定向广播

低占空比模式的可链接定向广播中,一个广播事件中连续两个ADV_DIRECT_IND PDU的间隔时间需要小于或等于10ms,广播事件需要在广播间隔内结束。

图4.13展示了使用所有首要广播信道索引并且没有收到CONNECT_IND PDUs的广播事件的情况:
在这里插入图片描述
图4.14展示了使用所有首要广播信道索引并且在第二个首要广播信道索引处收到CONNECT_IND PDUs的广播事件的情况:
在这里插入图片描述

4.4.2.4.3 高占空比模式的可链接定向广播

高占空比模式的可链接定向广播中,一个广播事件中连续两个在同一个广播信道索引处发出的ADV_DIRECT_IND PDU的间隔时间需要小于或等于3.75ms

链路层需要在进入广播模式以后的不超过1.28S内退出广播模式。

链路层需要从使用的最低的首要广播信道索引处开始广播事件并依次移动到其他的用到的首要广播信道索引处。

图4.15展示了在使用所有的首要广播物理信道的情况下,在两个没有CONNECT_IND PDU的广播事件中的5个ADV_DIRECT_IND PDUs的序列的情况:
在这里插入图片描述

4.4.2.4.4 使用ADV_EXT_IND的可链接定向广播事件类型

这个过程在可连接的定向广播事件类型用于LE Coded PHY上时使用。

使用ADV_EXT_IND的可连接的定向广播事件类型允许发起者在首要广播物理信道上使用连接请求来进行应答以建立ACL连接。

ADV_EXT_IND PDU中,AdvMode字段需要被设置为可链接,ADI字段也需要有并且PDU中不能包含AdvATargetA字段。ADV_EXT_IND PDUsAuxPtr字段需要指向AdvMode字段为可链接的AUX_ADV_IND PDU,在AUX_ADV_IND PDUAdvA,TargetAADI字段都要存在,并且ADV_EXT_IND PDU要和AUX_ADV_IND PDUADI字段相同。

在广播者发送每一个涉及到这个事件的AUX_ADV_IND PDU之后,广播者需要在同一个次要广播信道索引上监听AUX_CONNECT_REQ PDUs,任何收到的AUX_SCAN_REQ PDUs都要被忽略掉。

如果链路层加密没有使能,广播者收到的AUX_CONNECT_REQ PDU中包含它的设备地址并且发起者的设备地址在AUX_ADV_IND PDU中,它需要在同一个次要广播信道索引处回复一个包含这些地址的AUX_CONNECT_RSP PDU,如果使能了链路层加密,参考Section 6.2.2。在AUX_CONNECT_RSP PDU发出以后,链路层需要退出广播态并以Section 4.5.5中定义的slave角色进入连接态。在次要广播物理信道上收到的任何AUX_SCAN_REQ PDUs都要被忽略。

在一个广播事件中,连续两个可链接的定向广播的ADV_EXT_IND PDUs的时间间隔需要小于或等于10ms,广播事件需要在广播间隔内结束。

次要信道的信道索引SAdv_idx包含在ADV_EXT_IND PDUAuxPtr字段。

图4.16展示了没有收到AUX_CONNECT_REQ PDU的广播事件:
在这里插入图片描述
图4.17展示了使用可链接的定向ADV_EXT_IND广播PDUs并且在次要广播信道索引处收到AUX_CONNECT_REQ PDU的广播事件情况:
在这里插入图片描述

4.4.2.5 可扫描的非定向广播事件类型

当使用可扫描的非定向广播事件类型时,链路层发送可扫描的非定向广播标志(ADV_SCAN_IND或可扫描的非定向ADV_EXT_IND PDUs)。

可扫描的非定向广播事件使用ADV_SCAN_IND可扫描的非定向ADV_EXT_IND PDUs,但是不能同时使用。

如果使用了链路层加密,则也应该符合Section 6.2.3中的要求。

4.4.2.5.1 使用ADV_SCAN_IND的可扫描非定向广播事件类型

可扫描非定向广播事件类型允许扫描者使用SCAN_REQ PDU来响应以获取广播者的更多附加信息。

链路层需要在同一个首要广播信道索引处监听来自扫描者的请求,任何CONNECT_IND PDUs都要被忽略。

广播者收到的来自它的广播过滤策略允许的扫描者的SCAN_REQ PDU中包含它的设备地址,它需要在同一个次要广播信道索引处回复一个SCAN_RSP PDU,在SCAN_RSP PDU发出以后或者当广播过滤策略不允许处理SCAN_REQ PDU时,广播者需要使用下一个用到的首要广播信道索引来发送另一个ADV_SCAN_IND PDU或关闭广播事件。

在一个广播事件的连续两个ADV_SCAN_IND PDU之间的时间间隔需要小于等于10ms,广播事件需要在广播间隔以内结束。

图4.18展示了使用了所有的首要广播物理信道,并且没有收到SCAN_REQ PDU的广播事件结构示意:
在这里插入图片描述
图4.19和图4.20分别展示了使用了所有的首要广播物理信道,并且收到了SCAN_REQ PDU和发出SCAN_RSP PDU的广播事件示意图:
在这里插入图片描述

4.4.2.5.2 使用ADV_EXT_IND的可扫描非定向广播事件类型

使用ADV_EXT_IND的可扫描非定向广播事件类型允许任何扫描者通过发送扫描请求来进行响应以在次要广播物理信道上获取广播者的更多附加信息。

ADV_EXT_IND PDU中,AdvMode字段需要被设置为可链接,ADI字段也需要有并且PDU中不能包含AdvATargetA字段。ADV_EXT_IND PDUsAuxPtr字段需要指向AdvMode字段为可链接的AUX_ADV_IND PDU,在AUX_ADV_IND PDUAdvA,TargetAADI字段都要存在,并且ADV_EXT_IND PDU要和AUX_ADV_IND PDUADI字段相同。扫描者可以使用AUX_SCAN_REQ PDUADV_EXT_IND PDU指向的AUX_ADV_IND PDU相同的次要广播物理信道上发送扫描请求。

在广播者发送每一个涉及到这个事件的AUX_ADV_IND PDU之后,广播者需要在同一个次要广播信道索引上监听来自扫描者的AUX_SCAN_REQ PDUs,任何收到的AUX_CONNECT_REQ PDUs都要被忽略掉。

如果广播者收到的来自它的广播过滤策略允许的扫描者的AUX_SCAN_REQ PDU中包含它的设备地址,它需要在下一次广播事件开始之前,在同一个次要广播信道索引处回复一个AUX_SCAN_RSP PDU,在AUX_SCAN_RSP PDU发出以后,或者当广播过滤策略禁止处理AUX_SCAN_REQ PDU时,广播事件需要被关闭,在次要广播物理信道上收到的任何AUX_CONNECT_REQ PDUs都要被忽略。

在一个广播事件中,连续两个可链接的定向广播的ADV_EXT_IND PDUs的时间间隔需要小于或等于10ms,广播事件需要在广播间隔内结束。

图4.21展示没有收到AUX_SCAN_REQ PDU的广播事件结构示意:
在这里插入图片描述
图4.22 展示了在次要广播物理信道上接收到了AUX_SCAN_REQ PDU并发送了AUX_SCAN_RSP PDU的广播事件的结构:
在这里插入图片描述

4.4.2.6 不可链接不可扫描的非定向广播事件类型

当使用不可链接不可扫描的非定向广播事件类型时,链路层发送不可链接不可扫描的非定向广播事件标志(ADV_NONCONN_IND不可连接不可扫描的非定向 ADV_EXT_IND PDUs)。不可链接不可扫描的非定向广播事件可以使用ADV_NONCONN_IND不可连接不可扫描的非定向 ADV_EXT_IND PDUs,但是两个不能同时使用。ADV_NONCONN_IND不能用于LE Coded PHY。

不可链接不可扫描的非定向广播事件类型允许扫描者从广播者接收信息,信息可以包含在ADV_NONCONN_INDADV_EXT_IND PDUAuxPtr字段指向的AUX_ADV_IND PDU

广播者在发送完每一个ADV_NONCONN_INDADV_EXT_IND PDU后需要切换到下一个用到的首要广播信道索引进行发送或者关闭光比事件。链路层不进行监听,因此不能接收任何的来自扫描者或者发起者的请求。

在一个广播事件中,连续两个不可链接不可扫描的非定向广播的ADV_NONCONN_INDADV_EXT_IND PDUs的时间间隔需要小于或等于10ms,广播事件需要在广播间隔内结束。

如果使用ADV_EXT_IND PDUsAdvMode字段需要设置为不可连接不可扫描。

如果使用ADV_EXT_IND PDUs,则控制器可能使用辅助数据包。如果广播包含ACADAdvData,则需要使用辅助数据包。

如果使用ADV_EXT_IND PDUs并且不使用辅助数据包,则它不能包含AuxPtr字段,需要包含AdvA字段。

如果使用ADV_EXT_IND PDUs并且使用辅助数据包,则它应该包含AuxPtr字段以及ADI字段。ADV_EXT_IND PDU或者它指向的AUX_ADV_IND其中之一可能包含AdvA字段(当广播是匿名的时,AdvA字段可以省略)。在AUX_ADV_IND PDU中,AdvMode字段需要设置为不可连接不可扫描并且ADI字段需要存在,ADV_EXT_IND PDUAUX_ADV_IND PDUADI字段需要完全一致。在LE Coded PHY中,ADV_EXT_IND PDU不能包含AdvA字段。

注意:控制器可以决定哪个PDU包含AdvA字段,并根据媒介的整体效率做出选择。

任何PDU中都不能存在TargetA字段。

图4.23展示了使用所有首要广播物理信道包的不可链接不可扫描的非定向广播事件类型的结构:
在这里插入图片描述
图4.23 展示了不可链接不可扫描的非定向 ADV_EXT_IND PDU的结构:
在这里插入图片描述
图4.25 展示了Host广播数据使用AUX_CHAIN_IND PDU进行分帧的不可链接不可扫描的非定向 ADV_EXT_IND PDU的事件结构:
在这里插入图片描述
如果使用了链路层加密,则也应该符合Section 6.2.3中的要求。

4.4.2.7 可链接的非定向广播事件类型

使用ADV_EXT_IND PDU的可链接的非定向广播事件类型允许发起者在次要广播物理信道上使用连接请求来进行应答以建立ACL连接。

ADV_EXT_IND PDU中,AdvMode字段需要被设置为可链接,ADI字段也需要有并且PDU中不能包含AdvATargetA字段。ADV_EXT_IND PDUsAuxPtr字段需要指向AdvMode字段为可链接的AUX_ADV_IND PDU,在AUX_ADV_IND PDUAdvA,TargetAADI字段都要存在,并且ADV_EXT_IND PDU要和AUX_ADV_IND PDUADI字段相同。

发起者在和AUX_ADV_IND PDU同一个次要广播物理信道处使用AUX_CONNECT_REQ PDU来发起连接请求来请求链路层进入连接状态。

在广播者发送每一个涉及到这个事件的AUX_ADV_IND PDU之后,广播者需要在同一个次要广播信道索引上监听AUX_CONNECT_REQ PDUs,任何收到的AUX_SCAN_REQ PDUs都要被忽略掉。

如果广播者收到它的广播过滤策略允许的发起者发送的AUX_CONNECT_REQ PDU中包含它的设备地址,它需要在同一个次要广播信道索引处回复一个AUX_CONNECT_RSP PDU。在AUX_CONNECT_RSP PDU发出以后,链路层需要退出广播态并以Section 4.5.5中定义的slave角色进入连接态。

在一个广播事件中,连续两个可链接的定向广播的ADV_EXT_IND PDUs的时间间隔需要小于或等于10ms,广播事件需要在广播间隔内结束。

图4.26展示了没有收到AUX_CONNECT_REQ PDU的广播事件:
在这里插入图片描述
图4.27 展示了在次要广播信道索引处接收到AUX_CONNECT_REQ PDU并且发送AUX_CONNECT_RSP PDU的广播事件:
在这里插入图片描述
如果使用了链路层加密,则也应该符合Section 6.2.4中的要求。

4.4.2.8 可扫描的定向广播事件类型

使用ADV_EXT_IND PDU的可扫描的定向广播事件类型允许特定的扫描者在次要广播物理信道上使用扫描请求来进行应答以接收扫描响应数据。

ADV_EXT_IND PDU中,AdvMode字段需要被设置为可扫描,ADI字段也需要有并且PDU中不能包含AdvATargetA字段。ADV_EXT_IND PDUsAuxPtr字段需要指向带有AdvA,ADI,TargetAAUX_ADV_IND PDU,并且ADV_EXT_IND PDU要和AUX_ADV_IND PDUADI字段相同。

在广播者发送每一个AUX_ADV_IND PDU之后,广播者需要在同一个次要广播信道索引上监听来自指定扫描者的AUX_SCAN_REQ PDU,。

如果广播者收到包含它的设备地址并且扫描者的设备地址在AUX_ADV_IND PDU中的设备的AUX_SCAN_REQ PDU,它需要在下一次广播事件之前,在同一个次要广播信道索引处回复一个AUX_SCAN_RSP PDU。在AUX_SCAN_RSP PDU中包含设备的扫描响应数据,任意来自其他扫描者的AUX_SCAN_REQ PDUsAUX_CONNECT_REQ PDUs都要被忽略。

在一个广播事件中,连续两个可链接的定向广播的ADV_EXT_IND PDUs的时间间隔需要小于或等于10ms,广播事件需要在广播间隔内结束。

参考Section 4.4.2.5.2来对AUX_SCAN_REQ包如何与AUX_SCAN_RSP包在次要广播物理信道上同时发生获取更多信息。

如果使用了链路层加密,则也应该符合Section 6.2.5中的要求。

4.4.2.9 不可连接不可扫描的定向广播事件类型

使用ADV_EXT_IND PDU的不可连接不可扫描的定向广播事件类型允许特定广播者在首要广播信道上发不可连接不可扫描的定向ADV_EXT_IND PDUs,在次要广播物理信道上给特定扫描者发送任意广播数据。。

ADV_EXT_IND PDU中,AdvMode字段需要被设置为不可连接不可扫描。

当广播包含ACADAdvData时,Controller需要使用辅助包,否则Controller可以选择是否使用辅助包。

如果没有使用辅助包,ADV_EXT_IND PDU不能包含AutPtr字段,但是需要包含AdvATargetA字段。

如果使用了辅助包,ADV_EXT_IND PDU需要包含AutPtrADI字段。ADV_EXT_IND PDU或它指向的AUX_ADV_IND PDU中的一个PDU可以包含AdvA字段(AdvA字段可以省略,这种情况下被认为是匿名广播),TargetA字段也需要在上述两个PDU中的其中一个里面。在AUX_ADV_IND PDU中,AdvMode需要被设置为不可链接不可扫描,并且ADI字段需要存在,ADV_EXT_IND PDU要和AUX_ADV_IND PDUADI字段相同。在LE Coded PHY中,ADV_EXT_IND PDU不能包含AdvATargetA字段。

注意:Host不能指定哪个PDU包含AdvATargetA字段,Controller根据整体的利用效率进行选择。

链路层不进行监听,因此不能接收任何来自扫描者或初始者的请求。

如果使用了链路层加密,则也应该符合Section 6.2.5中的要求。

4.4.2.10 广播集合

广播者的HOST可以指示链路层交叉广播事件,合并在一起的广播数据成为一个广播集合,链路层可以支持多个广播集合,每一个都有不同的广播参数,比如广播PDU类型,广播间隔,PHY等。

当使用ADV_EXT_IND,AUX_ADV_IND或AUX_SYNC_IND PDUs的时候,广播集合通过广播SID的子字段ADI来指示,链路层需要按照HOST的指示设置广播SID的ADI字段。

扫描者可以通过广播SID来过滤广播。

每一个广播集合的广播事件都被认为是一个独立的广播态的实例,每一个都有各自的广播间隔(见Section 4.4.2.2.1)。

图4.28展示了使用多个广播集合的示例:
在这里插入图片描述
复位后,所有的广播集合都被销毁。

当创建的广播集合包含广播数据时,Controller需要保证这个集合可以包含至少31字节的广播数据,在Host首先为这个集合指定广播数据或创建另一个广播集合以后,这个保证不再适用。

当创建的广播集合是可扫描的类型时,Controller需要保证这个集合可以包含至少31字节的扫描响应数据,如果这个集合变为不可扫描或Host首先为这个集合指定了扫描响应数据或创建了另一个广播集合时,这个保证不再适用。

4.4.2.11 使用广播数据信息(ADI)

ADI字段用于标识广播集合并复制AUX_ADV_IND 或 AUX_SCAN_RSP PDUsAdvData。对于使用ADV_EXT_IND PDU的可扫描的广播事件,AUX_ADV_IND PDU中不允许有AdvData字段,所以ADI只涉及到AUX_SCAN_RSP PDU中包含的AdvData字段。

对于给定的广播集合,广播的DID需要初始化为一个随机值,无论何时,Host给指定的广播集合提供新的广播数据或扫描响应数据时(无论数据是否与之前的一致),广播DID需要进行更新,更新的值是一个和之前用到的值不一样的随机值。

注意:随机选择广播DID字段值降低了来自不同广播者的PDUs包含同样ADI字段值的可能。

注意:在SyncInfo字段加入或移出广播集合的时候,广播DID字段不要求要进行更新,但是,如果它没有更新,那么扫描者可能无法同步到定期广播,因为缓存了广播DID条目(见Section 4.3.3)意味着它们会忽略包含SyncInfo字段的广播。因此广播者需要在启用定期广播序列的时候更新广播DID。同样的,Host需要在启动广播前使能定期广播。

4.4.2.12 定期广播

当广播数据需要以一个固定间隔进行发送时使用定期广播,定期广播是指以固定的时间间隔发送数据并且数据是随时可能变化的。AUX_SYNC_INDAUX_CHAIN_IND PDUs构成了一个定期广播序列。

当定期广播发生时,广播者需要以AUX_ADV_IND PDUsSyncInfo字段中描述的固定间隔(定期广播间隔见Section 4.4.2.2.3)发送AUX_SYNC_IND PDUs,包含定期广播的广播集合由指向包含SyncInfo字段的AUX_ADV_IND PDUsADV_EXT_IND PDUsAdvDataInfo字段标识。AUX_SYNC_IND PDUs和指向他们的PDUs使用相同的PHY进行发送。当周期广播序列使能以后,AUX_SYNC_PDUs中用到的PHY,接入地址以及CRCInit值都不能进行改变。

指向定期广播序列的广播不能是匿名的,每次定期广播序列使能时,Controller需要发送至少一个AUX_ADV_IND PDU指向序列的第一个AUX_SYNC_IND PDU,在这以后,对是否需要发送或什么时候发送指向这个序列的广播PDUs没有要求。

注意:SyncInfo字段只在不可链接不可扫描的广播中允许。

Host可以发送定期广播数据给到链路层,广播数据由链路层放置在在定期的AUX_SYNC_IND PDUs和他们的附属集合中。链路层需要重复Host提供的最后一次广播数据,知道它收到新的广播数据。AUX_SYNC_IND PDUs需要连续进行发送,直到Host指示链路层关闭这个定期广播序列。

定期广播序列的数据包可以包含CTE,Host可以在定期广播序列开始前使能这个特性或在定期广播序列进行中使能或禁止CTE的包含。

当广播集合首次被配置为定期广播时,Controller需要保证这个集合可以包含至少31字节的广播数据,否则不能在这个广播集合中允许定期广播。当Host首先为这个集合指定定期广播数据或创建另一个广播集合时,这个保证不再适用。

图4.29展示了定期广播的示例:
在这里插入图片描述

4.4.3 扫描态

链路层由Host控制进入扫描状态,扫描的时候,链路层在首要广播物理信道上进行监听,有2种扫描模式,由Host决定:主动扫描和被动扫描。

对于扫描来说,没有严格的时间要求和广播同道选择算法要求。

扫描期间,链路层在首要广播信道上进行监听,持续时间位扫描窗口scanWindow。扫描间隔定义为连续2个扫描窗口的起始时间差。

扫描窗口和扫描间隔参数需要小于40.96秒,扫描窗口需要小于或等于扫描间隔。如果扫描窗口等于扫描间隔,则链路层进行持续扫描。

扫描过滤策略在扫描时接收到广播PDUhuozhe扫描响应PDU的时候生效。

在收到带有AuxPtr字段的PDU时,扫描着需要监听AuxPtr指向的辅助包(只要它支持AuxPtr字段种制定的PHY),并尝试接收完整的附属集合的PDU。这样做的时候,需要按照章节4.2.4中的定义进行窗口加宽。

当扫描者接收到包含AuxPtr字段的ADV_EXT_IND PDUs时,可以选择继续监听辅助包或者跳过监听,在跳过监听辅助包的情况下,需要满足下面要求:

对于每一个收到广播SID值:

  • Controller需要对每个广播设备的一个或多个最近的广播DID值进行缓存(针对这个目的,所有的匿名设备都认为来自同一个真实设备),并在每一个收到包含ADI字段的PDU的时候进行更新。Controller可以随时删除任意的缓存项。如果Controller未收到PDU的完整的从属集合,那么应该删除与ADV_EXT_IND PDU有关的缓存条目。
  • Controller只有在缓存中有一个条目的ADI字段中所指定的广播DID值正在被其他设备使用的时候,才能跳过接收辅助包。如果ADV_EXT_IND PDU包含AdvA字段,则入口为该设备,否则控制器不能跳过接收辅助包。
  • 不考虑缓存内容时,Controller需要随即进行监听AUX_ADV_IND PUD以防其他广播这使用相同的广播DID值进行广播或者现有的广播者对扩展头进行了重要的更改(例如,包含SyncInfo字段)。

如果使用了链路层加密,则也应该符合Section 6.3中的要求。

4.4.3.1 被动扫描

被动扫描时,链路层只接收数据包,不发送任何数据包,比如扫描请求包。

4.4.3.2 主动扫描

主动扫描时,链路层监听广播PDUs,根据广播PDU的类型,觉得是否发送扫描请求给广播者来发送更多的附加信息。

进入扫描态以后,如果链路层接收到扫描者的过滤策略允许的广播者的可扫描的PDU(例如 ADV_IND,ADV_SCAN_IND或可扫描的AUX_ADV_IND PDU),它会发出一个扫描请求PDU然后监听扫描应答PDU。它需要持续的响应同一个广播者直到成功收到扫描应答PDU。然后,它可以响应或忽略来自同一广播者的后续可扫描PDUs。如果PDUs是遗留的PDUs或者同一个带有同样的广播SID字段的广播者的广播DID字段从上一个广播开始没有改变,则应该忽略他们,否则不能进行忽略。

链路层只能给接收到ADV_IND PDUADV_SCAN_IND PDU的广播者发送SCAN_REQ PDU。链路层只对收到的可扫描的AUX_ADV_IND的广播者发送AUX_SCAN_REQ PDU。链路层会忽略可扫描的AUX_ADV_IND PDU如果TargetA字段存在并且和链路层的设备地址不匹配。

扫描者应运行补偿过程,以最小化来自多个扫描者的扫描请求PDU的碰撞。下面段落给出了这一过程的一个例子。

补偿过程使用2个参数,backoffCountupperLimit来限制扫描响应PDU上发送冲突时发送的扫描请求PDU的数量。进入扫描态以后,backoffCountupperLimit设置为1。

每次收到扫描者策略允许的ADV_IND , ADV_SCAN_IND 或 可扫描的AUX_ADV_IND PDU等需要发送扫描请求PDU的时候,backoffCount减1直到达到0,扫描请求PDU只有在backoffCount为0的时候发送。

在发出扫描请求PDU以后,链路层监听来自广播者的扫描应答PDU。如果没有广播者的扫描应答PDU,则认为这个过程已经失败,否则认为是成功的。当连续2次失败时,upperLimit进行翻倍直到它达到256,连续2次成功时,upperLimit值见效一般,直到它达到1。在接受扫描响应PDU成功或失败以后,链路层设置backoffCount为一个新的随即值,介于1到upperLimit之间。

如果设备使用不同的补偿算法,则需要分享方式。

图4.10和图4.11展示了使用所有的广播信道索引接收SCAN_REQ PDU并发送SCAN_RSP PDU的2中示意图。

4.4.3.3 广播集合

ADV_EXT_IND PDU可以包含ADI字段。当ADI字段存在时,它用来指示广播数据属于同一个集合。这是在广播SID的子字段ADI中指定的,广播SID由广播者的Host设置。

4.4.3.4 扫描定期广播

当Host做这个指示的时候,扫描者需要查找位于AUX_ADV_IND PDUSyncInfo字段中的周期广播同步信息。如果SyncInfo字段的同步包偏移是0,则定期广播同步信息是不完整的并且扫描者需要监听附属广播信息以便获取完整的信息。当接收到完整的信息时,将启动一个新的状态机,该状态机立刻进入到同步状态,之前的状态机保持在扫描态。

Host可以指示Controller不要与带有CTE或不带CTE的类型的定期广播序列进行同步。如果同步的时候Controller收到带有CTE的AUX_SYNC_IND,则同步失败并且停止。一旦同步完成,CTE的存在或类型不影响同步过程。

4.4.3.5 广播报告

链路层需要在每次在首要广播信道收到广播PDU或收到来自广播者的扫描响应的时候发送广播上报给到Host,除非本节其他地方另有说明。

如果Controller收到了带有AuxPtr字段的ADV_EXT_IND PDU,则需要推迟上报直到相关的AUX_ADV_IND PDU都已经接收完成,上报的时候需要合并所有PDUs的信息。如果Controller没有监听或没有收到AUX_ADV_IND PDU,则不进行上报。广播报告需要至少包含广播者的设备地址和广播数据或扫描响应数据。

注意:Controller可以使用多个HCI事件发送报告,例如,如果所有数据无法在一个事件中适配。

Host可以要求重复的广播报告进行过滤不进行发送。

当收到包含ADI字段的ADV_EXT_IND PDU时,重复广播报告是与之前的包含ADI的广播报告具有同样广播SID以及DID的同样设备地址的广播报告。出于这个目的,任何匿名设备都被认为是同一个设备。

ADV_EXT_IND PDU不包含ADI字段或者收到遗留PDU时,重复的广播报告是指链路层保持在扫描状态时同一个设备地址的广播报告。

这两种情况下,实际的数据可能会发生变化,在确定是否时重复的广播报告时,广播数据或扫描响应数据被认为不重要。

4.4.4 发起态

链路层通过Host控制进入发起态,处于发起态时,链路层在首要广播物理信道上进行监听。

发起者没有严格的时许或广播同道选择规则要求。

处于发起态的时候,链路层在首要广播信道索引处进行监听,持续时间为扫描窗口scanWindow,扫描间隔``scanInterval`为连续两个扫描窗口开始时间之间的间隔。

除非调度冲突,否则链路层需要按照Host的指示在每个扫描间隔上监听完整的扫描窗口。在每个扫描窗口,链路层在不同的首要广播信道索引处进行监听,链路层需要用到所有的首要广播信道索引。

扫描窗口和扫描间隔需要小于等于40.96s,扫描窗口需要小于或等于扫描间隔,如果扫描窗口等于扫描间隔,链路层会持续进行监听。

响应可怜见广播的链接指示或者链接请求需要在首要或次要广播物理同道上进行发送,取决于哪一个PDU包含AdvA字段,下面的子章节描述了2种过程。

如果使用了链路层加密,则也应该符合Section 6.4中的要求。

4.4.4.1 首要广播物理同道上的链接请求

在LE Coded PHY上建立链接时,不能使用这个过程。

如果接收到符合发起者过滤策略的ADV_IND PDU,发起者需要发送CONNECT_IND PDU给广播者。如果接收到的ADV_DIRECT_IND PDU包含发起者的链路层的设备地址并且发起者的过滤策略允许,则发起者需要发送CONNECT_IND PDU给广播者,否则需要忽略掉。

发送完CONNEC_IND PDU以后,链路层需要推出发起态,转换为如Section 4.5.4中所定义的链接态的Master角色。

4.4.4.2 次要广播物理信道上的链接请求

在使用LE Coded PHY建立链接时使用这个过程。

如果收到了可链接的ADV_EX_IND PDU,发起者在次要广播物理信道上监听可链接的AUX_ADV_IND,这么做的时候,需要按照Section 4.2.4中的定义进行窗口扩展。如果收到发起者过滤策略允许的可链接的非定向AUX_ADV_IND PDU或包含发起者链路层设备地址的可连接的定向AUX_ADV_IND PDU,发起者需要发送AUX_CONNECT_REQ PDU给到广播者,否则需要忽略掉。

发完AUX_CONNECT_REQ PDU以后,发起者等待广播者发送AUX_CONNECT_RSP PDU,一旦收到AUX_CONNECT_RSP PDU,链路层退出发起态,转换为如Section 4.5.4中所定义的链接态的Master角色。如果发起者没有收到来自广播者的AUX_CONNECT_RSP PDU,则需要在响应下一个可连接的AUX_ADV_IND PDU前使用Section 4.4.3.2中描述的SCAN_REQ补偿算法。

4.4.5 同步态

同步状态时,链路层需要监听来自另一个设备的周期性的广播,有两种这样的广播:定期广播序列和同步广播流。

同步态有两种子状态:同步中和同步完成。假如它拥有定位周期广播的必要信息,则链路层通过Host控制进入同步态的同步中子状态,一旦它成功接收到来自广播者的PDU,则转换为同步完成子状态然后被称为同步到广播完成,在这之前,被称为同步中。

一旦同步完成,如果在Host指定的时间里没有收到任何形成广播的PDUs,则要转换为待机状态并通知Host。

4.4.5.1 定期广播序列

为了接收定期广播序列,链路层需要获取定期广播的同步信息。这个信息可以从AUX_ADV_IND PDU(见Section 4.4.3.4)的SyncInfo字段或者已连接设备发送的LL_PERIODIC_SYNC_IND PDU中获取。

处于这个状态时,链路层需要按照Section 4.4.2.1中定义的次要广播信道索引进行监听同步信息中定义的形成定期广播序列的AUX_SYNC_IND PDUs。在同步中子状态,如果Controller在从开始监听的第一个定期广播事件开始后的6个定期广播事件内没有收到任何AUX_SYNC_IND PDUs,则需要通知Host转换为待机状态。

设备不能去尝试同步一个与一个已经同步完成的设备具有想用的地址,地址类型和广播SID的定期广播序列进行同步。

如果Host要求,链路层需要上报接收到的定期广播数据给Host。Host可以选择不上报所有的数据,而是选择性的上报。当不需要将数据或者CTE样本报告给Host时,链路层不需要监听AUX_SYNC_IND PDUs,除非必要时与广播者的时钟进行同步或者接收信道映射更新。

链路层需要按照Section 4.2.4中定义的窗口加宽进行执行。如果同步时windowWidening的数值达到((periodicInterval/2) - T_IFS µs),则Controller需要通知Host然后进入待机状态。

4.4.5.2 同步广播流

为了接收同步广播流,链路层需要获取描述数据流的BIGInfo的信息(见Section 4.4.6.11)。这个信息可以从定期广播的ACAD中获取。

处于这个状态时,链路层需要监听Section 4.4.6.8中定义的用于BIGInfo中指定的形成BIG的BIS Data PDUs的同步信道索引。在同步中子状态下,如果链路层从第一个监听的BIG事件开始,连续6个BIG事件内都没有收到BIS Data PDU,则应该通知Host并转换为待机状态。

一旦进入同步完成子状态,链路层需要在任意6个连续的BIS事件内至少监听同步广播者一次。

已经和BIG完成同步的设备叫做同步接收机,同步完成的接收机可以但不是必须保持与定期广播序列进行同步。

如果Host要求,链路层需要上报接收到形成BIG的BIS Data PDUs的同步数据给到Host。Host可以指定只有BIG的特定BISes的数据才进行上报。链路层需要监听并按照新的BIG Control PDUs的内容进行动作。

链路层不需要监听早已经成功接收到的重发的同步广播PDUs或不需要上报数据给Host的BIS Data PDUs,除非必要时与广播者的时钟进行同步。

链路层需要按照Section 4.2.4中定义的窗口加宽进行执行。

链路层应该在bisPayloadCounter等于2^39 –1之前停止监听BIG。

4.4.6 同步广播状态

链路层由Host控制进入同步广播状态,假设他能够处理Host要求发送的BIG。处于这个状态时,链路层需要发送下面子章节描述的BIS PDUs。

在传输第一个BIS Data PDU时,链路层需要通知Host。

在这个状态时,Host可能会禁用然后重新启用BIG相关的广播序列。

每一个处于同步广播状态的链路层状态机的实现都需要发送由一个或多个BISes组成的BIG。每一个BIS都有一个独立的同步数据流,每个BIG最多存在31个BISes。

注意:同步广播状态是对于每个BIG来说的(例如,每一个BIG的实例化一个链路层状态机)。

4.4.6.1 同步广播流(BIS)

BIS是启动设备发送同步数据的逻辑传输信道,同步数据可以是FramedunFramed的。

BIS支持可变大小的数据包并且在每个同步事件中传输一个或多个数据包,允许支持范围的数据速率。数据流从广播设备单向流出。由于没有应答协议,同步广播流本质上是不可靠的。为了提升数据包传输的可靠性,BIS支持多次重传。

4.4.6.2 同步广播组(BIG)

每个BIG包含两个或多个具有同样ISO_Interval并期望在应用层具有时间关系的BIS或单个BIS组成。单个BIG中最大的BISes数量为31,BIG同样包含控制子事件(见Section 4.4.6.7)。

4.4.6.3 BIG参数

每个BIG由下面的参数定义:

  • Num_BIS为BIG中BISes的数量,每一个BIG中的BISes被分配一个从1到Num_BIS的不同的BIS_Number
  • ISO_Interval为相邻两个IG锚点之间的时间,单位为1.25ms。值的范围为4-3000,也就是5ms-4s。
  • BIS_Spacing为BIG中相邻的BISes中相应的子事件开始之间的时间,也是最后的BIS第一个子事件到控制子事件之间的时间。
  • Sub_Interval是每个BIS的两个连续子事件开始之间的时间。
  • Max_PDU为BIG中每个BIS Data PDU能承载的数据字节的最大个数(包含MIC)。值的范围为0-251字节。
  • Max_SDU为BIG中每个SDU的最大大小(见Vol 6 Part G,Section 1)。值的范围为1-4095字节。
  • MPT等于发送包含BIS Data PDU的数据包的时间,该数据包的有效载荷为BIS用到的PHY的Max_PDU的字节.在LE Coded PHY中,设定S=8的编码。
  • BN,PTO和IRC控制每一个BIG事件发送什么数据,BN的值范围为1-7,PTO值的范围为0-15,IRC的范围为1-15。
  • NSE为每一个BIG事件的每一个BIS子事件的个数,值的范围为1-31并且需要是BN的整数倍。
  • Framed表示BIG载荷是Framed的还是unFramed的数据。
  • Encrypted表示BIG是否进行了加密。

这些参数在BIG的持续时间内不能进行改变,在子章节4.4.6.44.4.6.11中会进行更详细的介绍。每个参数的强制范围是有效值的整个范围,但以下参数除外,只有列出的值是强制性的:

  • NUM_BIS:1
  • NSE: 1
  • BN:1
  • PTO:0
  • IRC:1

每个BIG都有一个与他相关的39位计数器bigEventCounter,它在第一个BIG事件的时候被设置为0并且在后面每个BIG事件进行加1,无论在事件期间同步广播者是否发送任何同步广播PDUs。

每一个BIS都有一个与它相关的39位计数器bisPayloadCounter,如Section 4.4.6.5所述。同步广播者和同步接收者的链路层需要在bisPayloadCounter的值达到2^39-1之前关闭BIG。

注意:在任何BIG事件的开始,BIG的所有BISes都会有同样的bisPayloadCounter值,另外,bigEventCounter*BN=bisPayloadCounter

4.4.6.4 BIG事件

BIG事件包含一个或多个BIS PDUs,链路层只在BIG事件中传输BIS PDUs,链路层在BIG事件的一部分只能传输BIS PDUs。

每一个BIG事件被分为Num_BIS个独立的BIS事件和一个控制子事件(如果存在的话),每一个BIS事件被分为NSE子事件。

每个BIS事件在成为BIS锚点的地方开始,在它的最后一个子事件后结束。每一个BIG事件在成为BIG锚点的地方开始,如果控制子事件存在,则在控制子事件后结束,否则在最后一个BIS事件后结束。BIG锚点按照ISO_Interval来分割,BIG的第n个BIS锚点在BIG锚点的(n-1)xBIS_Spacing后面,因此也是以ISO_Interval周期性分割的。每一个BIS的子事件间隔为Sub_Interval,同步广播者需要至少在下一个BIG事件的BIGm锚点之前的T_IFS时刻关闭BIG事件。图4.30展示了BIS及其子事件。
在这里插入图片描述
BIG中的BISes应通过适当的设置Sub_IntervalBIS_Spacing参数的值来顺序排列或交错排列。如果他们按顺序排列,BIS_Spacing需要大于或等于NSE x Sub_Interval,这样BIS所有的子事件同时在一个事件中触发。如果他们是交错排列的,则Sub_Interval需要大于或等于Num_BIS x BIS_Spacing,这样所有的BISes的第一个子事件都是相邻的,然后是所有的BISes的第二个子事件,依次类推。在所有情况下,需要使用最小的BIS_Spacing。图4.31展示了Num_Bis = 2和NSE =2的排列情况:
在这里插入图片描述
BIG事件的数据部分的最大可能长度(不包括控制子事件)表示为BIG_Sync_DelayBIG_Sync_Delay的值需要等于从BIG锚点到同步点的时间,同步点也就是最后一个子事件发送的带有Max_PDU载荷的数据包的后面,如图4.31所示。因此BIG_Sync_Delay等于(Num_BIS - 1) x BIS_Spacing + ( NSE -1 ) x Sub_Interval +MPT

4.4.6.5 同步广播数据

BIS给广播承载单个的同步数据流。数据被分为最大Max_PDU字节的载荷单元,每一个在单独的BIS Data PDU中发送。载荷不要求大小一样,并且可以为0,BIG的BISes携带独立但相关联的数据流。BIG的Framed参数表示所有组成BISes是Framed的还是unFramed的。Framed的BIGs只能用Framed的BIS Data PDUs来承载数据,unFramed的BIGs只能用unFramed的BIS Data PDUs来承载数据。

BIS_SpacingSub_Interval需要至少为T_MSS + MPT

对于每一个BIS,载荷需要按照提供的顺序从0开始进行编号。这个编号用于包含该载荷的PDU的bisPayloadCounter值。如果数据源不能为BIS事件提供BN载荷,则bisPayloadCounter应继续增加就像已经提供了丢失的有效载荷一样。

4.4.6.6 BIS子事件

BIS子事件是同步广播者发送同步广播BIS PDU以及同步接收者进行接收的一个时机。链路层应该在每一个子事件的开始的时候发送一个BIS Data PDU,除非是在调度冲突的情况下,但是也需要在连续6个BIS事件中发送至少一个BIS PDU。如果没有发送PDU,链路层应表现为为了其他目的(例如数据包定时和载荷的选择)已经发送了一样。

对于每个BIS事件,数据来源应提供BN(Burst Number)载荷组成的突发数据,每个载荷都应有SDU的单个片段或1个或多个片段。这个突发事件和相应的BIS事件相关联,但也可以在早期的事件中传输。

注意:与BIS事件相关联的突发事件由bisPayloadCounter介于bigEventCounter x BN(bigEventCounter + 1) x BN -1之间的载荷组成。

每个BIS事件的子事件被划分为每一个BN子事件的组。因此由组数(GC),GC = NSE ÷ BN

IRC(立即重复计数)表示携带与当前BIS事件相关的事件的组数。其余的与未来BIS事件相关联的携带数据的组由PTO定义(Pre-Transmission Offset)。IRC需要大于0并且小于等于GC,如果IRC = GC,那么PTO需要被忽略,否则PTO需要大于0。

子事件的组使用0到GC-1来进行编号:

  • 如果 g < IRC,那么组 g需要包含与当前BIS事件相关联的数据。
  • 如果 g ≥ IRC,那么组 g需要包含与未来BIS事件相关联的数据,也就是当前BIS事件后的PTO x (g - IRC + 1)BIS事件。

每个突发事件中的有效载荷应时钟以相同的顺序传输。

注意:设置GC 大于1的值提供了冗余传输,以补偿广播时无应答的机制,而将PTO设置为非零值提供了数据冗余副本之间的更大的时间多样性。

例如,图4.32,4.33,4.34展示了3个不同的BISes子事件的载荷分配。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.4.6.7 控制子事件

每个BIG事件可能会包含一个控制子事件,如果包含,则链路层需要在控制子事件开始的时候发送一个单独的BIG Control PDU来发送关于BIG的控制信息(见Section 5.6)。链路层不能随意地发送BIG Control PDU。

从BIG锚点到控制子事件开始的事件,称之为 BIG_Control_Offset,需要符合:
对于顺序排列模式:BIG_Control_Offset = Num_BIS * BIS_Spacing
对于交叉排列模式:BIG_Control_Offset = NSE * Sub_Interval

注意:关于BIG中BISes的顺序排列模式及交叉排列模式,见Section 4.4.6.4
在这里插入图片描述
如果链路在BIG事件中计划发送BIG Control PDU,则需要设置在每相同BIG事件中发送的每个BIS Data PDU的header的CSTF位为1,否则需要设置为0。所有的BIS Control PDU的header的CSTF位都要设置为0。

BIG的每个BIS PDU的CSSN值需要相同,链路层会在包含新的第一次传输的BIG Control PDU的BIG事件的开始将CSSN进行加1(到7以后进行归0),否则应保持CSSN不变(例如,当BIG Control PDU进行重发或没有进行重发的计划时)。

注意:同步接收机可以用CSSN来判断BIG Control PDU是否是已经接受道德数据包的重传。

4.4.6.8 信道索引

每个包含BIS PDU的数据包都要按照信道选择算法#2(见Section 4.5.8.3)来在特定的信道索引上进行发送。
子事件号se_n需要设置为1到NSE,以便于对于给定的BIS子事件,BIG的所有BISes需要设置为同样的值,控制子事件时设置为1。

BIG用到的信道表需要包含在BIGInfo中,当信道表改变时,需要使用BIG信道表更新进程在BIG控制逻辑链路上进行发送(见Section 5.6.1)。

4.4.6.9 关联的定期广播序列

每个BIG都需要由一个关联的定期广播序列,一个定期广播序列不能同时与超过1个BIG进行关联。广播序列和BIG可以单独的使能或关闭,定期广播序列的AUX_SYNC_IND PDU的ACAD字段用来携带BIG的BIGInfo。当BIG关闭的时候,BIGInfo不能被发送。当BIG与其关联的广播序列处于活动状态时,当AUX_SYNC_IND PDU的ADAC有足够的空间时,BIGInfo需要在定期广播序列中进行发送。

ACAD同样可以用于其他的信息,比如信道表的改变。尽管不可能将两者都安排在同一个PDU中,链路层仍需要安排每个信息的传输以满足任何相关的需求。

相关联的定期广播序列的AUX_SYNC_IND PDU的传输不能在一个BIG事件中进行调度。

4.4.6.10 加密

BIGk可以被加密,这种情况下,BIG的所有BISes的BIS PDUs(除了载荷为空的)都要被加密。链路层需要通过检查BIGInfo的长度来确定是否需要对BIG进行加密(见Section 4.4.6.11),本节其他部分只适用于BISes加密的情况。

下面的参数用于BIGs的同步广播PDUs的加密和解密过程:

  • Broadcast_Code,由Host提供的16字节参数。
  • GIV,Controller生成的64位参数
  • GSKD,Controller生成的128位参数

对于每个加密的BIG,同步广播者的Controller需要使用Vol 3 Part H,Section 2要求的随机数生成算法生成新的GIVGSKD并在BIGInfo中进行传输。在加密的BIG中每一个同步广播PDU都需要使用CCM算法进行加密(见Vol 6 Part E,Section 2)。

4.4.6.11 BIGInfo

未加密的BIG的BIGInfo长度为33字节,加密的BIG的BIGInfo长度为57字节,BIGInfo的格式如图4.36所示:
在这里插入图片描述
BIG_Offset字段包含了从包含BIGInfo字段的数据包的开始时间到下一个BIG锚点之间的时间。BIG_Offset值的单位为BIG_Offset_Units字段所定义的时间单位。实际的时间偏移为BIG_Offset乘以对应的时间单位。时间偏移需要大于600us。

如果BIG_Offset_Units位被置1,则单位为300us,否则为30us。BIG_Offset_Units在偏移小于491460us时不应该被置1。

BIG锚点应不早于偏移量,并且不晚于相应数据包启动后的偏移量加上一个单位的时间,如图4.37所示:
在这里插入图片描述
ISO_Interval,NSE,BN,Sub_Interval,PTO,BIS_Spacing,IRC字段的值定义如Section 4.4.6.3中所描述的。Sub_Interval和BIS_Spacing的单位为us。

Num_BIS字段包含BIG的BISes的个数。

Max_PDU字段描述见Section 4.4.6.3

SeedAccessAddress字段包含BIG的种子访问地址,见Section 2.1.2

SDU_Interval字段描述见Vol 6 Part G,Section 2

Max_SDU字段描述见Section 4.4.6.3

BaseCRCInit字段描述见Section 3.1.1

ChM字段和CONNECT_IND PDU的对应字段有相同的含义,见Section 2.3.3.1

PHY字段用来表示BIG用到的PHY,PHYs的值定义见表4.3。
在这里插入图片描述
bisPayloadCount字段描述见Section 4.4.6.5。这个值应用于BIG_Offset字段涉及的的BIG事件的第一个子事件。

Framing位在BIG携带有Framed的数据时置1。

如果BIG是加密的,则GIV和GSKD字段包含了Section 4.4.6.10所描述的值的定义。

4.5 链接状态

链路层在以下条件后进入链接状态:

  • 发起者在首要广播物理同道上发送CONNECT_IND PDU给广播者。
  • 广播者在首要广播物理信道上收到来自发起者的CONNECT_IND PDU
  • 广播者在次要广播物理同道上发送AUX_CONNECT_RSP PDU给发起者。
  • 发起者在次要广播物理信道上收到广播者的AUX_CONNECT_RSP PDU

进入链接状态后,链接被认为已经创建。这个时候,链接不被认为建立完成,只有在数据物理信道上收到来自对端设备的数据包才被认为链路已经建立完成。创建链接和建立链接的唯一区别是使用的链路层链接超时监督值(见Section 4.5.2)。

如果链接在首要广播物理信道上使用CONNECT_IND PDU首次创建链接,需要在两个方向上都使用LE 1M PHY。如果链接在次要信道上使用AUX_CONNECT_REQ和AUX_CONNECT_RSP PDUs首次创建链接,则需要在两个方向上使用与AUX_CONNECT_REQ和AUX_CONNECT_RSP PDUs使用的PHY相同的PHY。任何的PHY都可以通过使用PHY更新过程进行改变(见Section 5.1.10)。在使用LE Coded PHY时,每个包的编码由Section 2.2.3中定义的CI决定,并且在每个方向上和给定方向上的相邻分组中可能是不同的。

当两个设备处于连接状态时,两个设备表现为不同的角色,链路层处于Master角色的称为主设备,链路层处于slave角色的称为从设备。主设备控制链接事件的时间,链接事件是主从设备之间的同步点。在两个LE设备地址之间,无论是否建立完成,只能有一个链接。发起者不能向一个已连接的设备再次发起链接请求。

如果广播者收到了来自它已经链接的发起者发来的链接请求,需要忽略掉这个请求。

如果发起者发送了CONNECT_IND PDU来响应ADV_INDADV_DIRECT_IND PDU,并且其中一方或者双方PDU的ChSel字段设置为0,则链接中使用信道选择算法#1(见Section 4.5.8.2)。否则应使用信道选择算法#2(Section 4.5.8.3)。

ACL链接的主设备,在由Host控制时,可以使用连接同步流创建过程(见Section 5.1.15)与对端设备创建一个链接同步流(CIS)。CIS应与创建它的ACL相关联,链路层可以与同一个从设备创建多个CISes。

注意:从设备不能在链路层等级发起一个创建CIS的请求,但是可以在更高的等级进行这个操作。

当主从设备之间的ACL链接关闭后,所有相关的CISes都要同时进行关闭。

4.5.1 链接事件

处于链接态的链路层只有在链接事件中发送数据物理信道PDUs(见Section 2.4)。主机和从机需要按照Section 4.5.8中的定义来决定在每个链接事件中使用的数据信道索引。链接事件中所有的数据包都使用一样的数据信道索引。同个链接事件通常至少包含一个从主机发送的数据包。然而,由于调度冲突,主机可能完全无法在链接事件中传输,但应在链接超时时间内至少传输一个数据信道PDU(见Section 4.5.2)。

在链接事件内,主机和从机交替进行发送和接收数据包的操作。链接事件在双方设备持续进行数据包发送时被认为是打开的。如果从机收到了来自主机的数据包,无论CRC是否匹配,都应发送响应的数据包,除非是在Section 4.5.6中制定的连续多个CRC不匹配以后。主机在收到来自从机的数据包时,无论CRC是否匹配,都可以选择发送一个数据包,除非是在Section 4.5.6中制定的连续多个CRC不匹配以后。在判断接收包的结尾的时候,即使CRC不匹配,也要假定Header的Length和CP字段以及CTEInfo的CTETime字段(如果存在)是正确的。然而,如果接收设备可以通过其他方式确定正确的Length和CTETime,则可以用这些值代替Header中的值。

链接事件可以由任意一边设备关闭,如Section 4.5.6所定义。

链接事件的时间由2个参数决定:链接间隔connInterval和从机延迟connSlaveLatency

链接事件的开始位置称为锚点,在锚点处,主设备需要发送数据物理同道PDU给从设备,链接事件的开始通过connInterval这个间隔来进行周期性的分割并且不能重叠,主设备需要保证链接事件在下一个链接事件的锚点之前的至少T_IFS之前进行关闭,从设备在锚点处监听它的主设备的数据包。

connInterval需要时1.25ms的整数倍,范围在7.5ms到4.0s之间,connInterval由发起者的链路层在CONNECT_INDAUX_CONNECT_REQ PDU中由Host给定的范围进行设置,并且可以使用链接参数更新过程(见Section 5.1.1)或链接参数请求过程(见Section 5.1.7)进行更新。

从机延迟参数允许从设备使用降低数量的链接事件,connSalveLatency参数定义了从设备可以不去监听主设备的连续多少个链接事件。connSalveLatency的值不能导致链接监督超时(见Section 4.5.2)。connSalveLatency的值为0 到((connSupervisionTimeout / (connInterval*2)) - 1)的整数值。connSalveLatency同样需要小于500,当connSalveLatency设置为0时,从设备需要在每一个锚点处进行监听,如果从设备在使用了从机延迟后没有收到主机的数据包,则需要在每一个锚点处进行监听,并且取消从机延迟直到它收到了来自主设备的一个数据包。不考虑connSalveLatency或者调度冲突的情况下,从设备需要在链接超时时间内至少监听一次主设备的数据(见Section 4.5.2)。

主机和从机都有一个16位的链接事件计数器(connEventCounter),包含了每一个ACL链接的connEventCount的值,在第一个链接事件时需要设置为0,后面每次新的链接事件都会依次加1,在达到0xFFFF时转换为0x0000,这个计数器用来同步链路层控制过程。

主机和从机在每个链接事件以后都要把connEventCounter加1,即使从设备由于从机延迟没有监听主设备或主设备在事件期间发送失败。

4.5.2 监督超时

链接可能会由于多种原因导致链路断开,例如设备超出范围或者遭遇严重干扰或者电源断电等。由于这些发生前不会有任何的警告,因此主设备和从设备监控链接的状态是非常重要的。

为了检测ACL链接的链路丢失,主设备和从设备都需要使用ACL链接监督超时定时器TLLconnSupervision,每次接收到一个有效的ACL数据包,这个定时器进行重置。为了检测CIS的链路丢失,主机和从机都需要用到CIS超时定时器TCISSupervision,每次收到一个有效的CIS数据包,定时器需要进行重置。

如果ACL链接监督超时定时器在链接建立完成前达到6*connInterval(见Section 4.5),则ACL链接被认为已经丢失,这个使得ACL链接失败的时候可以快速关闭。

在建立CIS链接时,主设备需要在收到LL_CIS_IND应答以后的下一个CIS事件的开始的时候启动CIS监督定时器,如果CIS监督定时器在CIS建立链接前达到6*ISO_Interval,则CIS链路被认为已经丢失。

在建立CIS链接时,从设备需要在收到LL_CIS_IND以后的下一个CIS事件的开始的时候启动CIS监控定时器,如果CIS监控定时器在CIS建立前达到了6*ISO_Interval,则CIS链路被认为已经丢失。

链接监控超时(connSupervisionTimeout)为定义两个接收到的数据信道PDUs或同步连接PDUs在链接丢失前的最大时间间隔的参数,connSupervisionTimeout为10ms的倍数,范围为100ms到32.0 s,并且需要大于:(1 + connSlaveLatency) * connInterval * 2.

在ACL链接建立完成以后,处于链接状态的任何时候,只要TLLconnSupervision达到了connSupervisionTimeout的值,则链接被认为已经丢失(见Section 4.5.12)。

在CIS链接建立完成以后,处于链接状态的任何时候,只要TCISSupervision达到了connSupervisionTimeout的值,则链接被认为已经丢失。

在这两种情况下,如果最近的事件已经关闭并且计时器将在下一个ACL或CIS锚点之前达到connSupervisionTimeout的值,则Controller可以提前发送链路丢失通知。

监督超时时间可以通过链接更新过程或链接参数更新请求过程进行改变,如果使用了任意一个过程,新的值需要大于2倍的任意关联CIS的ISO_Interval

每一个监督超时周期从接收到有效数据包以后的事件开始,在定时器达到connSupervisionTimeout值之前的最后一个事件结束。

4.5.3 链接事件发送窗口

为了让主机能够有效的为它参与的多个链接或者其他活动调度链接事件,主机可以灵活的选择它第一个链接事件的锚点。CONNECT_IND 和 AUX_CONNECT_REQ PDUs包含了决定主机何时在链接状态发送第一个数据包的来设置锚点以及从机何时必须进行监听的参数。

CONNECT_IND 和 AUX_CONNECT_REQ PDUs包含了用来决定发送窗口的三个参数,发送窗口开始于包含CONNECT_IND 或 AUX_CONNECT_REQ PDUs 的数据包之后的transmitWindowDelay + transmitWindowOffsettransmitWindowSize参数决定了发送窗口的大小。计算发送窗口的最大偏移和大小的时候,需要用到connInterval参数,transmitWindowOffset 和 transmitWindowSize参数由链路层决定。

transmitWindowOffset 为1.25ms的倍数,范围为0ms到 connIntervaltransmitWindowSize为1.25ms的倍数,范围为1.25ms到 10ms和connInterval - 1.25ms之间的较小值。

因此收到包含CONNECT_IND 或 AUX_CONNECT_REQ PDU之后的第一个数据包开始的时间应不早于transmitWindowDelay + transmitWindowOffset,并且不晚于transmitWindowDelay + transmitWindowOffset + transmitWindowSize

在使用CONNECT_IND PDU时,transmitWindowDelay为1.25ms,在LE Uncoded PHY上使用AUX_CONNECT_REQ PDU时为2.5ms,在LE Coded PHY上使用AUX_CONNECT_REQ PDU的时候为3.75ms。

4.5.4 链接建立-主机角色

在发起者在首要广播物理同道上发出CONNECT_IND PDU以后或在次要广播物理信道上接收到AUX_CONNECT_RSP PDU以后,链路层以主机角色进入链接状态。主机重置链路层链接监督定时器TLLconnSupervision,链路层需要通知Host链接已经被创建,第一个链接事件需要用Section 4.5.8中定义的数据信道索引。

主机设备需要在Section 4.5.3中定义的发送窗口内发送第一个数据包,主机的第一个数据包扩展到发送窗口之外是允许的。

链接状态下主机发送的第一个数据包决定了第一个链接事件的锚点以及这个链接中后续的连接事件的时间。

第二个连接事件的锚点在第一个链接事件锚点后的connInterval后,应适用Section 4.5.1中定义的通用连接事件发送规则。

图4.38和图4.39展示了主机端的2中LL链接建立时间过程:
在这里插入图片描述
在这里插入图片描述

4.5.5 链接建立-从机角色

广播者在首要广播物理信道上收到CONNECT_IND PDU或在次要广播物理信道上发送AUX_CONNECT_RSP PDU以后,链路层以从机角色进入链接状态,从设备重置链路层链接监督定时器TLLconnSupervision。链路层需要通知Host链接已经创建,第一次链接事件需要使用Section 4.5.8中定义的数据信道索引。

从设备需要在Section 4.5.3中定义的发送窗口内监听第一个数据包,这样做的时候,需要按照Section 4.2.4中定义的进行窗口扩大,主机发送的第一个数据包扩展到发送窗口之外是被允许的,因此从机需要把这个考虑进去。

收到第一个数据包后,无论CRC匹配是否合法,链接状态的从设备都会确定第一个链接事件的锚点以及这个链接中后续所有链接事件的时间。

如果在发送窗口内没有收到数据包,从设备需要尝试在随后的发送窗口进行接收数据包,随后的发送窗口在上一个发送窗口的connInterval之后,具有同样的transmitWindowSize。数据信道索引为Section 4.5.8中定义的下一个数据信道索引。connEventCount同样需要加1。

图4.40和图4.41展示了从机端的2个示例过程,这些示例中,从机在第一个链接事件中没有收到来自主机的数据包(connEventCount = 0),然后根据第二个链接事件中收到的数据包来确定锚点(connEventCount = 1)。
在这里插入图片描述
从机需要在每一个链接事件进行激活除非它收到了主机的带有NESN为1的数据包,从这个时候起,可以使用Section 4.5.1中定义的从机延迟。

4.5.6 关闭链接事件

数据物理信道PDU的Header的MD位,用来指示设备有更多数据要发送。如果双方设备在数据包中都没有设置MD位,则来自从设备的数据包关闭链接事件。如果其中一个或者两个都设置了MD位,主机可以通过发送另一个数据包持续连接事件,从机需要在它发送数据包以后继续进行监听。

接收数据包失败或者同一个连接事件的连续两个数据包的CRC都不匹配,则关闭这个事件。

表4.4描述了MD位的用法:
在这里插入图片描述

4.5.7 休眠时钟精度

由于休眠时钟精度(见Section 4.2.2),从机确定主机的锚点的时间存在不确定性,因此从机需要在它监听的主机的每一个链接事件中重新与主机的锚点进行同步,如果从机在锚点处收到了来自主机的数据包,无论CRC是否匹配,从机都需要更新它的锚点时间。

从机在每一锚点以及链接更新过程(见Section 5.1.1)和连接参数请求过程(见Section 5.1.7)中需要进行Section 4.2.4中描述的窗口加宽。这样做的时候,如果没有关于主机时钟更精确的信息的情况下,需要使用来自连接中最近的CONNECT_IND ,AUX_CONNECT_REQ,LL_CLOCK_ACCURACY_REQ, 或 LL_CLOCK_ACCURACY_RSP PDU的主机的休眠时钟精度masterSCA

4.5.8 通用信道组索引选择

4.5.8.1 信道分类

主机,定期广播者和同步广播者的链路层需要将通用组的RF信道分类为used信道(用于发送数据)和unused信道(不用于发送数据)。这个称为信道表,used信道最小个数位2。

Host可以提供信道分类信息给到链路层,链路层使用Host提供的信息,对于一个链接,从机需要从主机的CONNECT_INDAUX_CONNECT_REQ PDU中接收信道表。如果主机更改信道表,则需要按照Section 5.1.2的定义通知从设备。如果定期广播者修改信道表,则需要使用信道表更新指示(见核心规范补充部分,Part A,Section 1.20)来通知所有的扫描设备。如果同步广播者修改信道表,需要按照Section 5.6.1的定义来通知同步接收者。

4.5.8.2 信道选择算法#1

信道选择算法#1只支持链接事件的信道选择。

信道选择算法#1包含两个阶段:计算未映射的信道索引,然后将该索引映射到used信道集合中的数据信道索引。

unmappedChannellastUnmappedChannel是连续两个连接事件的未映射信道索引。unmappedChannel是最近一个的连接事件的未映射信道索引,lastUnmappedChannel是上一个链接事件的未映射信道索引,lastUnmappedChannel在链接的第一个链接事件中需要设置为0。

在链接事件开始的时候,unmappedChannel需要使用下面的算法进行计算:
unmappedChannel = (lastUnmappedChannel + hopIncrement) mod 37

当链接事件关闭的时候,lastUnmappedChannel需要设置为unmappedChannel的值。

重映射表用来从0开始索引,按照升序包含所有的used信道,remappingIndex用来从重映射表中选择链接事件的数据信道索引。

完整的过程如图4.42所示:
在这里插入图片描述

4.5.8.3 信道选择算法#2
4.5.8.3.1 概述

信道选择算法#2支持连接事件和定期广播事件以及子事件信道选择(见Section 4.5.8.3.5)。

在事件开始的时候,这个事件可以是链接事件,同步事件或定期广播包,这里介绍的算法生成一个事件信道索引(这是一个通用的信道索引,视情况而定)。如果事件包含子事件,则为每个子事件生成信道索引。

注意:对于给定的事件,信道选择算法#2使用不同的信道索引会导致连续两个子事件。

图4.43展示了算法的整体框图,上层部分生成事件信道索引,底层部分生成子事件信道索引。在没有子事件的时候,只需求上半部分,同步事件的第一个子事件需要使用事件映射的信道索引。事件的所有后续子事件应使用子事件映射中的信道索引。
在这里插入图片描述

4.5.8.3.2 输入和基础组件

算法使用下面的输入和基础组件:

  • 6位的输入N为被分类为used信道的信道数。
  • 16位的输入channelIndentifier对于给定的链接或周期广播序列是固定的,通过接入地址进行计算:channelIdentifier = (Access Address 31-16 ) XOR (Access Address15-0)。
  • 16位的输入counter在每个事件中都会进行改变,对于ACL链接,为Section 4.5.1中定义的链接事件计数器connEventCounterCounter;对于定期广播,为Section 4.4.2.1中定义的事件计数器paEventCounter;对于同步逻辑传输,则为Section 4.4.6.3中定义的事件计数器bigEventCounter的0到15位,或者Section 4.5.1.3.2中的cisEventCounter

对于同步事件,输入se_n 在BIG事件中在Section 4.4.6.8定义,在CIS事件中在Section 4.5.13.7中定义。

XOR操作总是指16位的按位XOR

符号⌊⌋为向下取整(取得小于或等于参数的最大整数值)。

排序操作包含低8位输入和高8位输入独立的位翻转,如图4.44所示:
在这里插入图片描述
乘法加法和模(MAM)块执行乘法操作,加法操作和模运算,如图4.45所示:

在这里插入图片描述
对于给定的输入a和b,MAM操作的输出为:
output = (17 x a + b) mod 216

重映射表从0开始索引,以升序排列所有used信道。

4.5.8.3.3 未映射事件信道选择

未映射事件信道选择过程包含两个阶段,首先创建两个无符号的伪随机数prn_eprn_s(prn_s只用于子事件信道选择),然后从prn_e导出未映射信道索引unmappedChannel。第一阶段如图4.46所示:
在这里插入图片描述
unmappedChannel使用prn_e mod 37进行计算,总体过程结构图如图4.47所示:
在这里插入图片描述

4.5.8.3.4 事件映射到used信道索引

如果unmappedChannel根据信道表来看为used信道的信道索引,则用于事件的信道索引。如果unmappedChannelunused信道的索引,则事件的信道索引通过prn_e 和 N进行计算,首先计算remappingIndex的值:
在这里插入图片描述
然后使用remappingIndex作为索引从重映射表中获取事件的信道索引。

在上面任意一种情况下,remappingIndexOfLastUsedChannel的值为事件信道索引的重映射表的索引。

总体过程如图4.48所示:
在这里插入图片描述

4.5.8.3.5 子事件伪随机数生成

子事件伪随机数生成设计为每个子事件生成两个或更多的伪随机数prnSubEvent_se 和 prnSubEvent_lu。过程如图4.49所示:
在这里插入图片描述
其中:
在这里插入图片描述

4.5.8.3.6 子事件映射到used信道索引

子事件的信道索引由两个阶段决定:计算子事件索引subEventIndex 和 重映射表检索。 subEventIndex的值计算如下:
在这里插入图片描述
其中 indexOfLastUsedChannel为:
在这里插入图片描述
d 计算方式如下:
在这里插入图片描述
d为连续子事件的通道索引之间差值的最小值。

然后subEventIndex被用于在重映射表中进行检索,过程如图4.50所示:
图4.50
在这里插入图片描述

4.5.9 应答及流控

链路层应答和流控策略在所有的ACL链接和CISes中应用。除非特别说明,本章节中不合格的PDU使用意味着数据物理信道PDU或CIS Data PDU。

每个链接链路层有两个参数,transmitSeqNumnextExpectedSeqNum,每一个为1位。transmitSeqNum参数用来表示链路层发送的数据包,nextExpectedSeqNum参数被链路层用来确认对方发的最后一个PDU或者请求对方重发最后一个PDU。

在进入链接状态或创建CIS以后,ACL链接或者CIS的transmitSeqNumnextExpectedSeqNum需要设置为0。

如果最后一个数据信道PDU在LE Coded PHY上发送,重发时的编码策略(见Section 2.2.3)与最后一个数据物理信道PDU的可以相同也可以不同。如果在数据物理信道等待重发的时候,PHY 更新进程(见Section 5.1.10)触发了,则在重发的时候需要用新的PHY。

新的PDU是由链路层首次发送的PDU,最后一个PDU是链路层在重发时候的PDU,在重发数据物理信道PDU时,LLID,SN,CP字段,CTEInfo字段(如果存在)需要与链路层最后发送的数据物理信道PDU相同。在重发CIS Data PDU时,LLID,SN,NPI字段以及CIS Data PDU的payload需要与链路层最后发送的CIS Data PDU相同。

对于发送的每个新的PDU,Header的SN 位需要设置为transmitSeqNum。如果为重发的PDU,SN位不进行变化。

接收到PDU后,SN位与nextExpectedSeqNum进行比较,如果不同,则这个是重发的PDU,nextExpectedSeqNum不进行改变,如果相同,则这个是新的PDU,nextExpectedSeqNum需要进行加1(见Section 4.5.9.1)。

发送PDU的时候,Header的NESN位设置为nextExpectedSeqNum

收到PDU后(包括CIS Null PDU),如果PDU的NESN位和transmitSeqNum相同,则最后一个发送的PDU还没有被应答,除非如下所描述的,否则需要进行重发。如果PDU的NESN位与transmitSeqNum不同,则最后一个PDU已经被应答,transmitSeqNum需要进行加1,然后可以发送新的PDU。

上面的过程如图4.51所示(tSqNo代表transmitSeqNuM,nExSqNo 代表 nextExpectedSeqNum)。
在这里插入图片描述
如果收到的PDU的CRC匹配不合法,除非下面的特殊说明,否则nextExpectedSeqNum不进行改变,这意味着PDU将不会被应答,导致对端重发这个PDU,由于接收到的PDU被拒绝,来自对端设备的nextExpectedSeqNum不被信任,因此来自该设备的最后一个发送的PDU没有被确认,需要进行重发,transmitSeqNum不能被改变。

SN,NESN和MD位需要用于接收到的每个通过CRC检查的数据物理信道PDU;SN,NESN,CIE 和NPI位用于接收到的每个通过CRC检查的CIS Data PDU;NESN,CIE 和NPI位用于接收到的每个通过CRC检查的CIS NULL PDU。接收到的PDU的SN和之前接收到的PDU的SN一致时,PDU的payload需要被忽略。

当发送链路层发送CIS Data PDU或发送一个PDU但是在刷新点(见Section 4.5.13.5)之前没有收到PDU的 应答时,transmitSeqNum需要进行加1并且这个PDU在刷新点之后不能进行重发。

当链路层期望接收到CIS Data PDU,在刷新点之前没有收到这个PDU或者应答这个PDU失败的话,nextExpectedSeqNum需要进行加1并且链路层不能期望在刷新点之后这个PDU会进行重发。

注意:这些规则意味着,为了达到本节的目的,两端设备都要表现的就像每个CIS Data PDU都在刷新点之前被接收并且应答。例如,这意味着两个连续的发送或者成功接收CIS Data PDU可以有同样的序列号但是不同的内容,这是由于中间PDU没有被发送,对于任意的CIS Data PDU,transmitSeqNum将会等于cisPayloadNumber0

4.5.9.1 流控

链路层可能由于各种原因导致更新nextExpectSeqNum失败,包括但不限于接收缓冲满。这会导致对端一定时间后重发数据物理信道PDU,从而实现流控。

4.5.10 数据PDU长度管理

Controller需要保持下面的全局参数。

注意:所有名字中带有Octets的参数代表LL Data PDU的Payload字段的长度。所有名字中带有Time的参数代表发送数据包需要的以微秒为单位时间。

  • connInitialMaxTxOctets :Controller在新的链接中将要用的connMaxTxOctets值。
  • connInitialMaxTxTime : Controller在新的链接中用来确定connMaxTxTime的值。
  • connInitialMaxTxTimeUncoded : Controller在新的LE Uncoded PHY链接中用来确定connMaxTxTime的值。connInitialMaxTxTimeUncoded的值为 328 和connInitialMaxTxTime的较大者。
    • connInitialMaxTxTimeCoded : Controller在新的LE Coded PHY链接中用来确定connMaxTxTime的值。connInitialMaxTxTimeCoded的值为 2704 和connInitialMaxTxTime的较大者。
  • supportedMaxTxOctets:Controller支持的connMaxTxOctets的最大值。
  • supportedMaxTxTime:Controller支持的connMaxTxTime的最大值。
  • supportedMaxRxOctets:Controller支持的connMaxRxOctets的最大值。
  • supportedMaxRxTime:Controller支持的connMaxRxTime的最大值。

注意:2704us是由使用S=8的编码时在LE Coded PHY上发送数据载荷27字节的数据包的时间导致的。

Controller需要对每一个链接保持下面的参数:

  • connMaxTxOctets:本地设备将要发给对端设备的Payload的最大字节数。
  • connMaxRxOctets:本地设备可以接收对端设备的Payload的最大字节数。
  • connRemoteMaxTxOctets:对端设备将要发给本地设备的Payload的最大字节数。
  • connRemoteMaxRxOctets:对端设备可以接收本地设备的Payload的最大字节数。
  • connMaxTxTime:本地设备将要发给对端设备的数据包消耗的最大时间。
  • connMaxRxTime:本地设备接收对端设备的数据包能够接受的最大时间。
  • connRemoteMaxTxTime:对端设备将要发给本地设备的数据包消耗的最大时间。
  • connRemoteMaxRxTime:对端设备接收本地设备的数据包能接受的最大时间。

上面的参数的值需要在表4.5中给定的范围中:
在这里插入图片描述
下面的值来自于Controller维护的参数:

  • connEffectiveMaxTxOctets:值为connMaxTxOctetsconnRemoteMaxRxOctets之间的较小值。
  • connEffectiveMaxRxOctets:值为connMaxRxOctetsconnRemoteMaxTxOctets之间的较小值。
  • connEffectiveMaxTxTimeUncoded:值为connMaxTxTimeconnRemoteMaxRxTime之间的较小值。
  • connIntervalRequired:值为(2*T_IFS)+min(connEffectiveMaxRxTime,((connEffectiveMaxRxOctets*64)+976))
  • connInteralCodedMin:值为connIntervalRequired + 2704。注意,976us和2704us为在LE Coded PHY使用S=8的编码时,发送0字节和27字节的payload时需要用到的时间。
  • connIntervalPortionAvailable:值为该链接的当前链接间隔减去connIntervalRequired的间隔
  • connEffectiveMaxTxTimeAvailable:值为connEffectiveMaxTxTimeUncodedconnIntervalPortionAvailable之间的较小值。
  • connEffectiveMaxTxTimeCoded:值为connEffectiveMaxTxTimeAvailable 和2704之间的较小值。
  • connEffectiveMaxTxTime:在链接为LE Uncoded PH时,等于connEffectiveMaxTxTimeUncoded ,在链接为LE Coded PHY时,等于connEffectiveMaxTxTimeCoded
  • connEffectiveMaxRxTimeUncoded:值为connMaxRxTimeconnRemoteMaxTxTime之间的较小值。
  • connEffectiveMaxRxTimeCoded:值为connMaxRxTimeUncoded 和2704之间的较大值。
  • connEffectiveMaxRxTime:在链接为LE Uncoded PH时,等于connEffectiveMaxRxTimeUncoded ,在链接为LE Coded PHY时,等于connEffectiveMaxRxTimeCoded

注意:相应的时间和字节参数不要求互相一致。例如时间参数为2120us时,尽管在某些PHYs上面,最大的时间可能会比较少,但是是允许的。

Controller不能改变supportedMaxTxOctets, supportedMaxTxTime, supportedMaxRxOctets, 和supportedMaxRxTime的值。

对于一个新的链接:

  • connMaxTxOctets应设置为connInitialMaxTxOctets并且connMaxRxOctets需要由Controller进行选择。如果任意一个值不是27,则Controller需要尽早的启动数据长度更新进程(见Section 5.1.9)。
  • connRemoteMaxTxOctetsconnRemoteMaxRxOctets需要为27。

对于在LE Uncoded PHY的新链接:

  • connMaxTxTime需要设置为connInitialMaxTxTimeUncoded并且connMaxRxTime需要由Cotroller进行选择,如果任意一个的值不为328,则Controller需要尽早的启动数据长度更新进程(见Section 5.1.9)。
  • connRemoteMaxTxTimeconnRemoteMaxRxTime需要设置为328。

对于在LE Coded PHY上的新链接:

  • connMaxTxTime需要设置为connInitialMaxTxTimeCoded并且connMaxRxTime需要由Cotroller进行选择,如果任意一个的值不为2704,则Controller需要尽早的启动数据长度更新进程(见Section 5.1.9)。
  • connRemoteMaxTxTimeconnRemoteMaxRxTime需要设置为2704。

Controller可以在进入链接态以后的任意时间更改connMaxTxOctets, connMaxRxOctets, connMaxTxTime,和connMaxRxTime的值,无论在何时这么做,都需要与对端设备使用数据长度更新进程进行沟通,这些值不能超过supportedMaxTxOctets, supportedMaxTxTime, supportedMaxRxOctets, and supportedMaxRxTime的值。

Controller不能发送Payload长度超过connEffectiveMaxTxOctets或发送时间需要花费超过connEffectiveMaxTxTime us的包含LL Data PDUs的数据包,除非connEffectiveMaxTxOctetsconnEffectiveMaxTxTime的值正在进行更改的过程中,在这个过程中,Controller可能任然会有符合旧的参数但不符合新的参数的LL Data PDUs的队列来发送,这些PDUs被认为时合法的。只有在数据长度更新进程完成以后的PDUs才被要求符合更改后的参数。然而,Controller需要确保在发送LL_LENGTH_REQLL_LENGTH_RSP PDU的时候不要有LL Data PDUs

注意:这些要求不适用于LL Control PDUs(见Section 4.5.11)。

如果Controller降低connMaxRxOctetsconnMaxRxTime的值,在发送新的值的数据长度更新进程完成之前不能使用更改后的值。

connEffectiveMaxTxOctets, connEffectiveMaxRxOctets, connEffectiveMaxTxTime, 或 connEffectiveMaxRxTime的任意参数发生更改时,Controller需要通知Host。

注意:这些参数可以作为下面进程的部分进行更新:

  • 数据长度更新进程(Section 5.1.9)
  • PHY更新进程(Section 5.1.10)
  • 链接更新进程(Section 5.1.1)
  • 链接参数请求进程(Section 5.1.7)

4.5.11 控制PDU长度管理

链路层在完成同一链接的特性交换进程(见Section 5.1.4)之前不能发送CtrData字段大于26字节的包含LL Control PDU的数据包。

注意:如Section 4.6所述,一旦特性交换进程完成,链路层不能允许使用对端设备标注不支持的进程。因此链路层不会发送CtrData字段大于26字节的LL Data PDU给到不支持它的设备。

4.5.12 链接关闭和丢失

ACL或CIS链接可以被链路层使用ACL关闭进程(见Section 5.1.6)或CIS关闭进程(见Section 5.1.16)对应的关闭。链路同样可以有各种原因被认为已丢失,在关闭进程完成后,需要通知Host,无论是master还是slave发起的。

如果ACL链接被认为丢失,链路层不能在ACL的数据物理信道或关联CIS额同步物理信道上发送或接收任何
数据包。链路层需要退出链接态,进入待机态并通知Host ACL和相关的CIS 链路已经丢失。

如果CIS链路被认为丢失,链路层不能在同步物理信道上发送或接收任何的数据包并且需要通知Host CIS的链路已经丢失。相关联的ACL链接不受影响,除非链路层不能在ACL链接上发送与该CIS相关的任何PDU。

4.5.13 同步链接流(CIS)

CIS为可以使链接的设备双向发送同步数据的逻辑传输。数据可以是固定的或者可变的长度,可以是有Framed的或unFramed的。同步数据可以使用CIS逻辑传输在LE-S或LE-F上进行传输。每个CIS需要与一个ACL相关联。

CIS支持可变长度的数据包并且在一个同步事件中可以传输一个或多个数据包,允许支持范围性的数据速率。数据在设备间是单向或者双向的,有应答协议来提高CIS中数据包的传递的可靠性。

4.5.13.1 CIS参数

master的Host需要为每个CIS分配一个标示,叫做CIS_ID。这个CIS_ID作为CIS的一部分通过两个链路层发送给slave的Host,但不被链路层使用。

每个CIS由下面的参数定义:

  • ISO__Interval 为相邻的CIS时间的CISm锚点之间的间隔。
  • Sub_Interval为CIS的连续两个子事件之间的时间间隔。
  • SE_Length为子事件的最大长度。
  • Max_PDU为每个CIS Data PDU可以承载的最大数据字节数,在两个方向上这个值可能是不同的。
  • MaxSDU为CIS的SDU的最大大小(见Vol 6 Part G,Section 1),在两个方向上这个值可能是不同的。
  • MPTM和MPTS需要等于对应的master和slave在CIS用到的PHY上发送Payload为Max_PDU字节的包含CIS PDU的数据包花费的时间。在LE Coded PHY中,假设S = 8编码。
  • NSE为每个CIS事件中子事件的最大个数。
  • BN 和 FT控制每个CIS事件中发送什么数据,在两个方向上这个值可能是不同的。
  • Framed 标示CIS承载的数据是否是Framed的,这个值在两个方向上需要相同。

这些参数在CIS持续的时间内不能进行改变,他们会在下面的子章节中进行讨论。每个参数的强制范围为有效值的整个范围,但下面情况除外,只有列出的值是强制性的:

  • NSE:1
  • BN:0和1
  • FT: 1

注意:CIS的加密状态取决于相关联的ACL链接的加密状态。

Master和Slave都由一个39位的计数器cisEventCounter,在首个CIS事件中需要设置为0并在后续的每个CIS事件中进行加1,无论在事件期间master是否发送了同步连接PDUs。

每个CIS都由一个关联的39位cisPayloadNumber,详细的描述见Section 4.5.13.3。Master和Slave的链路层需要在cisPayloadNumber等于239 - 1之前关闭CIS。

4.5.13.2 CIS事件和子事件

CIS事件为master和slave交换CIS PDUs的机会,CIS事件以固定的间隔触发。每个CIS事件会包含NSE子事件,每个子事件可以用来发送master发给slave的CIS PDU然后跟着slave给到master的应答。如Section 4.5.13.4所述,CIS事件中不是所有的子事件都要一直使用。

每个CIS事件开始于被称为CIS锚点的时刻,然后按照Section 4.5.13.4所描述的进行关闭。CIS锚点需要按照ISO_Interval的间隔进行周期性分割。

第一个子事件在CIS锚点的地方开始,CIS的连续两个子事件需要按照Sub_Interval间隔来分割。如有有slave的数据包,则一个子事件结束于slave的数据包,如果没有,则结束语master的数据包。

每一个CIS事件通常包含至少一个master发送的CIS PDU,但是由于调度冲突,master可能在CIS事件中完全无法成功发送,但在每个CIS监督超时的时间内,需要至少发送成功一个CIS PDU。

注意:特定的CIS事件的长度为Sub_Interval - T_MSS(NSE X Sub_Interval) - T_MSS之间。

链路层只能在CIS事件中发送CIS PDUs并且链路层在CIS事件中只能发送CIS PDUs。

图4.52展示了带有两个子事件的CIS:
在这里插入图片描述
图4.53展示了子事件没有被全部使用的CIS事件:
在这里插入图片描述
master需要在每个子事件的开始的时候发送数据包直到事件关闭。如果slave接收到来自master的数据包,无论CRC是否有效,都需要在master的数据包T_IFS后发送一个响应包。如果slave在同一个子事件中没有收到来自master的数据包,则不发送响应包,如果任何一个设备在子事件期间没有进行传输,链路层需要表现为为其他目的(例如数据包的时间和payload的选择)就像它已经做了一样。

ISO_Interval需要为1.25ms的倍数,范围为5ms到4s,至少为NSE x Sub_Interval并且需要小于相关联的ACL链接的connSupervisionTimeout时间的一半。

SE_Length为 MPTM + T_IFS + MPTS + T_MSS。

Sub_Interval需要大于等于SE_Length(见Section 4.5.14.2)。

BN的范围为0到15,对于双向链路,两个方向的值都要为非零值,对于单向链路,在数据发送的方向上需要为非零值,在另一个方向上为零。

NSE的范围需要为max(BN_M_To_S,BN_S_To_M)到31。

4.5.13.3 同步链接数据

CIS在一个方向上或双向上分别承载一个同步数据流。这些数据被划分为最大Max_PDU字节的数据包,作为CIS Data PDU的payload来进行发送。这些payload的长度不需要完全一致并且长度可以为0。

注意:Max_PDU为CIS Data PDU中payload数据的长度,如果有MIC的话,不包括MIC数据。因此值的范围为0到251。

CIS的Framed参数表示CIS是FramedunFramedFramed CISes只能用Framed CIS Data PDUs来承载数据。unFramed CISes只能使用unFramed CIS Data PDUs来承载数据。

对于每个CIS事件,数据来源应该有ISOAL提供的由最多BN有效载荷组成的一组数据,每一组数据应有SDU单个片段或者一个或多个片段或者为空。这个突发传输于相应的CIS事件相关联但payload可以在以后的事件中进行传输。他们不能在早期的事件中进行传输。这些payload需要按顺序进行编号(可以不是连续的),这个编号可以被包含这个Payload的PDU作为cisPayloadNumber的值使用。当cisEventCounter具有E的值时,与CIS事件关联的突发payload需要由cisPayloadNumberE x BN(E + 1) x BN -1之间的payload组成。

注意:CIS Null PDUs没有cisPayloadNumber

payload需要按照提供的顺序进行发送,链路层需要持续重发每个CIS Data PDU直到它收到应答或它里面的数据达到了刷新点。链路层在上一个数据收到应答或达到刷新点之前不能发送新的payload。链路层不能在一个payload的刷新点之后发送这个payload。如果数据来源在CIS子事件时没有成功提供payload,则链路层需要发送CIS Null PDU代替。

注意:ISOAL分配的payload编号没有特别说明如何传递给链路层或接收端链路层如何传输payload编号给ISOAL.

注意:如果BN为0,则没有payload被提供,因此链路层将只发送CIS Null PDUs

4.5.13.4 关闭CIS事件

链路层需要在CIS事件的最后一个子事件后关闭CIS事件。

master或slave可以使用同步事件关闭位CIE来较早的关闭CIS事件,发送CIE位为1的CIS PDU的设备不得在当前CIS事件中的其余子事件中传输。

注意:链路层通常将在两个方向上所有的payload都被发送并且应答以后较早的关闭CIS事件。

4.5.13.5 刷新超时和刷新点

刷新时间FT参数为用来发送或重发一个给定CIS Data PDU的最大CIS事件的个数。FT的范围为1到255,每一个CIS Data PDU需要有一个刷新点:PDU被链路层丢弃的时间点。突发传输中PDU的刷新点在cisEventCounter等于(E + FT -1)的CIS事件的U子事件之后立即发生,其中:

  • E = floor(cisPayloadNumber ÷ BN)
  • U = NSE - floor(NSE ÷ BN) x (BN - 1 - cisPayloadNumber mod BN)

图4.54和图4.55数据传输以及payloads达到刷新点的示例:
在这里插入图片描述
在这里插入图片描述

4.5.13.6 信道索引

每个包含CIS PDU的数据包需要在信道选择算法#2指定的信道上进行发送。子事件编号se_n应设置为1到NSE的值,以便对事件的子事件进行排序。slave需要和master在同一个信道索引上进行发送。CIS用到的信道表需要和相关的ACL的信道表一致。

4.5.13.7 CIS加密

如果ACL没有加密,则相关的CIS也不进行加密。如果ACL进行加密,则相关的CIS也进行加密,这种情况下,所有CISes的CIS Data PDUs(除了payload为空的数据)需要和相关的ACL使用相同的秘钥进行加密。

4.5.14 同步连接组(CIG)

CIG由两个或多个具有相同ISO_Interval并且期望在应用层有时间关系的CISes或单个CIS组成。CIG中CISes的总数量称为Num_CIS,CIG中最大的CISes的值为31,master的实现不要求支持具有超过1哥CIS的CIGs。

CIG在其第一个CIS创建是生成,在它的所有CISes都被摧毁时解散。

master的Host给每个CIG分配一个标示,称为参数CIG_IDCIG_ID作为CIG的CIS的一部分通过两个链路层发给slave的Host,但是链路层不会使用这个参数。

CIG的所有CISes需要由同样的master,但是slave可以不同。

CIG的所有CISes中master到slaave需要具有同样的FT值,slave到master也需要有同样的FT值,这两个FT值可以不同。

CIG的所有CISes具有不同的CIS_IDs,但是如果CIS已经关闭或者被认为丢失,则CIG可以使用同样的CIS_ID创建另一个CIS。

4.5.14.1

CIG事件包含了组成CIG的CISes的相应CIS事件。每个CIG事件开始于CIG的最早的CIS的锚点,结束语同一个CIG事件的最后一个CIS的最后一个子事件的结尾。同一个CIG的两个CIG事件不能覆盖(也就是说,上一个CIG事件的最后一个CIS事件需要在下一个CIG事件的第一个CIS锚点之前结束)。

master的链路层向slave的链路层提供定时参数(CIS_Sync_Delay 和 CIG_Sync_Delay),以便于在应用层同步同步数据。

每个CIG事件都有一个CIG参考点以及CIG同步点,这些之间以CIG_Sync_Delay分隔开。每一个CIG事件都需要在CIG参考点之后开始以及CIG同步点之前结束。对于一个给定的CIGI,CIS锚点需要为CIG参考点后的一个固定偏移(可能为0)。因此CIG参考点以ISO_Interval进行分隔,CIG同步点也以ISO_Interval进行分隔。对于每个CIS,CIS_Sync_Delay需要等于CIS锚点到CIG同步点之间的时间。

图4.56展示了CIG事件的不同的元素:
在这里插入图片描述
注意:CIG_Sync_Delay将不少于CIG事件的最大可能时间。例如从CIG参考点到slave的最后一个子事件的包含Max_PDU数据包的时间。同样的CIG中所有的CISes将会有同样的值。每个CIS的CIS_Sync_Delay将会等于CIG_Sync_Delay减CIG参考点到CIS锚点之间的偏移。CIG事件实际最大可能的时间在CIG的所有CISes创建前无法确定,因此master发送的值为一个上限。

注意:CIS事件最大可能的时间为 :(NSE - 1 ) x Sub_Interval + MPTM +T_IFS + MPTS

注意:组成CIG事件的CIS事件不需要有同样的cisEventCounter值,但是计数器之间的差值在CIG的持续时间内需要相同。

4.5.14.2 多个CISes的排列

可以通过设置Sub_Interval的值以及相邻的CIS锚点之间的间距来使CIG中的CISes顺序或交叉排列。

如果是顺序排列,不同CISes的CIS事件不会进行覆盖并且所有的CIS事件的子事件一起产生。对于每一对相邻的CISes,他们的CIS锚点的间隔至少为NSE x Sub_Interval,使用较低编号的CIS的值。

如果是交叉排列,相邻CISes的第二个子事件紧跟着第一个子事件,依次排列。对于每个CIS,它的Sub_Interval至少需要是CIG所有CISes的SE_Length的值的和。对于相邻的一对CISes,他们CIS锚点之间的间隔至少需要是编号较低的CIS的SE_Length

图4.57展示了Num_CIS - 2NSE =2时CIG的各种CIS排列。
在这里插入图片描述

4.5.14.3 创建CIG

在Host配置了CIS属于的CIG以后,链路层才能创建CIS。

Host通过通知链路层CIG的Num_CIS以及每个CIG的每个CIS的内部配置来配置每个CIG。一旦Host要求链路层创建CIG的第一个CIS,Host不能再修改配置。

如果链路层无法按照请求的配置取调度CIG,则需要通知Host,并且不能创建CIG的任何CISes。

注意:Controller可以使用配置信息来判断是否能在不和其他活动冲突的情况下调度CIG的所有CISes。如果无法这样做,则需要再Host请求创建第一个CIS的时候通知Host。一旦成功创建调度,后续的CISes可以再没有冲突风险的情况下创建。

4.5.15 功率等级管理

支持功率管理的链路层需要管理给定对端设备的所有活动PHYs的功率等级以及它支持的其他非活动的PHYs的功率等级。对端设备的活动PHY为ACL链接的对端设备的当前PHY或相关的CIS的PHY。这意味着,当CIS在新的PHY上创建或ACL链接改变到一个新的PHY,如果链路层之前没有进行管理这个PHY的功率等级的话,必须开始管理这个PHY的功率等级。

当设备在管理PHY的功率等级,它需要存储这个PHY的功率等级,并且使用这个功率等级在发送所有使用这个PHY发到这个对端设备的数据包。设备在对端设备请求改变功率的时候可以改变功率等级或者自己主动改变功率等级。

如果设备开始管理一个PHY的功率等级(例如,PHY变为一个活动PHY),则需要在开始的时候选择一个初始功率等级。

如果PHY具有不止一个功率等级,因此出于本节的功率控制请求进程(见Section 5.1.17)和功率改变指示进程(见Section 5.1.18)的目的,不同的功率等级需要被认为是独立的PHY。在使用LE Coded PHY的情况下,两个功率等级为使用S = 8 payload发送数据包使用S = 2 payload发送数据包,功率等级在一个数据包发送期间不能进行改变,两个功率等级应同时激活或者注销。

路径损耗监测

Host可以请求Controller在ACL链接上进行路径损耗监测,这样的话,Host需要至少指定两个路径区域损耗,叫做LowMiddle区域以及第三个可选的High区域。Controller需要在路径损耗从一个区域到另一个区域时通知Host。路径损耗定义为远端设备发送功率等级以及链接中收到的平均RSSI之间的差值,如果测量平均值没有特别指定。Host需要指定每个方向的区域之间的边界以及可选的在新的区域中的最小时间。路径损耗可以在它达到了区域的上限时被认为进入了高等级的区域,在达到了区域的下限时被认为进入低等级的区域,如图4.58所示,在这两种情况下,至少花费了新区域中指定的最小时间。对于每对区域,上边界应大于或等于下边界,尽量不要相等以提供一些缓冲空间。

连续两次报告不能表明进入同一区域。

注意:

  • 路径损耗可以通过使用功率控制请求进程或功率改变指示进程来获取远端设备的功率等级并通过测量本地的RSSI来进行测量。
  • 路径损耗通常和对端设备的距离相关,因此移动到更高的区域一位置对端设备正在远离。
  • Controller可以使用相关物理链路的路径损耗如CISes来确定ACL连接上的路径丢失阙值事件。

在这里插入图片描述

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 这是一个 Docker 命令,作用是在本地主机上启动一个名为 centos7 的容器,并将其绑定到一个名为 my-vol 的本地卷。 具体参数解析如下: - `docker run`: 启动一个新的容器。 - `-it`: 表示以交互式模式运行容器。 - `--name=centos7`: 指定容器的名称为 centos7。 - `-v my-vol:/opt`: 将本地卷 my-vol 挂载到容器中的 /opt 目录下。 - `centos:7`: 指定要运行的镜像为 CentOS 7。 - `bash`: 在容器中运行 Bash 命令行 shell。 ### 回答2: docker run -it --name=centos7 -v my-vol:/opt centos:7 bash表示使用Docker运行一个基于CentOS 7基础镜像的容器,并且通过bind mount的方式将主机上的my-vol目录挂载到容器内的/opt目录上。 - `-it`参数是告诉Docker以交互式模式运行容器,并且分配一个伪终端。 - `--name=centos7`参数是给容器命名为centos7,方便后续对容器的管理和操作。 - `-v my-vol:/opt`参数是在容器启动时将主机上的my-vol目录挂载到容器内的/opt目录,这样容器内的/opt目录就可以直接访问主机上的my-vol目录的内容。 - `centos:7`表示使用CentOS 7作为基础镜像。 - `bash`表示容器启动后默认进入bash shell终端,可以在容器内执行命令。 综上所述,该命令的作用是在Docker中创建一个以CentOS 7为基础镜像的容器,该容器以交互式模式运行,并且将主机上的my-vol目录挂载到容器内的/opt目录,同时进入容器的bash shell终端。这样可以在容器内执行一些需要在CentOS 7环境下运行的命令或程序,并且可以直接访问主机上的my-vol目录的内容。 ### 回答3: `docker run -it --name=centos7 -v my-vol:/opt centos:7 bash`是一个Docker命令,用于在Docker容器中运行一个CentOS 7镜像并创建一个名为"centos7"的容器。 解析该命令的各个部分如下: - `docker run`:运行一个新的容器。 - `-it`:以交互模式启动容器,在终端中可以执行命令并与容器进行交互。 - `--name=centos7`:指定容器的名称为"centos7",方便后续对容器的操作。 - `-v my-vol:/opt`:将本地主机的目录"my-vol"挂载到容器内部的"/opt"目录,实现主机目录和容器目录的数据共享。 - `centos:7`:指定使用的镜像为CentOS 7。 - `bash`:在容器中执行的启动命令,即在容器内启动一个Bash终端。 总结来说,该命令的作用是创建一个名为"centos7"的容器,使用CentOS 7镜像,并在容器内部启动一个Bash终端。同时,将本地主机的"my-vol"目录挂载到容器的"/opt"目录,以实现数据共享。这样可以通过交互式终端来执行命令,并且在容器内进行文件操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值