正如SPEC所言,安全管理协议(Security Manager Protocol,SMP )就是用来执行配对和交换link key的。在Bluetooth LE中有专门的L2CAP信道(CID = 0x0006)来传输SMP的协议信息,使得它的通信建立也十分简便,只要LE的connection建立起来,SMP就可以开始执行它的任务。这里针对Bluedroid代码,简单介绍下SMP的执行过程。
1.初始化
btu_task()==>btu_init_core()==>SMP_Init()
在SMP_Init中,它调用了smp_l2cap_if_init(),代码如下:
void smp_l2cap_if_init (void)
{
tL2CAP_FIXED_CHNL_REG fixed_reg;
SMP_TRACE_EVENT0 ("SMDBG l2c smp_l2cap_if_init");
fixed_reg.fixed_chnl_opts.mode = L2CAP_FCR_BASIC_MODE;
fixed_reg.fixed_chnl_opts.max_transmit = 0;
fixed_reg.fixed_chnl_opts.rtrans_tout = 0;
fixed_reg.fixed_chnl_opts.mon_tout = 0;
fixed_reg.fixed_chnl_opts.mps = 0;
fixed_reg.fixed_chnl_opts.tx_win_sz = 0;
fixed_reg.pL2CA_FixedConn_Cb = smp_connect_cback;
fixed_reg.pL2CA_FixedData_Cb = smp_data_ind;
fixed_reg.default_idle_tout = 60; /* set 60 seconds timeout, 0xffff default idle timeout */
/* Now, register with L2CAP */
L2CA_RegisterFixedChannel (L2CAP_SMP_CID, &fixed_reg);
}
这里头初始化了smp的l2cap信道参数,最主要的是这两个:
fixed_reg.pL2CA_FixedConn_Cb = smp_connect_cback;
这是smp的l2cap通道建立后的回调函数。由于在Bluetooth LE中smp使用固定的CID,因此当LE的connection建立后,smp的l2cap通道也就建立起来,从而进入该函数 。后面会提到它的一个作用,先记住它的角色。