mesh_pro_rc_adv_dispatch: 现在prov_para.provison_send_state 为 LINK_ESTABLISHED_ACK 所以我们看一下mesh_pro_rc_adv_dispatch函数中对于LINK_ESTABLISHED_ACK 的处理:
case LINK_ESTABLISHED_ACK:
if(p_adv->transBear.bearAck.header.GPCF == BEARS_CTL &&
p_adv->transBear.bearAck.header.BearCtl == LINK_ACK){
//模组发送link open后收到 link ack
mesh_adv_prov_link_open_ack(p_adv);
mesh_adv_prov_send_invite(p_send_str);//发送invite
pro_input[0] = p_send_str->invite.attentionDura;
prov_para.provison_send_state = STATE_DEV_CAPA_ACK;
prov_para.link_id_filter =1; //开启 link id 过滤
mesh_node_prov_event_callback(EVENT_MESH_PRO_RC_LINK_START);
}
break;
我们对执行的函数一个个分析 mesh_adv_prov_link_open_ack函数:prov_oob清0,设置prov_para.rsp_ack_transnum
void mesh_adv_prov_link_open_ack(pro_PB_ADV *p_adv)
{
memset(&prov_oob,0,sizeof(prov_oob)); //prov_oob清0
SET_TC_FIFO(TSCRIPT_MESH_RX,(u8 *)(p_adv),p_adv->length+1);
LOG_MSG_INFO(TL_LOG_PROVISION, 0, 0,"rcv link open ack",0);
set_rsp_ack_transnum(p_adv);
}
//设置prov_para.rsp_ack_transnum
void set_rsp_ack_transnum(pro_PB_ADV *p_adv){
if( (p_adv->transBear.bearOpen.header.GPCF == BEARS_CTL && p_adv->transBear.bearAck.header.BearCtl == LINK_ACK )){
//Provisioning Bearer Control + Link ACK message
prov_para.rsp_ack_transnum = 0;
}else if(p_adv->transBear.bearAck.header.GPCF!= TRANS_ACK){
//不是 Transaction Acknowledgment PDU
prov_para.rsp_ack_transnum = p_adv->trans_num;
}
else{
//Transaction Acknowledgment PDU
}
}
mesh_adv_prov_send_invite函数 :发送invite void mesh_adv_prov_send_invite(mesh_pro_data_structer *p_send_str)
{
set_pro_invite(p_send_str,0); //对p_send_str赋值
send_multi_type_data(PRO_INVITE,para_pro);
SET_TC_FIFO(TSCRIPT_MESH_TX,(u8 *)(&(pro_adv_pkt.len)),pro_adv_pkt.len+1);
LOG_MSG_INFO(TL_LOG_PROVISION, 0, 0,"send invite",0);
send_rcv_retry_set(PRO_INVITE,0,0); //mesh_adv_provision_retry中使用
prov_para.trans_num_last = prov_para.trans_num; //保存trans_num
}
这里已经将invite压到buff里面了,但后面又调用了send_rcv_retry_set(PRO_INVITE,0,0); void send_rcv_retry_set(u8 cmd, u8 bearerCode, u8 ack_retry_flag)
{
prov_para.pro_cmd = cmd ;
prov_para.pro_bearerCode = bearerCode;
prov_para.cmd_send_tick = clock_time();
prov_para.cmd_send_start_tick = clock_time();
prov_para.cmd_retry_flag =1;
prov_para.ack_retry_flag = ack_retry_flag;
//这些参数在 mesh_adv_provision_retry 中调用,主要是设置重传
}
设置好重传后provison_send_state变为了 STATE_DEV_CAPA_ACK,我们下回接着分析。
|