查看: 1250|回复: 0

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

[复制链接]

108

主题

163

帖子

618

积分

利尔达员工

Rank: 9Rank: 9Rank: 9

积分
618
发表于 2020-9-29 09:23:20 | 显示全部楼层 |阅读模式

收包函数解析:
首先在 app_event_handler 回调函数中调用 app_event_handler_adv,其中pa->data就是广播包中的Advertising data

int app_event_handler (u32 h, u8 *p, int n)
{
    ...
    if (h == (HCI_FLAG_EVENT_BT_STD | HCI_EVT_LE_META))     //LE event
    {
        u8 subcode = p[0];

    //------------ ADV packet --------------------------------------------
        if (subcode == HCI_SUB_EVT_LE_ADVERTISING_REPORT)   // ADV packet
        {
            event_adv_report_t *pa = (event_adv_report_t *)p;
            if(LL_TYPE_ADV_NONCONN_IND != (pa->event_type & 0x0F)){
                return 0;
            }
            send_to_hci = app_event_handler_adv(pa->data, ADV_FROM_MESH, 1);
        }
        ...
    }
}

我们在来看看 app_event_handler_adv 函数

#define MESH_ADV_TYPE_PRO          (0x29)
#define MESH_ADV_TYPE_MESSAGE   (0x2A)
#define MESH_ADV_TYPE_BEACON     (0x2B)

int app_event_handler_adv(u8 *p_payload, int src_type, u8 need_proxy_and_trans_par_val)
{
    int err = 0;
   
    mesh_cmd_bear_unseg_t *p_br = GET_BEAR_FROM_ADV_PAYLOAD(p_payload);
    u8 adv_type = p_br->type;
    //mesh message
    if(adv_type == MESH_ADV_TYPE_MESSAGE){      
        lpn_debug_set_event_handle_pin(1);
        err = mesh_rc_data_layer_network(p_payload, src_type, need_proxy_and_trans_par_val);
        lpn_debug_set_event_handle_pin(0);
        if(is_lpn_support_and_en){
            suspend_quick_check();    // rx handle ok
        }
    }
    //mesh Beacon 且 Beacon Type: Secure Network Beacon
    else if((adv_type == MESH_ADV_TYPE_BEACON)&&(p_br->beacon.type == SECURE_BEACON)){
        mesh_rc_data_beacon_sec(p_payload, 0);
    }
    //MESH_ADV_TYPE_PRO --> PB-ADV的广播包,也就是以PB-ADV为承载层的provisioning 广播包
    //mesh Beacon 且 Beacon Type: Unprovisioned Device Beacon
    else if((adv_type == MESH_ADV_TYPE_PRO)
        || ((adv_type == MESH_ADV_TYPE_BEACON)&&(p_br->beacon.type == UNPROVISION_BEACON))){    //
        u8 irq_rev = irq_disable();
        mesh_provision_rcv_process(p_payload,0);
        irq_restore(irq_rev);
    }else{
        online_st_rc_mesh_pkt(p_payload);
    }
    return err;
}

蓝牙官网关于 AD Type的定义如下:
mesh beacon 的type定义如下:

因此此函数将广播包分为以下三类:
  • mesh message
  • Secure Network Beacon
  • PB-ADV为承载层的provisioning 广播包 或 Unprovisioned Device Beacon




回复

使用道具 举报

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

本版积分规则

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