第一部分:HCI协议(八)具体的HCI command和event(9、SYNCHRONOUS CONNECTIONS 二)

(6)Read Voice Setting Command

第一部分:HCI协议(八)具体的HCI command和event(9、SYNCHRONOUS CONNECTIONS 二)

这个命令用来获取Voice_Setting的值

返回参数说明:

Status(1 Octet):0x00表示success;0x01-0xFF表示失败

Voice_Setting(2 Octet):语音连接的相关配置,用来配置Input Coding, Air coding format, input data format, Input sample size, and linear PCM parameter

举例说明:(暂时没有)

(7)Write Voice Setting Command

第一部分:HCI协议(八)具体的HCI command和event(9、SYNCHRONOUS CONNECTIONS 二)

参数说明:

Voice_Setting(2 Octet):语音连接的相关配置,用来配置Input Coding, Air coding format, input data format, Input sample size, and linear PCM parameter

返回参数说明:

Status(1 Octet):0x00表示success;0x01-0xFF表示失败

举例说明:

Command如下:

第一部分:HCI协议(八)具体的HCI command和event(9、SYNCHRONOUS CONNECTIONS 二)

0x01:表示HCI Command Packet

0x0426:表示是HCI_Write_Voice_Setting command

指令的OGF是0x01即0000 01

OCF是0x0026即00 0010 0110

所以整个opcode是0000 0100 0010 0110即0x0426

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

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

0x0060:表示Voice_Setting=0000 0000 0110 0000,即Air Coding Format:CVSD、Input Sample Size: 16-bit、Linear_PCM_Bit_Pos:0、Input Data Format: 2’s complement、Input Coding: Linear

对应的Event:

Command Complete event:

第一部分:HCI协议(八)具体的HCI command和event(9、SYNCHRONOUS CONNECTIONS 二)

0x04:表示HCI Event Packet

0x0e:表示这个event是command completeevent

0x04:表示Parameter_Total_Length即4个byte

0x01:表示Num_HCI_Command_Packets

0x0426:表示是HCI_Write_Voice_Setting command

0x00:表示status是success

(8)Enhanced Setup Synchronous Connection Command

第一部分:HCI协议(八)具体的HCI command和event(9、SYNCHRONOUS CONNECTIONS 二)

这个命令根据Connection_Handle建立一个新的SCO or eSCO或者修改一个已存在的eSCO

注意:

a)如果要建立一个新的SCO or eSCO,要使用ACL连接的Connection_Handle(新建立的SCO or eSCO将会和这个ACL关联在一起),但是如果ACL连接使用AES-CCM加密的,那么不能建立eSCO,只能建立SCO,如果此时要求建立eSCO,会返回Error code 0x0E(Connection Rejected Due to Security Reasons);

b)如果Connection_Handle表示一个已存在的eSCO,那么使用这个命令eSCO连接将会被修改,只有eSCO使用这个command进行修改,如果要修改一个SCO连接,需要使用Change Connection Packet Type command.

c)如果修改一个已存在的eSCO,只有Packet_Type、Retransmission_Effort和Max_Latency可以修改

d)SCO or eSCO只能在ACL连接已经存在的时候建立,并且ACL连接不能处于Park状态

e)latency是上层用来限制eSCO (or SCO)的最大延迟时间(eSCO (or SCO) instants, plus the size of the retransmission window, plus the length of the reserved synchronous slots)

f)当SCO/eSCO建立完成以后,本地host会接收到Synchronous Connection Complete event,远端设备host会接收到Synchronous Connection Complete event (使用Accept Synchronous Connection Request Command)或者Connection Complete event(使用Accept Connection Request Command)

g)当这个command用来修改一个已存在的eSCO时,本地和远端host都会接收到一个Synchronous Connection Changed Event,但是不会接收到Connection Setup Complete Event或者Connection Request Event

h)Transmit_Coding_Format和Input_Coding_Format应该都是“transparent”或者都不是. 如果都是“transparent”,那么Transmit_Bandwidth和 Input_Bandwidth应该相同并且controller不能修改

Receive_Coding_Format和Output_Coding_Format应该都是“transparent”或者都不是. 如果都是“transparent”,那么Receive_Bandwidth和Output_Bandwidth 应该相同并且controller不能修改

参数中有4种不同的音频路径:Transmit, Receive, Input and Output,具体含义如下图所示:

第一部分:HCI协议(八)具体的HCI command和event(9、SYNCHRONOUS CONNECTIONS 二)

Transmit:表示本地Controller发送给远端Controller数据

Receive:表示本地Controller从远端Controller接收数据

Input:表示本地Host发送给本地Controller数据

Output:表示本地Host从本地Controller接收数据

