第四阶段:Authentication stage 2: DHKey Check
(1)Simple Pairing Complete Event(常用)
这个event用来通知host配对完成。
参数说明:
Status(1 Octets):0x00表示配对成功,其他表示配对失败
BR_ADDR(6 Octets):远端设备地址
举例说明:
0x04:表示HCI Event Packet
0x36:表示这个event是Simple Pairing Complete event
0x07:表示Parameter_Total_Length即7个byte
0x00:表示status为0
0xcc 0xc8 0x17 0xd5 0x13 0x0a:表示远端设备地址BD_ADDR,即远端设备地址是0x0a 0x13 0xd5 0x17 0xc8 0xcc
最后阶段:认证link key并通知host具体的link key值即:Link Key Notification Event
0x04:表示HCI Event Packet
0x18:表示这个event是Link Key Notification event
0x17:表示Parameter_Total_Length即23个byte
0xcc 0xc8 0x17 0xd5 0x13 0x0a:表示远端设备地址BD_ADDR,即远端设备地址是0x0a 0x13 0xd5 0x17 0xc8 0xcc
Link Key: 0xaa 0x6b 0x4b 0x86 0x1f 0xf0 0x80 0xf7 0xf6 0xbe 0xf9 0x6e 0x9a 0x24 0xc1 0x93
0x04:表示key_type是Unauthenticated Combination Key
5、加密时使用的command
(1)Set Connection Encryption Command(常用)
这个命令可以enable/disable ACL连接的加密
参数说明:
Connection_Handle(2 Octet):表示一个ACL连接,用来确定与本地设备连接的远端BR/EDR Controller
Encryption_Enable(1 Octet):0x00表示Turn Link Level Encryption OFF(关闭加密),0x01表示Turn Link Level Encryption ON(开启加密)
注意:当加密改变时,所以的与远端设备所有的ACL通信都会关闭;
当本地和远端设备都支持Secure Connections (Controller Support)和Secure Connections (Host Support) features时,如果Connection_Handle的加密是enable,此时设置Encryption_Enable为Turn Link Level Encryption OFF,controller会报错:Encryption Mode Not Acceptable (0x25).
举例说明:
Command如下:
0x01:表示HCI Command Packet
0x0413:表示是HCI_Set_Connection_Encryption command
指令的OGF是0x01即0000 01
OCF是0x0013即00 0001 0011
所以整个opcode是0000 0100 0001 0011即0x0413
0x3:表示Parameter_Total_Length=0x3,即参数总长度是3个byte
0x0003:表示Connection_Handle
0x01:表示开启连接层加密
对应的Event:
Command Status event:
0x04:表示HCI Event Packet
0x0f:表示这个event是command status event
0x04:表示Parameter_Total_Length即4个byte
0x00:表示status为0
0x01:表示Num_HCI_Command_Packets
0x0413:表示是HCI_Set_Connection_Encryption command
当加密完成时,会收到Encryption Change Event
Encryption Change Event
0x04:表示HCI Event Packet
0x08:表示这个event是Encryption Change event
0x04:表示Parameter_Total_Length即4个byte
0x00:表示status为0
0x0003:表示Connection_Handle
0x01:表示使用E0方式进行连接层加密(BR/EDR)
(2)Encryption Change Event(常用)
这个event表示加密模式已经修改完成
参数说明:
Status(1 Octet):0x00表示成功,其他值表示失败
Connection_Handle(2 Octet):表示一个ACL连接
Encryption_Enabled(1 Octet):表示修改后的加密模式,这个参数值得含义跟Secure_Connections_Host_Support(通过Write Secure Connections Host Support Command进行配置)和Connection_Handle有关:
Secure_Connections_Host_Support是disable时,Encryption_Enabled可以是0x00或者0x01
Connection_Handle表示的是LE连接时,Encryption_Enabled可以是0x00或者0x01
Secure_Connections_Host_Support是enable并且Connection_Handle是一个BR/EDR连接时,Encryption_Enabled可以是0x00、0x01、0x02
具体含义如下:
举例说明:
Encryption Change Event
0x04:表示HCI Event Packet
0x08:表示这个event是Encryption Change event
0x04:表示Parameter_Total_Length即4个byte
0x00:表示status为0
0x0003:表示Connection_Handle
0x01:表示使用E0方式进行连接层加密(BR/EDR)
6、其他command(没用过)
(1)Change Connection Link Key Command
这个命令可以强制与Connection_Handle(ACL)相关的本地和远端设备产生一个新的link key
参数说明:
Connection_Handle(2 Octet):表示一个ACL连接
举例说明:(暂时没有)
(2)Change Connection Link Key Complete Event
这个event表示Change Connection Link Key Command完成
参数说明:
Status(1 Octet):0x00表示成功,其他值表示失败
Connection_Handle(2 Octet):表示一个ACL连接
举例说明:(暂时没有)
(3)Master Link Key Command
使用这个命令可以强制使网络中的master设备使用自己的临时link key或者非永久性的link key,临时link key是用来加密广播消息的,非永久性link key是两个设备点对点进行数据交互时用来加密的。
如果网络中的所有slave都支持AES-CCM加密,但是Key_Flag设置的是使用临时key,此时会返回error:Command Disallowed (0x0C);
注意:如果网络中有至少一个设备不支持AES-CCM加密,Controller和Host都支持Secure Connections的设备是收不到加密广播消息的
如果网络中所有设备都支持AES-CCM加密,此时广播数据包是不加密的,所有的设备都可以接收到
参数说明:
Key_Flag(1 Octet):0x00表示使用非永久性link key,0x01表示使用临时link key
举例说明:(暂时没有)
(4)Master Link Key Complete Event
这个event表示Master的Link Key已经发生了改变
参数说明:
Status(1 Octet):0x00表示成功,其他值表示失败
Connection_Handle(2 Octet):表示ACL连接
Key_Flag(1 Octet):0x00表示使用非永久性link key,0x01表示使用临时link key
举例说明:(暂时没有)
(5)Read PIN Type Command
这个命令可以获取PIN_Type(可变的PIN code或者固定的PIN code)的配置
参数说明:
Status(1 Octet):0x00表示成功,其他值表示失败
PIN_Type(1 Octet):0x00表示可变的PIN code,0x01表示固定的PIN code
举例说明:(暂时没有)
(6)Write PIN Type Command
这个命令可以配置PIN Type
参数说明:
PIN_Type(1 Octet):0x00表示可变的PIN code,0x01表示固定的PIN code
返回参数说明:
Status(1 Octet):0x00表示成功,其他值表示失败
举例说明:(暂时没有)
(7)Create New Unit Key Command
这个命令会产生一个新的unit key,所有新的连接会使用这个新的unit key,但是在之前已经建立的连接中还是会使用旧的unit key
返回参数说明:
Status(1 Octet):0x00表示成功,其他值表示失败
举例说明:(暂时没有)
(8)Refresh Encryption Key Command
Host可以使用这个命令来刷新encryption key,这个command使用时会暂停并重新开始加密
参数说明:
Connection_Handle(2 Octet):表示ACL连接
举例说明:(暂时没有)
(9)Encryption Key Refresh Complete Event
这个event表示Connection_Handle表示的ACL连接上Encryption Key已经刷新
注意:如果是伴随着change connection link key程序刷新link key,则这个event应该在Change Connection Link Key Complete event.之前;
如果是伴随着role switch程序刷新link key,则这个event应该在Role Change event之前
参数说明:
Status(1 Octet):0x00表示成功,其他值表示失败
Connection_Handle(2 Octet):表示ACL连接
举例说明:(暂时没有)