第一部分:HCI协议(八)具体的HCI command和event(10、CONNECTION STATE)

只介绍常用的几个

(1)Mode Change Event

这个event用来表明Connection_Handle表示的ACL连接在Active、Hold、Sniff以及Park模式进行了切换

参数说明:

Status(1 Octet):0x00表示mode change已经发生;0x01-0xFF表示Hold_Mode、Sniff_Mode、Exit_Sniff_Mode、Park_State或者Exit_Park_State command失败

Connection_Handle(2 Octet 前12bit有效):表示具体哪个connection发生了Mode Change

Current_Mode(1 Octet):表示当前connection处于哪种模式

Interval(2 Octet):取值范围: Hold、Sniff、Park模式是0x0002-0xFFFE,Active模式这个值没有意义

Hold模式:Interval Length = Interval * 0.625 msec,表示在hold模式下等待interval个slot,1个slot就是0.625ms

Sniff模式:Interval Length = Interval * 0.625 msec,表示两个sniff锚点间隔interval个slot,1个slot就是0.625ms

Park模式:Interval Length = Interval * 0.625 msec,表示两个连续的beacons之间间隔interval个slot,1个slot就是0.625ms

举例说明:

Mode Change Event

0x04:表示HCI Event Packet

0x14:表示这个event是Mode Change Event

0x06:表示Parameter_Total_Length即6个byte

0x00:表示status是success

0x0003:表示Connection_Handle=0x0003

0x02:表示当前是sniff模式

0x0096:表示sniff模式持续时间是93.75ms

(2)Max Slots Change Event

这个event是controller用来通知Host参数LMP_Max_Slots的值发生了变化

参数说明:

Connection_Handle(2 Octet):表示具体哪个connection的LMP_Max_Slots值发生了变化(ACL connection)

LMP_Max_Slots(1 Octet):用于基带数据包的最大slots值,取值范围:0x01, 0x03, 0x05

举例说明:

Max Slots Change Event

0x04:表示HCI Event Packet

0x14:表示这个event是Max Slots Change Event

0x0003:表示Connection_Handle=0x0003

0x05:表示LMP_Max_Slots = 5

(3)Hold Mode Command

先简单介绍一下hold模式:

Hold模式是就是蓝牙的一种节能模式,进入hold模式之前,master和slave需要对hold模式持续时间进行协商,一旦进入hold模式,此连接就不在支持ACL数据包,但是仍然支持SCO,

在hold模式下,slave只能保持LT_ADDR,当hold模式持续时间结束后,slave会醒来

这个命令用来使Connection_Handle表示的ACL连接进入hold模式,Hold_Mode_Max_Interval和Hold_Mode_Min_Interval用来表示host希望connection在hold模式持续多久,Hold_Mode_Max_Interval表示hold模式下持续时间的最大值,Hold_Mode_Min_Interval表示hold模式下持续时间的最小值,具体时间是本地设备根据Hold_Mode_Max_Interval和Hold_Mode_Min_Interval与远端设备进行协商确定的,协商完成后,controller会使用Mode Change event返回协商结果

注意:

a) Link Supervision Timeout > Hold_Mode_Min_Interval >= Hold_Mode_Max_Interval

b) 如果一个连接处于hold模式,那么host发送给controller的数据会被controller缓存(一直到hold模式结束才会被发送,连接断开或者flush则会将数据丢掉)

参数说明:

Connection_Handle(2 Octet):表示具体使哪个connection的进入hold模式(只能是ACL connection)

Hold_Mode_Max_Interval(2 Octet):表示hold模式下持续时间的最大值,取值范围0x0002-0xFFFE,只能是偶数,对应的Time = 这个值 * 0.625 msec

Hold_Mode_Min_Interval(2 Octet):表示hold模式下持续时间的最小值,取值范围0x0002-0xFF00,只能是偶数,对应的Time = 这个值 * 0.625 msec

举例说明:(暂时没有)

(4)Sniff Mode Command

