第一部分:HCI协议(八)具体的HCI command和event(6、DEVICE DISCOVERY 一)
这里只记录常用的几个command和event
(1)Inquiry Command
这个命令是用来搜索周围的BR/EDR Controllers的. 当本地Controller接收到Inquiry Command以后,首先会回复一个Command Status event,当搜索到其他BR/EDR Controllers时,会有Inquiry Result events或者Inquiry Result with RSSI Event或者extended Inquiry Result events,(根据inquiry mode设置)返回,当搜索完成时,会有Inquiry Complete event返回;
如果在搜索过程中,Controller收到Inquiry Cancel Command,则Controller不会发送Inquiry Complete event给Host,而是会发送一个Command Complete event,表示Inquiry Cancel Command完成。
参数说明:
LAP(3 Octet):Low Address Part,是一个inquiry access code;这个值通常是0x9E8B33(GIAC)
64bit的BD_ADDR如下图所示
Inquiry_Length(1 Octet):指定搜索时间,范围是0x01 – 0x30,具体的时间是1.28s * Inquiry_Length,如果Extended_Inquiry_Length也设置了,则搜索持续时间可能是1.28s *(Extended_Inquiry_Length + Inquiry_Length)
Num_Responses(1 Octet):在搜索结束前可以接收的最多响应次数,范围是0x01 – 0xFF,如果这个值设置为0x00表示不限制响应次数。
举例说明:
Command如下:
0x01:表示HCI Command Packet
0x0401:表示是HCI_Inquiry command
指令的OGF是0x01即0000 01
OCF是0x0001即00 0000 0001
所以整个opcode是0000 0100 0000 0001即0x0401
0x05:表示Parameter_Total_Length=5,即参数总长度是5个byte
0x9E8B33:表示IAC为GIAC
0x14:表示搜索0x14 * 1.28=25.6s
0x00:表示不限制响应次数
对应的event说明:command status event、Inquiry Result events或者Inquiry Result with RSSI Event或者extended Inquiry Result events(根据inquiry mode)、Inquiry Complete event(如果收到inquiry cancel command则不会有这个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
0x0401:表示是HCI_Inquiry command
extended Inquiry Result events:
0x04:表示HCI Event Packet
0x2f:表示这个event是Extended Inquiry Result event
0xff:表示Parameter_Total_Length即255个byte
后面的参数在Extended Inquiry Result event里面说明。
Inquiry Complete event(暂时没有)
(2)Inquiry Result Event
Inquiry Result event表示在搜索过程中搜索到了一个或者多个远端BR/EDR Controller
Num_Responses(1 Octet):表示搜索到了多少个设备
BD_ADDR[i] (Num_Responses * 6 Octet):表示每个设备的地址
Page_Scan_Repetition_Mode[i] (Num_Responses * 1 Octet):表示每个设备的Page_Scan_Repetition_Mode,0x00表示R0,0x01表示R1,0x02表示R2
Reserved[i] (Num_Responses * 1 Octet):忽略
Reserved[i] (Num_Responses * 1 Octet):忽略
Class_of_Device[i] (Num_Responses * 3 Octet):搜索到的每个设备对应的设备类
Clock_Offset[i] (Num_Responses * 2 Octet):搜索到的每个设备对应的时钟偏移只需要关注bit0-14
举例说明:(暂时没有)
(3)Inquiry Result with RSSI Event
只有当Inquiry Mode是0x01 (Inquiry Result format with RSSI)时,搜索才会返回这个event,除了RSSI,其他跟Inquiry Result Event含义一样
RSSI[i](Num_Responses * 1 Octet):即Received Signal Strength Indication,取值范围是-127到+20
(4)Extended Inquiry Result Event
只有当Inquiry_Mode是0x02 (Inquiry Result with RSSI format or Extended Inquiry Result format)时才会返回这个event
这个event和上面2个不同,每个event只能包含一个Extended Inquiry Response,所以Num_Responses=1
如果收到的inquiry response packet中的EIR结构体是0个,那么会使用Inquiry Result with RSSI event,所以即使Inquiry_Mode是0x02,也可能会收到Inquiry Result with RSSI event,除了Extended_Inquiry_Response其他参数跟Inquiry Result with RSSI event一样
Extended_Inquiry_Response(240 octet):可以参照Write Extended Inquiry Response Command
举例说明:
Event如下:
0x04:表示HCI Event Packet
0x2f:表示这个event是Extended Inquiry Result event
0xff:表示Parameter_Total_Length即255个byte
0x01:表示Num_Responses=1
0x35 0x8b 0xf8 0x11 0x1a 0xfc:表示BD_ADDR为0xfc:0x1a:0x11:0xf8:0x8b:0x35
0x01:表示Page_Scan_Repetition_Mode=0x01即R1
0x02:Reserved,忽略
0x5a020c:表示Class_of_Device,0101 1010 0000 0010 0000 1100,设备服务类是前11个bit(0101 1010 000)置位的分别是bit 17(网络)、bit19(捕捉)、bit20(对象传输)、bit22(电话),主设备类是(0 0010)对应的是手机;次设备类是(0000 11)对应的是智能手机
0x7af2:表示Clock_Offset即0111 1010 1111 0010,bit0-14表示的值是31474
0xb3:表示RSSI即-77
剩下的240byte数据就是Extended_Inquiry_Response,
EIR数据解析如下:
0f 09 76 69 76 6f 20 58 36 53 50 6c 75 73 20 41
EIR struct1:length=0xf,EIR data type=0x9即complete local name,EIR data: vivo X6SPlus A
1d 03 03 11 05 11 06 11 0a 11 0c 11 0e 11 12 11 15 11 16 11 1f 11 2d 11 2f 11 00 12 32 11
EIR struct2:length=0x1d,EIR data type=0x3即Complete List of 16-bit Service Class UUIDs,EIR data:对应的UUID如下
01 05
EIR struct3:length=0x01,EIR data type=0x5即Complete List of 32-bit Service Class UUIDs
01 07
EIR struct4:length=0x01,EIR data type=0x7即Complete List of 128-bit Service Class UUIDs
其余的字符为全0,是无效部分。
(5)Inquiry Complete Event
Inquiry Complete event表示搜索完成
参数说明:
Status(1 Octet):0x00表示success;0x01-0xFF error code
举例说明:(暂时没有)