第一部分:HCI协议(八)具体的HCI command和event(15、HOST FLOW CONTROL)
(1)Set Controller To Host Flow Control Command
这个命令是Host用来开启/关闭从Controller到Host的流控(ACL数据和(e)SCO数据),如果不使用这个命令,ACL数据和(e)SCO数据的流控一般来说默认都是开启的(不确定,一般都不下这个命令)。
参数说明:
Flow_Control_Enable(1 Octet):取值范围如下
返回参数说明:
Status(1 Octet):0x00表示成功,其他值表示失败
举例说明:(暂时没有)
(2)Host Buffer Size Command
这个命令是Host用来通知controller自己有多大的缓冲区(length * packets)可以被controller用来传输ACL和(e)SCO数据,然后controller会根据这个命令的配置来发送数据,这个命令是跟Host_Number_Of_Completed_Packets command一块使用的:
第一步:host发送HCI Reset进行初始化
第二步:host发送HCI_Set_Controller_To_Host_Flow_Control设置支持/不支持哪几种流控(不使用一般默认ACL和(e)SCO流控都开启,一般都不用
第三步:Host发送HCI_Host_Buffer_Size通知controller可以使用的Host_ACL_Data_Packet_Length、Host_Synchronous_Data_Packet_Length、Host_Total_Num_ACL_Data_Packets、Host_Total_Num_Synchronous_Data_Packets
第四步:host发送ALC和(e)SCO数据分别不能超过Host_ACL_Data_Packet_Length和Host_Synchronous_Data_Packet_Length,发送一个packet,host端会记录发送的数量,例如host发送了一个ACL数据包,则当前剩余可发送的ACL数据包就是Host_Total_Num_ACL_Data_Packets – 1
第五步:host收到这一包ACL数据后,会进行处理,处理完以后,然后发送Host_Number_Of_Completed_Packets给controller,通知controller释放了几个packet,因为收到一包数据并且处理完了一包,所以就是1个packet
第六步:controller收到Host_Number_Of_Completed_Packets以后,因为参数是1,所以当前剩余可发送的ACL数据包就是Host_Total_Num_ACL_Data_Packets – 1 + 1个数据包
第七步:重复第五步和第六步
注意:Host_ACL_Data_Packet_Length和Host_Synchronous_Data_Packet_Length中不包括HCI Data Packet header的长度
参数说明:
Host_ACL_Data_Packet_Length(2 Octet):host可以接收的最大ACL数据包长度
Host_Synchronous_Data_Packet_Length(1 Octet):host可以接收的最大(e)SCO数据包长度
Host_Total_Num_ACL_Data_Packets(2 Octet):host最大可以存储ACL数据包的数量
Host_Total_Num_Synchronous_Data_Packets(2 Octet):host最大可以存储(e)SCO数据包的数量
返回参数说明:
Status(1 Octet):0x00表示成功,其他值表示失败
举例说明:
Command如下:
0x01:表示HCI Command Packet
0x0C33:表示是HCI_Host_Buffer_Size command
指令的OGF是0x03即0000 11
OCF是0x0033即00 0011 0011
所以整个opcode是0000 1100 0011 0011即0x0C33
0x07:表示Parameter_Total_Length=7,即参数总长度是7个byte
0x069b:表Host_ACL_Data_Packet_Length为1691byte
0xff:表示Host_Synchronous_Data_Packet_Length为255byte
0x0014:表示Host_Total_Num_ACL_Data_Packets为20个数据包
0x000a:表示Host_Total_Num_Synchronous_Data_Packets为10个数据包
对应的Event:
Command Complete event:
0x04:表示HCI Event Packet
0x0e:表示这个event是command complete event
0x04:表示Parameter_Total_Length即4个byte
0x01:表示Num_HCI_Command_Packets
0x0C33:表示是HCI_Host_Buffer_Size command
0x00:表示status为0
(3)Host Number Of Completed Packets Command
这个命令是Host发送给controller,通知controller与上一个Host_Number_Of_Completed_Packets命令比较,每个Connection Handle已经处理完成多少个数据包,即有多少个数据包的空间被释放。
注意:正常情况下,host发送Host_Number_Of_Completed_Packets命令以后不会收到任何event,但是如果Host_Number_Of_Completed_Packets命令中的某一个或者某几个参数无效,那么host会收到Command Complete event,其中status是Invalid HCI Command Parameters error code
参数说明:
Number_Of_Handles(1 Octet):表示一共有多少connection
Connection_Handle[i] (2 Octet):表示具体每个connection是多少
Host_Num_Of_Completed_Packets [i] (2 Octet):这个参数与Connection_Handle[i]的i相对应表示每个handle对应的处理完成的packet的数量
举例说明:(暂时没有)
(4)Set Event Mask Command
这个命令用来设置controller具体产生哪些events,“LE Meta Event” bit可以enable/disable所有的LE event
参数说明:
Event_Mask(8 Octet):具体取值如下:
举例说明:
Command如下:
0x01:表示HCI Command Packet
0x0C01:表示是HCI_Set_Event_Mask command
指令的OGF是0x03即0000 11
OCF是0x0001即00 0000 0001
所以整个opcode是0000 1100 0000 0001即0x0C01
0x08:表示Parameter_Total_Length=8,即参数总长度是8个byte
0x3d bf ff ff ff ff ff ff:表示Event_Mask的值,具体参考上面的表,这个顺序跟上面表格中的顺序是一样的
对应的Event:
Command Complete event:
0x04:表示HCI Event Packet
0x0e:表示这个event是command complete event
0x04:表示Parameter_Total_Length即4个byte
0x01:表示Num_HCI_Command_Packets
0x0C01:表示是HCI_Set_Event_Mask command
0x00:表示status为0
(5)Set Event Filter Command
这个命令可以用来设置event过滤器,hci reset以后,默认是没有任何过滤器的,并且Auto_Accept_Flag=off(这个参数用来设置是否自动接受连接请求),如果event过滤器设置满了,则会报错:Memory Full error code
如果Filter_Type != 0 && Filter_Condition_Type != 0x00,每次发送这个命令就会增加一个event过滤器(不会覆盖旧的过滤器)
如果Filter_Type == 0x00,发送这个命令会清空所有的event过滤器同时设置Auto_Accept_Flag=off,注意这时候只有Filter_Type一个参数,不能使用Filter_Condition_Type和Condition
如果Filter_Type != 0 && Filter_Condition_Type == 0x00,那么只有清理这个Filter_Type相关的event过滤器
Filter_Type取值有3种:
A、Inquiry Result过滤器:用来过滤Inquiry Result events的(分为三种Filter_Condition_Type,可以设置其中的一种或者几种)
a、搜索过程中返回所有设备的response
b、搜索过程中只返回有特定Class of Device的设备的response
c、搜索过程中只返回有特定BD_ADDR的设备的response
B、Connection Setup过滤器:用来过滤连接的相关的event(Connection Complete或者Connection Request event)的(分为3种Filter_Condition_Type,可以设置其中的一种或者几种)
a、允许来自所有设备连接
b、只允许来自特定Class of Device的设备的连接
c、只允许来自特定BD_ADDR的设备的连接
这三种Filter_Condition_Type都有一个Condition:Auto_Accept_Flag,用来设置是否自动接受连接请求,自动接受则只会产生Connection Complete event,不自动接受则会先产生Connection Request event,host接受以后,连接建立完成,会再产生Connection Request event
注意:
A、即使设置了Auto_Accept_Flag=on,在Connection Complete event之前,还是会有Link Key Request、PIN Code Request和Link Key Notification event
B、当新的和旧的event过滤器冲突时,新的会覆盖旧的,例如:Connection Setup过滤器时,其他参数都一样,只有Auto-Accept_Flag不同,那么新的过滤器会覆盖旧的
参数说明:
Filter_Type(1 Octet) |
Filter_Condition_Type(1 Octet) |
Condition |
0x00(清理所有event过滤器) |
无(0 Octet) |
无(0 Octet) |
0x01(Inquiry Result) |
0x00(返回所有设备的response) |
无(0 Octet) |
0x01(返回特定COD设备的response) |
Class_of_Device(3 Octet) 默认值:0x000000返回所有设备的response 其他值:0xXXXXXX返回符合cod要求的设备的response |
|
Class_of_Device_Mask(3 Octet) 对COD参数的某个bit位不感兴趣则设置0 |
||
0x02(返回特定BD_ADDR设备的response) |
BD_ADDR(6 Octet)设备地址 |
|
0x02(Connection Setup) |
0x00(允许来自所有设备连接) |
Auto_Accept_Flag(1 Octet) 0x01:Auto_Accept_Flag=off,不自动接受连接请求 0x02:Auto_Accept_Flag=on,自动接受连接请求(role switch disabled) 0x03 Auto_Accept_Flag=on,自动接受连接请求(role switch enabled)如果是(e)SCO,与0x02效果一样 |
0x01(允许特定COD设备的连接) |
Class_of_Device(3 Octet) 默认值:0x000000允许所有设备的连接请求 其他值:0xXXXXXX允许符合cod要求的设备的设备的连接请求 |
|
Class_of_Device_Mask(3 Octet) 对COD参数的某个bit位不感兴趣则设置0,SCO连接时,如果COD不知道,则默认是接受连接的 |
||
Auto_Accept_Flag(1 Octet) 0x01:Auto_Accept_Flag=off,不自动接受连接请求 0x02:Auto_Accept_Flag=on,自动接受连接请求(role switch disabled) 0x03 Auto_Accept_Flag=on,自动接受连接请求(role switch enabled)如果是(e)SCO,与0x02效果一样 |
||
0x02(允许特定BD_ADDR设备的连接) |
BD_ADDR(6 Octet)设备地址 |
|
Auto_Accept_Flag(1 Octet) 0x01:Auto_Accept_Flag=off,不自动接受连接请求 0x02:Auto_Accept_Flag=on,自动接受连接请求(role switch disabled) 0x03 Auto_Accept_Flag=on,自动接受连接请求(role switch enabled)如果是(e)SCO,与0x02效果一样 |
举例说明:
Command如下:
0x01:表示HCI Command Packet
0x0C05:表示是HCI_Set_Event_Filter command
指令的OGF是0x03即0000 11
OCF是0x0005即00 0000 0101
所以整个opcode是0000 1100 0000 0101即0x0C05
0x02:表示Parameter_Total_Length=2,即参数总长度是2个byte
0x01:表示Filter_Type为Inquiry Result过滤器
0x00:表示搜索过程中返回所有设备的response
对应的Event:
Command Complete event:
0x04:表示HCI Event Packet
0x0e:表示这个event是command complete event
0x04:表示Parameter_Total_Length即4个byte
0x01:表示Num_HCI_Command_Packets
0x0C05:表示是HCI_Set_Event_Filter command
0x00:表示status为0
(6)Data Buffer Overflow Event
这个event表示Controller的数据缓冲区已经溢出
参数说明:
Link_Type(1 Octet): 表示ACL连接还是SCO连接,0x00表示SCO连接,0x01
表示ACL连接
举例说明:(暂时没有)
(7)Read Synchronous Flow Control Enable Command
这个命令用来获取Synchronous_Flow_Control_Enable的值。这个值只能在没有连接存在的情况下才能修改
返回参数说明:
Status(1 Octet):0x00表示成功,其他值表示失败
Synchronous_Flow_Control_Enable(1 Octet):这个参数是用来设置对于SCO连接BR/EDR Controller是否发送Number Of Completed Packets events for synchronous Connection_Handles. 0x00表示disable,0x01表示enable
举例说明:(暂时没有)
(8)Write Synchronous Flow Control Enable Command
这个命令用来设置Synchronous_Flow_Control_Enable的值,这个值只能在没有连接存在的情况下才能修改
参数说明:
Synchronous_Flow_Control_Enable(1 Octet):这个参数是用来设置对于SCO连接BR/EDR Controller是否发送Number Of Completed Packets events for synchronous Connection_Handles. 0x00表示disable,0x01表示enable
返回参数说明:
Status(1 Octet):0x00表示成功,其他值表示失败
举例说明:(暂时没有)