首先说一下什么是sniff模式(其他细看core文档和Bluetooth sniff white paper):

Sniff模式就是让slave的活动程度降低(active模式时,slave需要监听每个ACL slot,sniff模式下,slave可以减少监听ACL slot的数量,因此master只需要在slave监控的时候发送数据就可以)

如下图所示:

Sniff模式需要了解几个名词:

Sniff锚点:表示slave开始监控master to slave slot的位置,锚点只能是偶数(master to slave slot只能是偶数)

Sniff interval(Tsniff):表示两个sniff锚点的间隔

Nsniff attempt:表示slave在每个sniff interval中监听的master-to-slave的slot数量,如下图所示,Nsniff attempt=3,表示slave必须在锚点到来后的3个slot内保持监听状态(由于master-to-slave和slave-to-master的slot是交叉出现的,因此图中Nsniff_attempt的持续时间为3+2=5个slot),如果在Nsniff_attempt期间slave没有收到master的数据,那么slave就可以进入休眠状态了。

注意:1<=Nsniff_attempt<=Tsniff/2

Nsniff timeout:这个值表示如果在Nsniff_attempt期间收到master的数据,那么slave还需要继续监听Nsniff_timeout数量的master-to-slave slot,这个值得作用是使master和slave不用等待下一个锚点到来才能交换数据。注意,一旦收到数据,slave就必须重新等待Nsniff_timeout个slot。

如下图所示:

在Nsniff attempt内接收到了master的数据,这个slot结束后,会继续监听Nsniff timeout个slot即2个slot,在第三个master to slave slot又接收到个master的数据,所以又会继续监听Nsniff timeout个slot即2个slot

Sniff Mode Command这个命令用来使Connection_Handle表示的ACL连接进入sniff模式, Sniff_Max_Interval和Sniff_Min_Interval表示host希望connection进入sniff mode时的sniff interval,具体时间controller会使用Mode Change event返回

参数说明:

Connection_Handle(2 Octet):表示具体使哪个connection的进入sniff模式(只能是ACL connection)

Sniff_Max_Interval(2 Octet):表示sniff interval的最大值,取值范围:0x0002 to 0xFFFE,只能是偶数,对应的Time = 这个值 * 0.625 msec

Sniff_Min_Interval(2 Octet):表示sniff interval的最小值,取值范围:0x0002 to 0xFFFE,只能是偶数,对应的Time = 这个值 * 0.625 msec

Sniff_Attempt(2 Octet):这个值表示的是Nsniff attempt的值,取值范围:0x0001 to 0x7FFF,对应的Time = 这个值 * 1.25 msec

Sniff_Timeout(2 Octet):这个值表示的是Nsniff timeout的值,取值范围:0x0001 to 0x7FFF,对应的Time = 这个值 * 1.25 msec

注意:

a) Link Supervision Timeout > Sniff_Max_Interval >= Sniff_Min_Interval

b) 如果一个连接处于sniff模式,那么host发送给controller的数据会被controller缓存(一直到可以发送的时候才会被发送,连接断开或者flush则会将数据丢掉)

举例说明:

Command如下:

0x01:表示HCI Command Packet

0x0803:表示是HCI_Sniff_Mode command

指令的OGF是0x02即0000 10

OCF是0x0003即00 0000 0011

所以整个opcode是0000 1000 0000 0011即0x0803

0x0a:表示Parameter_Total_Length=10,即参数总长度是10个byte

0x0003:表示Connection_Handle,这个Connection_Handle是一个ACL连接

0x0320:表示Sniff_Max_Interval=0x0320,即0x0320 * 0.625=500ms

0x0190:表示Sniff_Min_Interval=0x0190,即0x0190 * 0.625=250ms

0x0004:表示Sniff_Attempt=4,即4 * 1.25 = 5ms

0x0001:表示Sniff_Timeout=1,即1 * 1.25 = 1.25ms

对应的Event:

Command Status event:

0x04:表示HCI Event Packet

0x0f:表示这个event是command status event

0x04:表示Parameter_Total_Length即4个byte

