ble_evt_dispatch(p_ble_evt, p_context)和ble_module_central_evt(p_ble_evt, p_context)的区别
时间: 2023-09-10 11:12:29 浏览: 161
`ble_evt_dispatch(p_ble_evt, p_context)`是一个通用的BLE事件分派函数,它会将收到的BLE事件分派到相应的处理函数中去。而`ble_module_central_evt(p_ble_evt, p_context)`是一个特定模块(central)的BLE事件处理函数,它会处理某个特定BLE中心设备的事件。也就是说,`ble_evt_dispatch()`是一个通用的事件分派函数,而`ble_module_central_evt()`是一个特定模块的事件处理函数。
相关问题
Wireshark抓蓝牙包中,ble_evt怎样使用
在Wireshark中抓取蓝牙包时,ble_evt是指BLE协议栈产生的事件,在Wireshark中可以通过过滤器来筛选出这些事件。具体操作步骤如下:
1. 打开Wireshark并开始抓包。
2. 在过滤器中输入“btcommon.evt_code” (注意大小写),选择“is”并在下拉列表中选择相应的事件代码(比如0x02表示连接状态改变事件)。点击“Apply”按钮。
3. Wireshark会过滤出所有符合条件的BLE事件包,用户可以通过查看这些包的详细信息来了解BLE设备之间的通信过程。
需要注意的是,Wireshark抓取的蓝牙包可能会受到环境干扰,导致某些消息被丢失或者出现错误。因此,在分析蓝牙通信过程时,需要结合实际情况进行分析。
static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context) { uint16_t conn_handle = p_ble_evt->evt.gap_evt.conn_handle; uint16_t role = ble_conn_state_role(conn_handle); #if __USER_1_DEBUG__ test_printf("role = %d\r\n", role); #endif // Based on the role this device plays in the connection, dispatch to the right handler. if (role == BLE_GAP_ROLE_PERIPH || ble_evt_is_advertising_timeout(p_ble_evt)) { ble_evt_dispatch(p_ble_evt, p_context); } else if ((role == BLE_GAP_ROLE_CENTRAL) || (p_ble_evt->header.evt_id == BLE_GAP_EVT_ADV_REPORT)) { ble_module_central_evt(p_ble_evt, p_context); } }
这段代码实现了一个 BLE 事件处理函数,当发生 BLE 事件时,该函数会被调用。函数首先通过连接句柄获取 BLE 设备的角色(是从设备还是主设备),然后根据角色类型分发事件到不同的事件处理函数中。
如果该设备是从设备(BLE_GAP_ROLE_PERIPH),或者广播超时(ble_evt_is_advertising_timeout(p_ble_evt)),则直接调用 ble_evt_dispatch() 函数处理该事件。
如果该设备是主设备(BLE_GAP_ROLE_CENTRAL),或者事件 ID 是 BLE_GAP_EVT_ADV_REPORT,则调用 ble_module_central_evt() 函数处理该事件。
其中,p_ble_evt 是一个 BLE 事件结构体指针,包含了 BLE 事件的各种信息,而 p_context 则是一个用户定义的上下文指针,可以用来传递一些额外的参数或数据。
阅读全文