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

下面只介绍常用的几个command和event

(1)Setup Synchronous Connection Command

这个命令根据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,Transmit_Bandwidth、Receive_Bandwidth以及Voice_Setting不能修改,需要和之前的一样,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

参数说明:

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

Transmit_Bandwidth(4 Octet):发送数据每秒需要多少频宽

Receive_Bandwidth(4 Octet):接收数据每秒需要多少频宽

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

0xFFFE

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

input data format数据格式分为4种,通常我们用2’s complement:

1’s complement:1的补码,正数的补码就是自己本身,负数的补码就是所有bit取反

2’s complement:2的补码,正数的补码就是自己本身,负数的补码是所有bit取反再加1

Sign-Magnitude:这种方式把数据分成sign和Magnitude两部分,最高位是sign,其余的位是Magnitude(大小),sign位是0则表示正数,sign是1表示负数,例如0111 1111就表示127,1111 1111就表示-127。

Unsigned:无符号数

Input Sample Size分为两种,这个参数只对linear PCM编码有效:

Input Sample Size: 8-bit:每个采样大小是8bit

Input Sample Size: 16-bit:每个采样大小是16bit

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

Retransmission_Effort(1 Octet):取值如下

Packet Type(2 Octet):取值如下

举例说明:

Command如下:

0x01:表示HCI Command Packet

0x0428:表示是HCI_Setup_Synchronous_Connection command

指令的OGF是0x01即0000 01

OCF是0x0028即00 0010 1000

所以整个opcode是0000 0100 0010 1000即0x0428

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

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

0x00001f40:表示Transmit_Bandwidth=0x00001f40

0x00001f40:表示Receive_Bandwidth=0x00001f40

0x000d:表示Max_Latency=0x000d

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

0x02:表示Retransmission_Effort=0x02即At least one retransmission, optimize for link quality

0x0388:表示Packet Type=0000 0011 1000 1000,即支持EV3和2-EV3

对应的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

0x0428:表示是HCI_Setup_Synchronous_Connection command

Synchronous Connection Complete Event:

0x04:表示HCI Event Packet

0x2c:表示这个event是Synchronous Connection Complete event

0x11:表示Parameter_Total_Length即17个byte

0x00:表示status是success

0x0004:表示这个新建的Synchronous Connection的Connection_Handle是0x04

0xeb 0x01 0xce 0x55 0x36 0x34:表示远端设备地址BD_ADDR,即远端设备地址是0x34:0x36:0x55:0xce:0x01:0xeb

0x02:表示Link Type=0x02,即eSCO Connection

0x0c:表示Transmission_Interval=0x0c

0x04:表示Retransmission Window=0x04

0x003c:表示Rx_Packet_Length=0x003c

0x003c:表示Tx_Packet_Length=0x003c

0x03:表示Air Mode=0x03,即Transparent Data

(2)Synchronous Connection Complete Event

下面这些命令发送以后会接收到Synchronous Connection Complete Event,这个event用来描述这些命令的status。

Setup_Synchronous_Connection

Accept_Synchronous_Connection_Request

Reject_Synchronous_Connection_Request

Enhanced_Setup_Synchronous_Connection

Enhanced_Accept_Synchronous_Connection_Request

如果这个event对应的是后面的两个command,那么controller会设置Air Mode 为这两个command里面设置的Air Mode

参数说明:

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

Connection_Handle(2 Octet):表示SCO/ESCO的Connection_Handle, 取值范围:0x0000-0x0EFF

BD_ADDR(6 Octet):表示远端设备地址

Link Type(1 Octet):0x00表示SCO Connection,0x02表示eSCO Connection

Transmission_Interval(1 Octet):Time between two consecutive eSCO instants measured in slots.SCO连接这个值必须是0

Retransmission Window(1 Octet):The size of the retransmission window measured in slots,SCO连接这个值必须是0

Rx_Packet_Length(2 Octet):接收数据时eSCO payload的长度,单位是byte,SCO连接这个值必须是0

Tx_Packet_Length(2 Octet):发送数据时eSCO payload的长度,单位是byte,SCO连接这个值必须是0

Air Mode(1 Octet):

举例说明:

Synchronous Connection Complete Event:

0x04:表示HCI Event Packet

0x2c:表示这个event是Synchronous Connection Complete event

0x11:表示Parameter_Total_Length即17个byte

0x00:表示status是success

0x0004:表示这个新建的Synchronous Connection的Connection_Handle是0x04

0xeb 0x01 0xce 0x55 0x36 0x34:表示远端设备地址BD_ADDR,即远端设备地址是0x34:0x36:0x55:0xce:0x01:0xeb

0x02:表示Link Type=0x02,即eSCO Connection

