只介绍常用的几个
(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