0x00:表示status是success

0x01:表示Num_HCI_Command_Packets

0x00803:表示是HCI_Sniff_Mode command

Mode Change Event(失败的)

0x04:表示HCI Event Packet

0x14:表示这个event是Mode Change Event

0x06:表示Parameter_Total_Length即6个byte

0x11:表示status是0x11即Status: Unsupported Feature or Parameter Value

0x0003:表示Connection_Handle=0x0003

0x00:表示当前是active模式

0x0320:这个实际是没有什么意义的。

(5)Sniff Subrating Command

先来介绍一个下Sniff Subrating(减速呼吸模式)

Sniff Subrating就是对比sniff模式有更少的锚点,sniff mode和sniff subrating mode之间的转换按照下面的图进行:

a)Sniff模式时,如果设备在sniff mode timeout(就是这个命令中的Minimu_Remote_Timeout和Minimum_Local_Timeout,一个是针对remote device的,一个是针对local device)时间内没有接收到包含ACL-U或者ACL-C的数据包(注意:NULL and POLL数据包也算没接收到),则设备进入sniff subrating模式,如果在sniff mode timeout时间内接收到ACL-U或者ACL-C的数据包,那么sniff mode timeout会重新计时。

b)sniff subrating模式时,如果设备接收到包含ACL-U或者ACL-C的数据包,则设备会进入sniff模式

c)处于sniff subrating模式的slave device如果发送一个数据包在收到回复之前会临时进入sniff mode

Sniff_Subrating命令是用来指定Connection_Handle表示的连接的sniff subrating 模式的参数,如果没有设置sniff subrating的参数,则会使用默认的参数(Tsniff),如果当前设备不处于sniff mode,那么使用这个命令后,当设备进入sniff mode,Link Manager会进行sniff subrating协商,如果当前设备正在sniff mode,则会立即进行sniff subrating协商,协商完成后controller会产生一个Sniff Subrating event

参数说明:

Connection Handle(2 Octet):用来表示一个ACL连接

Maximum_Latency(2 Octet):这个值是用来计算maximum_sniff subrate,表示允许远端设备协商maximum_sniff subrate时的最大值,和远端设备协商后,可能小于这个值,取值范围:0x0002 – 0xFFFE ,对应的Time = 这个值 * 0.625 ms (1 Baseband slot)

Minimum_Remote_Timeout(2 Octet):远端设备最小的sniff subrate timeout值,协商后可能大于这个值,取值范围:0x0002 – 0xFFFE ,对应的Time = 这个值 * 0.625 ms (1 Baseband slot)

Minimum_Local_Timeout(2 Octet):本地设备最小的sniff subrate timeout值,协商后可能大于这个值,取值范围:0x0002 – 0xFFFE ,对应的Time = 这个值 * 0.625 ms (1 Baseband slot)

返回参数说明:

Status(1 Octet):0x00表示成功,其他值表示失败

Connection Handle(2 Octet):用来表示一个ACL连接

举例说明:

Command如下:

0x01:表示HCI Command Packet

0x0811:表示是HCI_Sniff_Subrating command

指令的OGF是0x02即0000 10

OCF是0x0011即00 0001 0001

所以整个opcode是0000 1000 0001 0001即0x0811

0x08:表示Parameter_Total_Length=8,即参数总长度是8个byte

0x000c:表示Connection_Handle,这个Connection_Handle是一个ACL连接

0x04b0:表示Maximum_Latency=0x04b0,即0x04b0 * 0.625=750ms

0x0002:表示Minimum_Remote_Timeout=0x0002,即2 * 0.625=1.25ms

0x0002:表示Minimum_Local_Timeout=0x0002,即2 * 0.625=1.25ms

对应的Event:

Command Complete event:

0x04:表示HCI Event Packet

0x0e:表示这个event是command Complete event

0x06:表示Parameter_Total_Length即6个byte

0x01:表示Num_HCI_Command_Packets

0x0811:表示是HCI_Sniff_Subrating command