参数说明:

Connection_Handle(2 Octet):如果建立一个新的SCO or eSCO,这个Connection_Handle需要是ACL连接的Connection_Handle,如果要修改一个eSCO,这个Connection_Handle需要是对应eSCO的Connection_Handle

Transmit_Bandwidth和Receive_Bandwidth(4 Octets):这两个参数表示的是频宽,这两个参数设置的时候需要相同,或者一个是0另一个非0

Transmit_Coding_Format和Receive_Coding_Format(5 Octets):这两个参数表示的是coding format,这两个参数应该相同;Octet 0是标准的coding format,如果使用Vendor指定的coding format,那么Octet 0应该是0xFF,Octet 1-2表示Company ID ,Octet 3-4表示Vendor specific codec ID,如果Octet 0不是0xFF,则Octets 1-4应该忽略

Note: When the Transmit_Coding_Format and Receive_Coding_Format parameters are not equal to CVSD, A-law or μ-law, the Link Manager shall map these to Transparent air mode.(这段不好理解)

coding format具体的取值参考:

https://www.bluetooth.com/specifications/assigned-numbers/host-controller-interface/

第一部分:HCI协议(八)具体的HCI command和event(9、SYNCHRONOUS CONNECTIONS 二)

Transmit_Codec_Frame_Size和Receive_Codec_Frame_Size(2 Octets):指定frame size,frame size和packet size的关系应该是Packet_Size = Frame_Size * N或者Packet_Size = Frame_Size / N(N表示整数)

Input_Bandwidth和Output_Bandwidth(4 Octets):这两个参数表示的是频宽,两个参数设置的时候需要相同,或者一个是0另一个非0

Input_Coding_Format和Output_Coding_Format(5 Octets):这两个参数表示的是coding format,这两个参数应该相同,取值范围跟Transmit/Receive一样

Input_Coded_Data_Size和Output_Coded_Data_Size(2 Octets):指定每帧数据的bit位数,CVSD应该是8 bits.

Input_PCM_Data_Format和Output_PCM_Data_Format(1 Octets):指定linear pcm编码格式时的数据格式,只对linear pcm有效,取值范围:

第一部分:HCI协议(八)具体的HCI command和event(9、SYNCHRONOUS CONNECTIONS 二)

Input_PCM_Sample_Payload_MSB_Position和Output_PCM_Sample_Payload_MSB_Position(1 Octets):这个参数只对linear PCM编码有效:这个可以理解为采样数据最高位有效为距离采样大小最高位的偏移,例如16bit的采样大小,如果Linear_PCM_Bit_Pos=3,那么采样数据最高有效为是bit12,即有效数据是bit0-12,bit13、14、15是无效的

Input_Data_Path和Output_Data_Path(1 Octets):表示音频数据通过什么方式传输. 0x00表示音频数据通过HCI传输,0xFF表示音频通过测试模式传输,0x01-0xFE表示音频通过non-HCI(logical transport channel numbers决定)模式传输 (例如PCM interface) ,logical transport channel numbers的具体值由vendor指定

Input_Transport_Unit_Size和Output_Transport_Unit_Size indicate(1 Octets):表示每个数据单元有多少bit,这两个应该相同,如果通过HCI传输,这个值应该是0,如果通过其他方式传输,具体值由vendor指定(例如:通过PCM方式传输,这个值应该是8或者16)

Max_Latency(2 Octets):限制eSCO (or SCO)的最大延迟时间,单位是ms,取值范围0x0004-0xFFFE

Packet_Type(2 Octets):取值如下

第一部分:HCI协议(八)具体的HCI command和event(9、SYNCHRONOUS CONNECTIONS 二)

Retransmission_Effort(1 Octets):取值如下

第一部分:HCI协议(八)具体的HCI command和event(9、SYNCHRONOUS CONNECTIONS 二)

举例说明:(暂时没有)

(9)Enhanced Accept Synchronous Connection Request Command

第一部分:HCI协议(八)具体的HCI command和event(9、SYNCHRONOUS CONNECTIONS 二)

这个command用来接受一个Connection Request(SCO or eSCO),如果ACL连接使用AES-CCM进行了加密,Controller不能建立eSCO连接,如果设置建立eSCO会返回error code 0x0E (Connection Rejected Due to Security Reasons)

如果Connection Request(SCO or eSCO)中的Link Type是SCO,那么Retransmission_Effort会被忽略

参数说明:

BD_ADDR(6 Octet):表示发起Connection Request(SCO or eSCO)的设备地址

Transmit_Bandwidth和Receive_Bandwidth(4 Octets):这两个参数表示的是频宽,这两个参数设置的时候需要相同,或者一个是0另一个非0

