From d63a9cfa3c2f54e550230fe45be8576d9ad6634f Mon Sep 17 00:00:00 2001 From: jhChun Date: Tue, 31 Mar 2026 14:17:35 +0900 Subject: [PATCH] =?UTF-8?q?BLE=20=EB=B3=B4=EC=95=88=20=EC=8B=A4=ED=8C=A8?= =?UTF-8?q?=20=EC=8B=9C=20=EC=9E=90=EB=8F=99=20=EC=9E=AC=ED=8E=98=EC=96=B4?= =?UTF-8?q?=EB=A7=81=20=EB=B0=8F=20=EB=B2=84=EA=B7=B8=203=EA=B1=B4=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 앱과 기기 사이 키가 불일치하는 경우 새로운 키 생성 요청(재페어링 허용) - main.c: PM_EVT_CONN_SEC_CONFIG_REQ 중복 핸들러 제거 - main.c: DEV 모드에서 pm_peers_delete() 이중 호출 방지 - main.c: 활성 연결 중 advertising 재시작 방지(m_conn_handle 체크) - ble_quick_security: 보안 실패 시 bond 삭제 + 자동 재페어링 시도 - ble_quick_security: allow_repairing = true (항상 재페어링 허용) --- pc_firm/ble_security/ble_quick_security.c | 14 +++++++++++--- .../ble_peripheral/ble_app_bladder_patch/main.c | 17 +++++++---------- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/pc_firm/ble_security/ble_quick_security.c b/pc_firm/ble_security/ble_quick_security.c index 5441a43..82f5fba 100644 --- a/pc_firm/ble_security/ble_quick_security.c +++ b/pc_firm/ble_security/ble_quick_security.c @@ -126,15 +126,23 @@ void ble_security_quick_pm_handler(pm_evt_t const *p_evt) pm_handler_disconnect_on_sec_failure(p_evt); } } else { - // 기타 보안 실패 → disconnect - pm_handler_disconnect_on_sec_failure(p_evt); + // 기타 보안 실패 → bond 삭제 후 재페어링 시도 + pm_peer_id_t peer_id; + if (pm_peer_id_get(p_evt->conn_handle, &peer_id) == NRF_SUCCESS + && peer_id != PM_PEER_ID_INVALID) { + pm_peer_delete(peer_id); + } + err_code = pm_conn_secure(p_evt->conn_handle, true); + if (err_code != NRF_SUCCESS) { + pm_handler_disconnect_on_sec_failure(p_evt); + } } break; case PM_EVT_CONN_SEC_CONFIG_REQ: { pm_conn_sec_config_t config = { - .allow_repairing = m_state.dev_mode + .allow_repairing = true }; pm_conn_sec_config_reply(p_evt->conn_handle, &config); } diff --git a/project/ble_peripheral/ble_app_bladder_patch/main.c b/project/ble_peripheral/ble_app_bladder_patch/main.c index 0c75a47..177e69e 100644 --- a/project/ble_peripheral/ble_app_bladder_patch/main.c +++ b/project/ble_peripheral/ble_app_bladder_patch/main.c @@ -944,19 +944,15 @@ static void pm_evt_handler(pm_evt_t const * p_evt) DBG_PRINTF("[PM] Sec failed\r\n"); break; - /* 모든 본딩 삭제 완료 → 광고 재시작 */ + /* 모든 본딩 삭제 완료 → 활성 연결이 없을 때만 광고 재시작 */ case PM_EVT_PEERS_DELETE_SUCCEEDED: DBG_PRINTF("[PM] Bonds erased\r\n"); - advertising_start(false); + if (m_conn_handle == BLE_CONN_HANDLE_INVALID) { + advertising_start(false); + } break; - /* 보안 설정 요청 → 재페어링 허용 */ - case PM_EVT_CONN_SEC_CONFIG_REQ: - { - pm_conn_sec_config_t conn_sec_config = {.allow_repairing = true}; - pm_conn_sec_config_reply(p_evt->conn_handle, &conn_sec_config); - } - break; + /* PM_EVT_CONN_SEC_CONFIG_REQ → ble_quick_security에서 처리 */ /* 피어 데이터(본딩 정보) 갱신 성공 → 피어 BLE 주소 저장 */ case PM_EVT_PEER_DATA_UPDATE_SUCCEEDED: @@ -1641,7 +1637,8 @@ static void main_s(void * p_context) battery_timer_start(); #if FEATURE_SECURE_CONNECTION - advertising_start(erase_bonds || bond_data_delete); + /* DEV 모드: ble_security_quick_init()에서 이미 bond 삭제됨 → 중복 방지 */ + advertising_start(!ble_security_is_dev_mode() && (erase_bonds || bond_data_delete)); #else advertising_start(); #endif