查看: 1655|回复: 2

[技术交流] 8258_mesh_gw 工程说明-代码说明(六)

[复制链接]

108

主题

163

帖子

618

积分

利尔达员工

Rank: 9Rank: 9Rank: 9

积分
618
发表于 2020-12-31 09:59:17 | 显示全部楼层 |阅读模式
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,我们下回接着分析。

回复

使用道具 举报

0

主题

1

帖子

7

积分

助理工程师

Rank: 1

积分
7
发表于 2021-2-2 15:48:37 | 显示全部楼层
http://bbs.lierda.com/forum.php? ... =8258%5C_mesh%5C_gw

第一篇图没了,能补一下吗?
回复

使用道具 举报

108

主题

163

帖子

618

积分

利尔达员工

Rank: 9Rank: 9Rank: 9

积分
618
 楼主| 发表于 2021-2-5 10:05:24 | 显示全部楼层
wotula 发表于 2021-2-2 15:48
http://bbs.lierda.com/forum.php?mod=viewthread&tid=10756&highlight=8258%5C_mesh%5C_gw

第一篇图没了 ...

帖子已重发:http://bbs.lierda.com/forum.php? ... amp;_dsign=509e8b0f
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表