第一部分:HCI协议(八)具体的HCI command和event(14、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_Type1 Octet

Filter_Condition_Type1 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表示成功,其他值表示失败

举例说明:(暂时没有)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值