第一部分:HCI协议(八)具体的HCI command和event(7、CONNECTION SETUP 一)
下面只介绍常用的几个command和event
(1)Create Connection Command
这个命令是使Link Manager根据BD_ADDR与远端设备建立ACL连接
参数说明:
BD_ADDR(6 Octet):远端设备地址
Packet_Type(2 Octet):指定Link Manager在ACL连接中使用什么packet type(DM1 packet是永远被支持的),可以使用位与的方式指定多个packet type,取值范围如下图所示:
Page_Scan_Repetition_Mode(1 Octet):指定远端设备支持的page scan repetition mode,page scan repetition mode是在搜索的时候获取到的(0x00表示R0,0x01表示R1,0x02表示R2)
Reserved(1 Octet):设置成0
Clock_Offset(2 Octet):指定本地时钟与远端设备时钟的时钟偏移,这个参数得bit0-14表示时钟的bit2-16,这个参数的bit 15表示Clock_Offset_Valid_Flag,其中Invalid Clock Offset = 0,Valid Clock Offset = 1
Allow_Role_Switch(1 Octet):表示本地设备在连接建立时是否接受master-slave role switch request(远端设备使用Accept_Connection_Request command时,使用参数Role指定角色),0x00:表示本地设备是master,不支持master-slave角色互换;0x01:表示支持master-slave角色互换,本地设备可能是master,也可能在接收到master-slave角色互换请求以后变成slave;
举例说明:
Command如下:
0x01:表示HCI Command Packet
0x0405:表示是HCI_Create_Connection command
指令的OGF是0x01即0000 01
OCF是0x0005即00 0000 0101
所以整个opcode是0000 0100 0000 0101即0x0405
0x0d:表示Parameter_Total_Length=13,即参数总长度是13个byte
0xeb 0x01 0xce 0x55 0x36 0x34:表示远端设备地址BD_ADDR,即远端设备地址是0x34:0x36:0x55:0xce:0x01:0xeb
0xcc18:表示packet type
0x01:表示Page_Scan_Repetition_Mode为R1
0x00:表示Reserved
0xf094:表示clock offset,bit15=1表示有效的时钟偏移,时钟偏移量=0x7094=28820
0x01:表示支持master-slave角色互换
对应的Event:
Command stauts event:
0x04:表示HCI Event Packet
0x0f:表示这个event是command status event
0x04:表示Parameter_Total_Length即4个byte
0x00:表示status是success
0x01:表示Num_HCI_Command_Packets
0x0405:表示是HCI_Create_Connection command
Connection Complete Event:(连接成功以后)
0x04:表示HCI Event Packet
0x03:表示Connection Complete Event
0x0b:表示Parameter_Total_Length即11个byte
0x00:表示status是success
0x0003:表示Connection_Handle=0x0003
0xeb 0x01 0xce 0x55 0x36 0x34:表示远端设备地址BD_ADDR,即远端设备地址是0x34:0x36:0x55:0xce:0x01:0xeb
0x01:表示Link_Type=0x01即ACL连接
0x00:表示Encryption_Enabled=0x00即Link level encryption disabled.
(2)Connection Request Event
Connection Request event表示有一个新的连接请求,我们可以选择接受或者拒绝,如果是ACL连接(根据link type),应该使用Accept_Connection_Request或者Reject_Connection_Request command,如果是SCO或者eSCO连接(根据link type),应该使用Accept_Synchronous_Connection_Request或者Reject_Synchronous_Connection_Request command
注意:如果是SCO连接, 也可以用Accept_Connection_Request command响应. Connection Request event,此时local Link Manager其实使用的是Accept_Synchronous_Connection_Request command(参数都是默认的)但是这种情况下,controller返回的是Connection Complete event而不是Synchronous Connection Complete event
参数说明:
BD_ADDR(6 Octet):发送Connection Request Event的设备地址
Class_of_Device(3 Octet):发送Connection Request Event的设备的设备类
Link_Type(1 Octet):连接类型,0x00表示SCO连接请求,0x01表示ACL连接请求,0x02表示eSCO连接请求
举例说明:(Connection Request event)
0x04:表示HCI Event Packet
0x04:表示这个event是Connection Request event
0x0a:表示Parameter_Total_Length即10个byte
0x35 0x8b 0xf8 0x11 0x1a 0xfc:表示请求连接的设备地址是0xfc: 0x1a: 0x11: 0xf8: 0x8b: 0x35
0x5a020c:表示请求连接的设备的COD,即0101 1010 0000 0010 0000 1100;设备服务类是前11个bit(0101 1010 000)置位的分别是bit 17(网络)、bit19(捕捉)、bit20(对象传输)、bit22(电话),主设备类是(0 0010)对应的是手机;次设备类是(0000 11)对应的是智能手机
对应的软件解析如下:
0x01:表示是Link_Type是ACL
(3)Accept Connection Request Command
收到Connection Request Event连接请求后,host回复HCI_Accept_Connection_Request表示接受连接请求,然后Link Manager将会跟BD_ADDR与远端设备建立一个连接,Role表示Host是否希望Link Manager请求Role Switch(即本地设备变成Master),如果Role Switch失败,连接不会受到影响,可以使用Role Discovery Command获取当前role
注意:当接受一个synchronous connection request时,Role参数是没有效果的。
参数说明:
BD_ADDR(6 Octet):发送Connection Request Event的设备地址(即接受来自BD_ADDR的连接请求)
Role(1 Octet):0x00表示master(即LM会请求Role Switch),0x01表示slave(即LM不会请求Role Switch)
举例说明:
Command如下:
0x01:表示HCI Command Packet
0x0409:表示是HCI_Accept_Connection_Request command
指令的OGF是0x01即0000 01
OCF是0x0009即00 0000 1001
所以整个opcode是0000 0100 0000 1001即0x0409
0x07:表示Parameter_Total_Length=7,即参数总长度是7个byte
0x35 0x8b 0xf8 0x11 0x1a 0xfc:表示请求连接的设备地址是0xfc: 0x1a: 0x11: 0xf8: 0x8b: 0x35
0x00:表示本地设备请求Role Switch,即本地设备请求变成master,对方变成slave
对应的Event:
Command stauts event:
0x04:表示HCI Event Packet
0x0f:表示这个event是command status event
0x04:表示Parameter_Total_Length即4个byte
0x00:表示status是success
0x01:表示Num_HCI_Command_Packets
0x0409:表示是HCI_Accept_Connection_Request command
Role Change Event(因为本地设备请求了role switch并且对方同意了):
0x04:表示HCI Event Packet
0x12:表示这个event是Role Change event
0x08:表示Parameter_Total_Length即8个byte
0x00:表示已经发生了role change
0x35 0x8b 0xf8 0x11 0x1a 0xfc:表示远端设备地址是0xfc: 0x1a: 0x11: 0xf8: 0x8b: 0x35
0x00:表示是本地设备是远端设备的master
Connection Complete Event:(连接成功以后)
0x04:表示HCI Event Packet
0x03:表示Connection Complete Event
0x0b:表示Parameter_Total_Length即11个byte
0x00:表示status是success
0x000b:表示Connection_Handle=0x000b
0x35 0x8b 0xf8 0x11 0x1a 0xfc:表示远端设备地址是0xfc: 0x1a: 0x11: 0xf8: 0x8b: 0x35
0x01:表示Link_Type=0x01即ACL连接
0x00:表示Encryption_Enabled=0x00即Link level encryption disabled.
(4)Reject Connection Request Command
收到Connection Request Event连接请求后,host回复HCI_Reject_Connection_Request表示拒绝连接请求
参数说明:
BD_ADDR(6 Octet):发送Connection Request Event的设备地址(即拒绝来自BD_ADDR的连接请求)
Reason(1 Octet):Error code,表示拒绝连接请求的原因
举例说明:(暂时没有)