(5)Read Number Of Supported IAC Command
这个command用来获取BR/EDR Controller 可以同时监听的Inquiry Access Codes (IAC)的个数
注意:所有的BR/EDR Controllers至少应该支持一个IAC即General Inquiry Access Code (GIAC即0x9E8B33,一般支持这一个就可以).
返回参数说明:
Status(1 Octet):0x00表示success;0x01-0xFF error code
Num_Support_IAC(1 Octet):取值范围0x01-0x40;IAC的个数
举例说明:(暂时没有)
(6)Read Current IAC LAP Command
这个command获取BR/EDR Controller 同时监听的所有的Inquiry Access Codes(IAC)
返回参数说明:
Status(1 Octet):0x00表示success;0x01-0xFF error code
Num_Current_IAC(1 Octet):取值范围0x01-0x40;当前BR/EDR Controller支持的IAC的个数
IAC_LAP[i](3 * Num_Current_IAC Octet):当前BR/EDR Controller支持的所有的IAC
举例说明:(暂时没有)
(7)Write Current IAC LAP Command
这个command用来设置本地BR/EDR Controller可以同时监听的Inquiry Access Codes(IAC),至少应该设置1个(GIAC)。
使用这个command时会清空已有的IACs同时存储Num_Current_IAC和设置的IAC_LAPs,如果Num_Current_IAC大于Num_Support_IAC时只有前面的Num_Support_IAC个IACs会被存储,但是Command Complete event中的status参数会设置成Success (0x00)
参数说明:
Num_Current_IAC(1 Octet):要设置的IACs的个数
IAC_LAP[i] (3 * Num_Current_IAC Octet):要设置的IACs
返回参数说明:
Status(1 Octet):0x00表示success;0x01-0xFF error code
举例说明:
Command如下:
0x01:表示HCI Command Packet
0x0C3a:表示是HCI_Write_Current_IAC_LAP command
指令的OGF是0x03即0000 11
OCF是0x003a即00 0011 1010
所以整个opcode是0000 1100 0011 1010即0x0C3a
0x04:表示Parameter_Total_Length=4,即参数总长度是4个byte
0x01:表示Num_Current_IAC=1,即设置1个IAC
0x9e8b33:表示设置的IAC为GIAC
对应的Event(Command Complete event):
0x04:表示HCI Event Packet
0x0e:表示这个event是command complete event
0x04:表示Parameter_Total_Length即4个byte
0x01:表示Num_HCI_Command_Packets
0x0C3A:表示是HCI_Write_Current_IAC_LAP command
0x00:表示status是success
(8)Read Scan Enable Command
这个command用来获取Scan_Enable的值
Scan_Enable是用来控制BR/EDR Controller是否可以定期检测其他BR/EDR Controller的page attempts和inquiry requests,如果Page_Scan是enabled, 则本地BR/EDR controller可以进入page scan模式(如何扫描由Page_Scan_Interval和Page_Scan_Window两个参数决定,其中Page_Scan_Interval表示两次page scan的间隔,Page_Scan_Window表示1次page scan持续的时间,Page_Scan_Interval >= Page_Scan_Window),如果Inquiry_Scan 是enabled, 则BR/EDR Controller可以进入Inquiry Scan模式(如何扫描由Inquiry_Scan_Interval和Inquiry_Scan_Window两个参数决定,其中Inquiry_Scan_Interval表示两次inquiry scan的间隔,Inquiry_Scan_Window表示1个inquiry scan持续的时间, Inquiry_Scan_Interval >= Inquiry_Scan_Window)
Scan_Enable具体取值如下图所示:
简单理解:inquiry scan即是否可被搜索,page scan即是否可被连接。
返回参数说明:
Status(1 Octet):0x00表示success;0x01-0xFF error code
Scan_Enable(1 Octet):inquiry scan和page scan的具体配置
举例说明:
Command如下:
0x01:表示HCI Command Packet
0x0C19:表示是HCI_Read_Scan_Enable command
指令的OGF是0x03即0000 11
OCF是0x0019即00 0001 1001
所以整个opcode是0000 1100 0001 1001即0x0C19
0x00:表示Parameter_Total_Length=0,即参数总长度是0个byte
对应的Event(Command Complete event):
0x04:表示HCI Event Packet
0x0e:表示这个event是command complete event
0x05:表示Parameter_Total_Length即5个byte
0x01:表示Num_HCI_Command_Packets
0x0C19:表示是HCI_Read_Scan_Enable command
0x00:表示status是success
0x00:表示Scan_Enable=0x00,即No Scan Enabled
(9)Write Scan Enable Command
这个command用来设置Scan_Enable的值
参数说明:
Scan_Enable(1 Octet):inquiry scan和page scan的具体配置,参考上一个Read Scan Enable Command
返回参数说明:
Status(1 Octet):0x00表示success;0x01-0xFF error code
举例说明:
Command如下:
0x01:表示HCI Command Packet
0x0C1a:表示是HCI_Write_Scan_Enable command
指令的OGF是0x03即0000 11
OCF是0x001a即00 0001 1010
所以整个opcode是0000 1100 0001 1010即0x0C1a
0x01:表示Parameter_Total_Length=1,即参数总长度是1个byte
0x03:表示Scan_Enable=1,即inquiry scan enable,page scan enable
对应的Event(Command Complete event):
0x04:表示HCI Event Packet
0x0e:表示这个event是command complete event
0x04:表示Parameter_Total_Length即4个byte
0x01:表示Num_HCI_Command_Packets
0x0C1A:表示是HCI_Write_Scan_Enable command
0x00:表示status是success
(10)Write Extended Inquiry Response Command
Write_Extended_Inquiry_Response这个命令用来设置设备被搜索时回复的extended inquiry Response
参数说明:
FEC_Required(1 Octet):表示是否需要FEC编码;0x00表示不需要,0x01表示需要(FEC编码后面解释)
Extended_Inquiry_Response(248 Octet):需要设置的extended inquiry response数据,注意这个数据在执行HCI Reset以后不会被保留,初始值是全0
返回参数说明:
Status(1 Octet):0x00表示success;0x01-0xFF error code
举例说明:
Command如下:
0x01:表示HCI Command Packet
0x0C52:表示是HCI_Write_Extended_Inquiry_Response command
指令的OGF是0x03即0000 11
OCF是0x0052即00 0101 0010
所以整个opcode是0000 1100 0101 0010即0x0C52
0xf1:表示Parameter_Total_Length=241,即参数总长度是241个byte
0x01:表示FEC_Required =1,即需要FEC编码
剩下的数据表示的就是具体的extended inquiry Response
extended inquiry response的数据格式如下图所示:
A、extended inquiry response数据总长度是240byte
B、240byte分为有效部分(significant part)和无效部分(non-significant part)
C、有效部分是1个或多个EIR结构体,无效部分是全0,作用是将这个extended inquiry response补足240个byte
D、EIR结构体分为3部分:1byte的length、n byte的EIR Data Type和length – n byte的EIR数据
E、EIR length可以设置成0,此时后面的D字段也是0 byte
F、EIR可以是device name, Tx power level, service class UUIDs等
In selecting the packet type to be used, FEC (DM1 or DM3) should be considered to maximize the range.
G、device name EIR的规则
如果设备没有名字时分两种情况:
a)如果没有其他的EIR结构体,那么需要设置一个EIR结构体,length=1,EIR data type为complete name
b)如果还有其他重要的EIR结构体,那么就不需要设置device name的EIR结构体
如果设备设备有名字(名字长度大于0 byte)
a)如果名字太长,可能设置一个缩短的名字(也是是0个byte),同时表示这个名字是shortened的,如果远端设备需要完整的名字,则需要发送remote
name request
b) 如果没有其他的EIR结构体,那么这个名字要设置的尽量短,可以是complete也可以是shortened(例如:使用DM1 packet时,名字要小于等于15个byte)
关于EIR,我们只需要关注下面这两种:
a)Service UUID
Service UUID data type表示后面跟的是Service or Service Class UUIDs
一共有6种data types:
16-bit Bluetooth Service UUIDs 2种;分别是incomplete和complete
32-bit Bluetooth Service UUIDs 2种;分别是incomplete和complete
Global 128-bit Service UUIDs 2种;分别是incomplete和complete
具体说明如下:
对应的值如下:
b)Local Name
Local Name data type表示Local Name是complete还是shortened,如果Local Name是shortened, 那么可以使用remote name request获取完整的名字,也可以通过GATT获取完整的名字
shortened name必须从完整名字的开头开始,例如:设备名字是BT_Device_Name,那么shortened name可以是BT_Device或者BT_Dev等
对应的值:
例如上面的Extended_Inquiry_Response的数据:
第一个EIR数据包是:0x3d开头的,表示EIR length = 0x3d=61个byte,到0x64结束,这个EIR数据包的data type是0x09即Complete Local Name;
第二个EIR数据包是:0x0b开头的,表示EIR length=0x0b=11个byte,EIR数据包的data type是0x03,即Complete List of 16-bit Service Class UUIDs;后面的数据是
0x0a 0x11 0x0c 0x11 0x0e 0x11 0x12 0x11 0x1f 0x11表示具体支持哪些UUID
具体的UUID参照:https://www.bluetooth.com/specifications/assigned-numbers/service-discovery/
第三个EIR数据包是:0x01 0x05,表示EIR length=0x01=1个byte,EIR数据包的data type是0x05,即Complete List of 32-bit Service Class UUIDs,但是没有数据
第四个EIR数据包是:0x01 0x07,表示EIR length=0x01=1个byte,EIR数据包的data type是0x05,即Complete List of 128-bit Service Class UUIDs,但是没有数据
对应的Event(Command Complete event):
0x04:表示HCI Event Packet
0x0e:表示这个event是command complete event
0x04:表示Parameter_Total_Length即4个byte
0x01:表示Num_HCI_Command_Packets
0x0C52:表示是HCI_Write_Extended_Inquiry_Response command
0x00:表示status是success
(11)Read Extended Inquiry Response Command
这个command用来获取当前设备的extended inquiry response
返回参数说明:
Status(1 Octet):0x00表示success;0x01-0xFF error code
FEC_Required(1 Octet):表示是否需要FEC编码;0x00表示不需要,0x01表示需要(FEC编码后面解释)
Extended_Inquiry_Response(248 Octet):extended inquiry response数据
举例说明:(暂时没有)