第一部分:HCI协议(八)具体的HCI command和event(5、CONTROLLER CONFIGURATION 三)

(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数据

举例说明:(暂时没有)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值