0x00:表示status是success

0x000c:表示Connection_Handle,这个Connection_Handle是一个ACL连接

如下图所示,由于当前不处于sniff mode,所以并没有和远端设备进行协商,一直到本地设备进入sniff mode,才进行的协商

Sniff Subrating Event

0x04:表示HCI Event Packet

0x2e:表示这个event是Sniff Subrating Event

0x0b:表示Parameter_Total_Length即b个byte

0x00:表示status是success

0x000c:表示Connection_Handle,这个Connection_Handle是一个ACL连接

0x031e:表示Maximum_Transmit_Latency=0x031e,即0x031e * 0.625 = 498.75ms

0x031e:表示Maximum_Receive_Latency=0x031e,即0x031e * 0.625 = 498.75ms

0x0002:表示Minimum_Remote_Timeout=0x0002,即2 * 0.625=1.25ms

0x0002:表示Minimum_Local_Timeout=0x0002,即2 * 0.625=1.25ms

(6)Sniff Subrating Event

这个event表示Connection_Handle表示的 ACL connection已经enabled sniff subrating并且相关参数已经协商完成

参数说明:

Status(1 Octet):0x00表示Sniff_Subrating command已经成功

Connection_Handle(2 Octet):用来表示一个ACL连接

Maximum_Transmit_Latency(2 Octet):本地设备向远端设备发送数据的最大延迟,取值范围:0x0002 – 0xFFFE ,对应的Time = 这个值 * 0.625 ms (1 Baseband slot)

Maximum_Receive_Latency(2 Octet):本地设备接收来自远端设备的数据的最大延迟,取值范围:0x0002 – 0xFFFE ,对应的Time = 这个值 * 0.625 ms (1 Baseband slot)

Minimum_Remote_Timeout(2 Octet):远端设备使用的sniff subrate timeout,取值范围:0x0002 – 0xFFFE ,对应的Time = 这个值 * 0.625 ms (1 Baseband slot)

Minimum_Local_Timeout(2 Octet):本地设备使用的sniff subrate timeout,取值范围:0x0002 – 0xFFFE ,对应的Time = 这个值 * 0.625 ms (1 Baseband slot)

举例说明:

Sniff Subrating Event

0x04:表示HCI Event Packet

0x2e:表示这个event是Sniff Subrating Event

0x0b:表示Parameter_Total_Length即b个byte

0x00:表示status是success

0x000c:表示Connection_Handle,这个Connection_Handle是一个ACL连接

0x031e:表示Maximum_Transmit_Latency=0x031e,即0x031e * 0.625 = 498.75ms

0x031e:表示Maximum_Receive_Latency=0x031e,即0x031e * 0.625 = 498.75ms

0x0002:表示Minimum_Remote_Timeout=0x0002,即2 * 0.625=1.25ms

0x0002:表示Minimum_Local_Timeout=0x0002,即2 * 0.625=1.25ms

(7)Exit Sniff Mode Command

这个命令用来结束Connection_Handle(ACL连接)对应的连接的sniff模式

参数说明:

Connection_Handle(2 Octet):用来表示一个ACL连接

举例说明:

Command如下:

0x01:表示HCI Command Packet

0x0804:表示是HCI_Exit_Sniff_Mode command

指令的OGF是0x02即0000 10

OCF是0x0004即00 0000 0100

所以整个opcode是0000 1000 0000 0100即0x0804

0x02:表示Parameter_Total_Length=2,即参数总长度是2个byte

0x0003:表示Connection_Handle,这个Connection_Handle是一个ACL连接

对应的Event:

Command Status event:

0x04:表示HCI Event Packet

0x0f:表示这个event是command status event

0x04:表示Parameter_Total_Length即4个byte

0x0C:表示status是0x0c,即Status: Command Disallowed

0x01:表示Num_HCI_Command_Packets

0x0804:表示是HCI_Exit_Sniff_Mode command

上面这个command是失败的,如果是成功的,后面还会有下面的Mode Change Event