0x0c:表示Transmission_Interval=0x0c

0x04:表示Retransmission Window=0x04

0x003c:表示Rx_Packet_Length=0x003c

0x003c:表示Tx_Packet_Length=0x003c

0x03:表示Air Mode=0x03,即Transparent Data

(3)Synchronous Connection Changed Event

当一个已经存在的SCO/ESCO被重新配置的时候,host会收到这个event,如果改变是host发起的,那么status表示改变成功还是失败

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

Connection_Handle(2 Octet):表示SCO/ESCO的Connection_Handle, 取值范围:0x0000-0x0EFF

Transmission_Interval(1 Octet):Time between two consecutive eSCO instants measured in slots

Retransmission Window(1 Octet):The size of the retransmission window measured in slots

Rx_Packet_Length(2 Octet):接收数据时eSCO payload的长度,单位是byte

Tx_Packet_Length(2 Octet):发送数据时eSCO payload的长度,单位是byte

举例说明:(暂时没有)

(4)Accept Synchronous Connection Request Command

这个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,那么只有Transmit_Bandwidth, Max_Latency, Voice_Settings和Packet_Type是有效的

参数说明:

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

Transmit_Bandwidth(4 Octet):发送数据每秒需要多少频宽

Receive_Bandwidth(4 Octet):接收数据每秒需要多少频宽

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

0xFFFE

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

Retransmission_Effort(1 Octet):取值如下

Packet Type(2 Octet):取值如下(注意reserved bits应该设置成1,(此处有疑问)但是测试好像是设置成0)

举例说明:

Connection Request Event

0x04:表示HCI Event Packet

0x04:表示这个event是Connection Request event

0x0a:表示Parameter_Total_Length即10个byte

0x0e 0xb2 0x51 0x2d 0xbf 0x94:表示远端设备地址BD_ADDR,即远端设备地址是0x94: 0xbf: 0x2d:0x51:0xb2:0x0e

0x7a020c:表示class of device=0x7a020c=0111 1010 0000 0010 0000 1100;设备服务类是前11个bit(0111 1010 000)置位的分别是bit 17(网络)、bit19(捕捉)、bit20(对象传输)、bit21(音频)、bit22(电话),主设备类是(0 0010)对应的是手机;次设备类是(0000 11)对应的是智能手机

0x02:表示Link Type=0x02,即eSCO Connection

Command如下:

HCI_Accept_Synchronous_Connection_Request command

0x01:表示HCI Command Packet

0x0429:表示是HCI_Accept_Synchronous_Connection_Request command

指令的OGF是0x01即0000 01

OCF是0x0029即00 0010 1001

所以整个opcode是0000 0100 0010 1001即0x0429

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

0x0e 0xb2 0x51 0x2d 0xbf 0x94:表示远端设备地址BD_ADDR,即远端设备地址是0x94: 0xbf: 0x2d:0x51:0xb2:0x0e

0x00001f40:表示Transmit_Bandwidth=0x00001f40

0x00001f40:表示Receive_Bandwidth=0x00001f40

0x000c:表示Max_Latency=0x000c

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

0x01:表示Retransmission_Effort=0x02即At least one retransmission, optimize for power consumption

0x02bf:表示Packet Type=0000 0010 1011 1111,即支持:

Bit 0: HV1

Bit 1: HV2

Bit 2: HV3

Bit 3: EV3

Bit 4: EV4

Bit 5: EV5

Bit 6: 2-EV3

Bit 8: 2-EV5

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

0x0429:表示是HCI_Accept_Synchronous_Connection_Request command

Synchronous Connection Complete Event:

0x04:表示HCI Event Packet

0x2c:表示这个event是Synchronous Connection Complete event

0x11:表示Parameter_Total_Length即17个byte

0x00:表示status是success

0x0006:表示这个新建的Synchronous Connection的Connection_Handle是0x06

0x0e 0xb2 0x51 0x2d 0xbf 0x94:表示远端设备地址BD_ADDR,即远端设备地址是0x94: 0xbf: 0x2d:0x51:0xb2:0x0e

0x02:表示Link Type=0x02,即eSCO Connection

0x0c:表示Transmission_Interval=0x0c

0x02:表示Retransmission Window=0x02

0x003c:表示Rx_Packet_Length=0x003c

0x003c:表示Tx_Packet_Length=0x003c

0x02:表示Air Mode=0x02,即CVSD

(5)Reject Synchronous Connection Request Command

这个命令用来拒绝Connection Request(SCO or eSCO)

参数说明:

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

Reason(1 Octet):这个参数将会在远端发起Synchronous Connection Request的设备的Synchronous connection complete里面显示,用来通知对方为什么拒绝连接

举例说明:(暂时没有)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值