收包函数解析:首先在 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
|