Mode Change Event

0x04:表示HCI Event Packet

0x14:表示这个event是Mode Change Event

0x06:表示Parameter_Total_Length即6个byte

0x00:表示status是success

0x0003:表示Connection_Handle=0x0003

0x00:表示当前是active模式

0x0000:这个实际是没有什么意义的。

(8)Park State Command

首先简单介绍一下parkstate:

PARK state可以最大限度的节省电源,park state时,slave不在参与channel上的活动,但是需要和channel保持同步,因此在parkstate下,slave不在拥有LT_ADDR(logical transport address),master会分配给slave PM_ADDR和AR_ADDR。

PM_ADDR: 8bit Parked Member Address,master可能使用PM_ADDR来发起unpark程序,也可能使用48bit的BD_ADDR,假如PM_ADDR是全0,那么master只能使用BD_ADDR发起unpark程序

AR_ADDR: 8bit Access Request Address,slave使用AR_ADDR来发起unpark程序。

除了低功耗,Parkstate还有一个优点,一个master最多只能连接7个slave,有了park状态以后,一个master可以有7个处于connectionstate的slave,如果使用PM_ADDR区分slave的话,还可以有255个处于parkstate的slave(如果使用BD_ADDR区分slave的话,理论上可以有无数个slave)

这里有四个问题需要理清:

第一个:PARK state的slave如何在channel上与master保持同步?

A)master要每隔固定的时间TB建立一个beacon train(每个beacontrain的开头称为beacon instant),一个beacon train是由NB个beaconslot组成的(NB>=1),每个beacon slot之间要保持固定的时间间隔△B,恋歌beacon instant之间的时间间隔是TB;如下图所示

注意:如果没有信息要发送给slave,master一般会发送NULL packet,如果需要发送信息数据包给parkedslave,那么在整个beacon train的beaconslot都要重复发送这个信息数据包。

B)Parked slaves会定期醒来去同步channel,一般来说,一个parkedslave会在beaconinstant处醒来,然后去读取beaconslot上的消息(如果读取失败,则会在下一个beaconslot再去读取,在失败就再读取下一个,所以最多会读取NB次)

注意:parkedslave可能不会在每个beacon instant处都醒来,可能每隔NB_sleep个TB才醒来一次,如下图所示:

这样parkedslave就可以完成和master的同步。

第二个:master如何轮询Parkedslave?

这里就要提到一个名词:Beacon Access Window

Beacon Access Window是用来让parkedslave发送unpark请求的,一般Beacon Access Window会连续出现Maccess(Maccess>=1)次,Beacon Access Window在beacon instant后的Daccess时间出现,每个Beacon Access Window的持续时间称为Taccess,如下图所示:

Beacon Access Window的内部结构是这样的:Beacon Access Window开始的位置称为Start of access window,master-to-slave和slave-to-master slot交替出现,每个slave-to-master slot被分成2个半slot(每个半slot时间是312.5us),每个半slot对应一个parkedslave的AR_ADDR,下图所示:

第一个半slot对应的是AR_ADDR=1的parked slave,第二个半slot对应的是AR_ADDR=2的arked slave,以此类推

 

 

如果在前面的master-to-slave收到了广播数据包,那么parked slave才能在自己对应的半slot发送access request,这样master可以在每个Beacon Access Window对所有的parked slaves进行轮询

第三个:master如何unpark对应的parked slave

A)首先master需要发送一个LMP unpark command,这个command里面要包含想要unpark的slave的地址(PM_ADDR或者BD_ADDR)

B)然后这个unpark的消息就会包含在广播数据包里面被发送到beacon slots(这个消息里面需要包含LT_ADDR,这个地址将会在parkedslave重新进入网络时被使用),如果unpark多个parkedslave时,这个消息里面需要包含多个LT_ADDR

C)当parkedslave接收到这个unpark消息时,它就会检测消息里面的PM_ADDR或者BD_ADDR,如果与自己的PM_ADDR或者BD_ADDR相匹配,那么这个slave就会取消park状态进入CONNECTION状态