Transmit_Coding_Format和Receive_Coding_Format(5 Octets):这两个参数表示的是coding format,这两个参数应该相同;Octet 0是标准的coding format,如果使用Vendor指定的coding format,那么Octet 0应该是0xFF,Octet 1-2表示Company ID ,Octet 3-4表示Vendor specific codec ID,如果Octet 0不是0xFF,则Octets 1-4应该忽略

Note: When the Transmit_Coding_Format and Receive_Coding_Format parameters are not equal to CVSD, A-law or μ-law, the Link Manager shall map these to Transparent air mode.(这段不好理解)

coding format具体的取值参考:

https://www.bluetooth.com/specifications/assigned-numbers/host-controller-interface/

第一部分:HCI协议(八)具体的HCI command和event(9、SYNCHRONOUS CONNECTIONS 二)

Transmit_Codec_Frame_Size和Receive_Codec_Frame_Size(2 Octets):指定frame size,frame size和packet size的关系应该是Packet_Size = Frame_Size * N或者Packet_Size = Frame_Size / N(N表示整数)

Input_Bandwidth和Output_Bandwidth(4 Octets):这两个参数表示的是频宽,两个参数设置的时候需要相同,或者一个是0另一个非0

Input_Coding_Format和Output_Coding_Format(5 Octets):这两个参数表示的是coding format,这两个参数应该相同,取值范围跟Transmit/Receive一样

Input_Coded_Data_Size和Output_Coded_Data_Size(2 Octets):指定每帧数据的bit位数,CVSD应该是8 bits.

Input_PCM_Data_Format和Output_PCM_Data_Format(1 Octets):指定linear pcm编码格式时的数据格式,只对linear pcm有效,取值范围:

第一部分:HCI协议(八)具体的HCI command和event(9、SYNCHRONOUS CONNECTIONS 二)

Input_PCM_Sample_Payload_MSB_Position和Output_PCM_Sample_Payload_MSB_Position(1 Octets):这个参数只对linear PCM编码有效:这个可以理解为采样数据最高位有效为距离采样大小最高位的偏移,例如16bit的采样大小,如果Linear_PCM_Bit_Pos=3,那么采样数据最高有效为是bit12,即有效数据是bit0-12,bit13、14、15是无效的

Input_Data_Path和Output_Data_Path(1 Octets):表示音频数据通过什么方式传输. 0x00表示音频数据通过HCI传输,0xFF表示音频通过测试模式传输,0x01-0xFE表示音频通过non-HCI(logical transport channel numbers决定)模式传输 (例如PCM interface) ,logical transport channel numbers的具体值由vendor指定

Input_Transport_Unit_Size和Output_Transport_Unit_Size indicate(1 Octets):表示每个数据单元有多少bit,这两个应该相同,如果通过HCI传输,这个值应该是0,如果通过其他方式传输,具体值由vendor指定(例如:通过PCM方式传输,这个值应该是8或者16)

Max_Latency(2 Octets):限制eSCO (or SCO)的最大延迟时间,单位是ms,取值范围0x0004-0xFFFE

Packet_Type(2 Octets):取值如下

第一部分:HCI协议(八)具体的HCI command和event(9、SYNCHRONOUS CONNECTIONS 二)

Retransmission_Effort(1 Octets):取值如下

第一部分:HCI协议(八)具体的HCI command和event(9、SYNCHRONOUS CONNECTIONS 二)

举例说明:(暂时没有)

(10)Read Local Supported Codecs Command

第一部分:HCI协议(八)具体的HCI command和event(9、SYNCHRONOUS CONNECTIONS 二)

这个命令用来获取Controller支持的codecs,包括Bluetooth SIG定义的和vendor指定的codecs

返回参数说明:

Status(1 Octet):0x00表示success;0x01-0xFF表示失败

Number_of_Supported_Codecs(1 Octet):支持的Bluetooth SIG定义的codec的数量

Supported_Codecs[i] (Number_of_Supported_Codecs  * 1 Octet):具体支持的Bluetooth SIG定义的codecs

coding format具体的取值参考:

https://www.bluetooth.com/specifications/assigned-numbers/host-controller-interface/

第一部分:HCI协议(八)具体的HCI command和event(9、SYNCHRONOUS CONNECTIONS 二)

Number_of_Supported_Vendor_Specific_Codecs(1 Octet):支持的vendor定义的codec的数量

Vendor_Specific_Codecs[i](Number_of_Supported_Vendor_Specific_Codecs  * 4 Octet):具体支持的vendor定义的codecs,Octets 0 and 1表示Company ID,Octets 2 and 3表示Vendor defined codec ID

举例说明:(暂时没有)