(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表示成功,其他值表示失敗
舉例説明:(暫時沒有)