D)然后这个slave将会持续监听master,直到master可以通过LT_ADDR定位到他为止,定位的过程是这样的:master首先发送一个POLL数据包,然后slave会回复一个数据包表示自己已经解除park状态。如果master一定时间内没有收到回复的数据包,那么master会再次unpark这个slave(使用相同的LT_ADDR),一直到收到linksupervision timeout或者unpark成功完成,如果slave在一定时间内没有到POLL数据包,那么这个slave会重新进入park state(beacon参数与之前相同)

E)当master确定这个slave已经进入CONNECTION状态,那么这个master会设置slave进入对应的模式。

F)当slave unpark以后,master和slave的Link的SEQN bit会设置成1(SEQN是啥?暂时不清楚)

第四个:parkedslave如何请求unpark

A) parkedslave可以在beaconaccess window中自己对应的slave-to-master半slot处发送进入channel请求,这个进入channel请求数据包是一个包含master的DAC(device access code是啥?暂时不清楚)的ID packet

B)发送了进入channel请求以后,这个parkedslave会监听来自master的unpark消息,只要parkedslave没有收到unpark消息,那么他会在下一个beaconaccesswindow继续发送进入channel请求,如果最后一个Beaconaccesswindow(最多Maccess个)还是没有收到unpark消息,它会继续监听Npoll个slot,如果这个时间内还是没有收到unpark消息,这个slave会重新进入睡眠状态,然后在下一个beacon instant到来时再吃尝试

C)如果接受到来自master的unpark消息,这个parked slave会匹配PM_ADDR或者BD_ADDR,如果匹配成功,则这个parkedslave会离开PARK state进入CONNECTION state

D)然后这个slave将会持续监听master,直到master可以通过LT_ADDR定位到他为止,定位的过程是这样的:master首先发送一个POLL数据包,然后slave会回复一个数据包表示自己已经解除park状态。如果一定时间内没有接收到slave回复的数据包,那么master会重新给这个slave发送unpark消息。如果一定时间内slave没有接收到POLL数据包,那么这个slave会重新进入park state(beacon参数与之前相同)

E)当master确定这个slave已经进入CONNECTION状态,那么这个master会设置slave进入对应的模式。

F)当slave unpark以后,master和slave的Link的SEQN bit会设置成1(SEQN是啥?暂时不清楚)

Park State Command这个命令用来使连接进入park state

参数说明:

Connection_Handle(2 Octet):用来表示一个ACL连接

Beacon_Max_Interval(2 Octet):指定两个beacon之间最大间隔多少个slot(即TB的最大值),取值范围:0x000E to 0xFFFE(偶数才有效),对应的Time = 这个值 * 0.625 ms (1 Baseband slot)

Beacon_Min_Interval(2 Octet):指定两个beacon之间最小间隔多少个slot(即TB的最小值),取值范围:0x000E to 0xFFFE(偶数才有效),对应的Time = 这个值 * 0.625 ms (1 Baseband slot)

主意:

A)beacon interval的真实大小会在和远端设备协商以后,通过Mode Change event返回,另外Beacon_Max_Interval>= Beacon_Min_Interval

B)当host发送Park State command给BR/EDR Controller时,与远端设备之间的SCO连接是不允许存在的,如果存在,Command Status event或者Mode Change event会返回error code(0x0C Command Disallowed)

C)如果host发送数据给BR/EDR Controller时,其中的Connection_Handle对应一个已经处于park状态的连接,BR/EDR Controller会保存这些数据在缓冲区一直到数据可以发送(connection unpark)或者数据被flush或者连接断开

举例说明:(暂时没有)

(9)Exit Park State Command

这个命令用来使BR/EDR Controller从park state切换到active mode

Connection_Handle(2 Octet):用来表示一个处于park状态的ACL连接

举例说明:(暂时没有)

(10)Read Link Policy Settings Command

这个命令用来获取Connection_Handle对应ACL连接的Link Policy settings

参数说明:

Connection_Handle(2 Octet):用来表示一个ACL连接

返回参数说明:

Status(1 Octet):0x00表示成功,其他值表示失败

Connection_Handle(2 Octet):用来表示一个ACL连接

Link_Policy_Settings(2 Octet):用来设置本地Link Manager在Connection_Handle对应的ACL连接上关于Role switch、park state、hold mode、sniff mode上的处理策略,通过设置enable为0/1来使本地Link Manager自动拒绝或者接受远端Link Manager的请求(也可能是本地Link Manager自己的请求),具体配置如下图所示

举例说明:(暂时没有)

(11)Write Link Policy Settings Command

这个命令用来设置Connection_Handle对应的ACL连接的Link Policy settings

参数说明:

Connection_Handle(2 Octet):用来表示一个ACL连接

Link_Policy_Settings(2 Octet):用来设置本地Link Manager在Connection_Handle对应的ACL连接上关于Role switch、park state、hold mode、sniff mode上的处理策略,通过设置enable为0/1来使本地Link Manager自动拒绝或者接受远端Link Manager的请求(也可能是本地Link Manager自己的请求),具体配置如下图所示

返回参数说明:

Status(1 Octet):0x00表示成功,其他值表示失败

Connection_Handle(2 Octet):用来表示一个ACL连接

举例说明:

0x01:表示HCI Command Packet

0x080d:表示是HCI_Write_Link_Policy_Settings command

指令的OGF是0x02即0000 10

OCF是0x000d即00 0000 1101

所以整个opcode是0000 1000 0000 1101即0x080d

0x04:表示Parameter_Total_Length=4,即参数总长度是4个byte

0x000C:表示Connection_Handle,这个Connection_Handle是一个ACL连接

0x0005:表示Link_Policy_Settings=0x0005,即0000 0000 0000 1001,即Enable Role Switch、Enable Sniff Mode、disable Hold Mode、disable Park State

对应的Event:

Command Complete event:

0x04:表示HCI Event Packet

0x0e:表示这个event是command complete event

0x06:表示Parameter_Total_Length即6个byte

0x01:表示Num_HCI_Command_Packets

0x080d:表示是HCI_Write_Link_Policy_Settings command

0x00:表示status是0x00

0x000C:表示Connection_Handle,这个Connection_Handle是一个ACL连接

(12)Read Default Link Policy Settings Command

这个命令用来获取BR/EDR controller的Default Link Policy setting(表示所有新建立的连接默认使用的初始的Link Policy setting)

返回参数说明:

Status(1 Octet):0x00表示成功,其他值表示失败

Default_Link_Policy_Settings(2 Octet):表示所有新建立的连接默认使用的初始的Link Policy settings

举例说明:(暂时没有)

(13)Write Default Link Policy Settings Command

这个命令用来设置BR/EDR controller的Default Link Policy setting(表示所有新建立的连接默认使用的初始的Link Policy setting)

参数说明:

Default_Link_Policy_Settings(2 Octet):表示所有新建立的连接默认使用的初始的Link Policy settings

返回参数说明:

Status(1 Octet):0x00表示成功,其他值表示失败

举例说明:

0x01:表示HCI Command Packet

0x080f:表示是HCI_Write_Default_Link_Policy_Settings command

指令的OGF是0x02即0000 10

OCF是0x000f即00 0000 1111

所以整个opcode是0000 1000 0000 1111即0x080f

0x02:表示Parameter_Total_Length=2,即参数总长度是2个byte

0x0005:表示Default_Link_Policy_Settings=0x0005,即0000 0000 0000 1001,即Enable Role Switch、Enable Sniff Mode、disable Hold Mode、disable Park State

对应的Event:

Command Complete event:

0x04:表示HCI Event Packet

0x0e:表示这个event是command complete event

0x04:表示Parameter_Total_Length即4个byte

0x01:表示Num_HCI_Command_Packets

0x080f:表示是HCI_Write_Default_Link_Policy_Settings command

0x00:表示status是0x00

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值