case BLE_GAP_EVT_DISCONNECTED: { m_conn_handle = BLE_CONN_HANDLE_INVALID; break; } case BLE_GATTC_EVT_PRIM_SRVC_DISC_RSP: { ble_gattc_evt_prim_srvc_disc_rsp_t *p_response = &p_ble_evt->evt.gattc_evt.params.prim_srvc_disc_rsp; // Traverse all discovered services for (uint32_t i = 0; i < p_response->count; i++) { ble_uuid_t uuid = p_response->services[i].uuid; // Determine the service type based on the UUID if (ble_uuid_cmp(&uuid, &m_svc_uuid) == 0) { // Save the service handle m_svc_handle = p_response->services[i].handle_range.start_handle; } } break; } case BLE_GATTC_EVT_CHAR_DISC_RSP: { ble_gattc_evt_char_disc_rsp_t *p_response = &p_ble_evt->evt.gattc_evt.params.char_disc_rsp; // Traverse all discovered characteristics for (uint32_t i = 0; i < p_response->count; i++) { ble_uuid_t uuid = p_response->chars[i].uuid; // Determine the characteristic type based on the UUID if (ble_uuid_cmp(&uuid, &m_char_uuid) == 0) { // Save the characteristic handle m_char_handle = p_response->chars[i].handle_value; } } // Characteristic discovery completed, can perform read/write operations, etc. break; }
时间: 2024-02-14 17:23:47 浏览: 134
这段代码是关于 BLE(蓝牙低功耗)连接和服务/特征发现的处理。在第一个 case 中,处理 BLE 设备断开连接的事件。在第二个 case 中,处理主服务发现响应事件。代码通过遍历发现的服务列表,用 UUID 来确定服务类型,并保存服务句柄。在第三个 case 中,处理特征发现响应事件。代码通过遍历发现的特征列表,用 UUID 来确定特征类型,并保存特征句柄。在这个 case 结束时,特征发现已经完成,可以执行读/写等操作。
相关问题
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); // 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); } }
这是一个 Bluetooth Low Energy (BLE) 事件处理函数,用于处理 BLE 事件。它首先从事件中获取连接句柄和连接角色信息,然后根据角色信息将事件分发给不同的处理函数。如果设备角色是 BLE_GAP_ROLE_PERIPH,或者事件是广告超时事件,则将事件分发给 ble_evt_dispatch 函数进行处理。如果设备角色是 BLE_GAP_ROLE_CENTRAL,或者事件是 BLE_GAP_EVT_ADV_REPORT,则将事件分发给 ble_module_central_evt 函数进行处理。
void ble_conn_handler(uint8_t conn_id, T_GAP_CONN_STATE new_state, uint16_t disc_cause) { struct ble_gap_event event; memset(&event, 0, sizeof(event)); switch (new_state) { case GAP_CONN_STATE_CONNECTED: { DBG_DIRECT("BLE connected, conn_id:%d\n", conn_id); event.type = BLE_GAP_EVENT_CONNECT; event.connect.conn_handle = conn_id; notify_ble_event_to_listeners(&event); } break; case GAP_CONN_STATE_DISCONNECTED: { DBG_DIRECT("BLE disconnected, conn_id:%d, reason:0x%02x\n", conn_id, (uint8_t)disc_cause); event.type = BLE_GAP_EVENT_DISCONNECT; event.disconnect.reason = (uint8_t)disc_cause; event.disconnect.conn.conn_handle = conn_id; notify_ble_event_to_listeners(&event); } break; default: break; } }
这段代码是关于蓝牙连接状态的处理函数,当蓝牙连接状态发生改变时,会调用这个函数。其中,参数conn_id表示连接句柄,new_state表示新的连接状态,disc_cause表示断开原因。函数中使用了一个结构体ble_gap_event来记录蓝牙连接状态的事件,当连接状态为GAP_CONN_STATE_CONNECTED时,将事件类型设为BLE_GAP_EVENT_CONNECT,并记录连接句柄,然后调用notify_ble_event_to_listeners函数通知监听者;当连接状态为GAP_CONN_STATE_DISCONNECTED时,将事件类型设为BLE_GAP_EVENT_DISCONNECT,并记录断开原因和连接句柄,然后同样调用notify_ble_event_to_listeners函数通知监听者。
阅读全文