一.概述
上一篇博文介绍的是inquiry的整个过程中HCI层的command和event。在寻找到有效的远端蓝牙设备后,开始建立ACL连接,这里仅仅反应HCI层的数据包,对于LM层和Baseband层的数据可能需要抓取FW的log进行查看。
二.建立ACL连接的过程
1. Create_Connection command
该命令参数如下:
BD_ADDR,
Packet_Type,
Page_Scan_Repetition_Mode,
Reserved,
Clock_Offset,
Allow_Role_Switch
00000101 00000100 00001101 10000000 10011001 00100011 01001100 11100000 00000000 00011000 11001100 00000001 00000000 10010010 11000111 00000001
Opcode: 0x0405
Total Length: 00001101 = 0x0d = 13
BD_ADDR:10000000 10011001 00100011 01001100 11100000 00000000 = 0x00e04c239980
下图是inquiry过程中的一个extended inquiry result event:
从上图可以看出这个地址属于一个rk3066的设备,实际是一个平板电脑
Packet_Type:00011000 11001100 = 0xcc18(DM1-DH1, DM3-DH3, DM5-DH5)
Page_Scan_Repetition_Mode:00000001 = 0x01(R1)
Clock_Offset:10010010 11000111 = 0xc792(18322) //CLKslave-CLKmaster
Allow_Role_Switch:00000001(本地设备是master,接受role switch)
2. Command status event
该event参数如下:
Status,
Num_HCI_Command_Packets,
Command_Opcode
00001111 00000100 00000000 00000010 00000101 00000100
EventCode: 00001111 = 0x0F
Total Length: 00000100 = 0x04
status = 00000000 = 0x00 表示command成功
Num_HCI_Command_Packets = 00000010 = 0x02
Command Opcode:和Create_connection command一样为 00000101 00000100 = 0x0405
3.Connection Complete event
建立成功,返回Connection Complete event,该event参数如下:
Status,
Connection_Handle,
BD_ADDR,
Link_Type,
Encryption_Enabled
00000011 00001011 00000000 00001001 00000000 10000000 10011001 00100011 01001100 11100000 00000000 00000001 00000000
EventCode: 00000011 = 0x03
Total Length: 00001011 = 0x0b = 11
Status: 0x0000(Success)
Connection_Handle:00001001 00000000 = 9
BD_ADDR: 10000000 10011001 00100011 01001100 11100000 00000000 = 0x00e04c239980
Link_Type:00000001 = 0x01(ACL connection (Data Channels))
Encryption_Enabled:00000000(不加密)
三.总结
建立ACL Connection在HCI层上看比较简单,只有Create_Connection command和Command status event以及Connection Complete event两个event。在建立连接后,得到重要的Connection handle,建立起ACL连接,这个连接一旦建立起来,L2CAP signaling channel(CID = 0x0001)就已经存在,L2CAP可以在这个Channel进行一些数据传输病建立L2CAp连接。这在下一篇介绍。