From 16acb34bf010e9ada1b68755b971d4627f04d855 Mon Sep 17 00:00:00 2001 From: jhchun Date: Wed, 15 Apr 2026 18:31:31 +0900 Subject: [PATCH] =?UTF-8?q?=EC=96=91=EC=82=B0=20=EB=AA=A8=EB=93=9C?= =?UTF-8?q?=EC=9D=B8=20=EA=B2=BD=EC=9A=B0=20=EB=B6=80=ED=8C=85=20=EC=8B=9C?= =?UTF-8?q?=20=EB=B3=B8=EB=94=A9=20=EC=9C=A0=EC=A7=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - bond_data_delete 플래시 기본값 1→0 으로 변경 - advertising_start(erase)에서 플래시 플래그까지 클리어하여 1회성 삭제 요청이 영구 상태로 남지 않도록 수정 - 전원 버튼으로 부팅되는 구조상 BSP startup event가 항상 CLEAR_BONDING_DATA로 해석되던 문제를 무력화(추후 전원 버튼 BSP -> GPIO 직접 제어로 교체 예정) --- .../ble_app_bladder_patch/hal/fds/fstorage.c | 4 +- .../ble_app_bladder_patch/main.c | 46 +++++++++++++++++-- 2 files changed, 44 insertions(+), 6 deletions(-) diff --git a/project/ble_peripheral/ble_app_bladder_patch/hal/fds/fstorage.c b/project/ble_peripheral/ble_app_bladder_patch/hal/fds/fstorage.c index 067eb01..2923269 100644 --- a/project/ble_peripheral/ble_app_bladder_patch/hal/fds/fstorage.c +++ b/project/ble_peripheral/ble_app_bladder_patch/hal/fds/fstorage.c @@ -116,8 +116,8 @@ void fds_default_value_set(void) /* Static Passkey */ memcpy(m_config.static_passkey, static_passkey_dflt, 6); - /* Bond data delete */ - m_config.bond_data_delete = 1; + /* Bond data delete — 기본값: 삭제 요청 없음 (공장 초기화 경로에서만 1로 세팅) */ + m_config.bond_data_delete = 0; /* Reset status */ m_config.reset_status = reset_status_dflt; diff --git a/project/ble_peripheral/ble_app_bladder_patch/main.c b/project/ble_peripheral/ble_app_bladder_patch/main.c index 2bdc58a..217d0d9 100644 --- a/project/ble_peripheral/ble_app_bladder_patch/main.c +++ b/project/ble_peripheral/ble_app_bladder_patch/main.c @@ -121,7 +121,7 @@ /*============================================================================== * 빌드 설정 *============================================================================*/ -#define BLE_DEV_MODE 1 /* 1: 개발 모드 (보안 없음), 0: 양산 모드 (패스키 필수) */ +#define BLE_DEV_MODE 0 /* 1: 개발 모드 (보안 없음), 0: 양산 모드 (패스키 필수) */ /*============================================================================== * 하드웨어 핀 정의 @@ -359,7 +359,7 @@ static void load_default_config(void) memcpy(m_static_passkey, DEFAULT_PASSKEY, PASSKEY_LENGTH); m_reset_status = 1; - bond_data_delete = 1; + bond_data_delete = 0; DBG_PRINTF("[CFG] Default (S/N=%s)\r\n", SERIAL_NO); } @@ -863,7 +863,14 @@ static void advertising_start(bool erase_bonds_flag) { if (erase_bonds_flag == true) { + DBG_PRINTF("[BOND] Delete requested (count_before=%lu)\r\n", + (unsigned long)pm_peer_count()); + + /* 본딩 삭제 요청 플래그를 플래시에서도 클리어 → 다음 부팅 시 재삭제 방지 */ bond_data_delete = false; + m_config.bond_data_delete = 0; + config_save(); + delete_bonds(); /* 삭제 완료 후 pm_evt_handler에서 광고 시작 */ } else @@ -940,7 +947,8 @@ static void pm_evt_handler(pm_evt_t const * p_evt) /* 모든 본딩 삭제 완료 → 활성 연결이 없을 때만 광고 재시작 */ case PM_EVT_PEERS_DELETE_SUCCEEDED: - DBG_PRINTF("[PM] Bonds erased\r\n"); + DBG_PRINTF("[BOND] Deleted all (count_after=%lu)\r\n", + (unsigned long)pm_peer_count()); if (m_conn_handle == BLE_CONN_HANDLE_INVALID) { advertising_start(false); } @@ -955,6 +963,15 @@ static void pm_evt_handler(pm_evt_t const * p_evt) if (return_code == NRF_SUCCESS) { memcpy(c_addr, peer_bonding_data.peer_ble_id.id_addr_info.addr, sizeof(c_addr)); + + /* 새 본딩 생성 시 피어 ID와 주소를 함께 로그로 남김 */ + if (p_evt->params.peer_data_update_succeeded.data_id == PM_PEER_DATA_ID_BONDING) + { + DBG_PRINTF("[BOND] Created peer_id=%u addr=%02X:%02X:%02X:%02X:%02X:%02X (count=%lu)\r\n", + p_evt->peer_id, + c_addr[5], c_addr[4], c_addr[3], c_addr[2], c_addr[1], c_addr[0], + (unsigned long)pm_peer_count()); + } } m_reset_status = 10; /* 본딩 완료 상태 */ } @@ -1247,7 +1264,12 @@ static void buttons_leds_init(bool * p_erase_bonds) err_code = bsp_btn_ble_init(NULL, &startup_event); APP_ERROR_CHECK(err_code); - *p_erase_bonds = (startup_event == BSP_EVENT_CLEAR_BONDING_DATA); + /* VesiScan은 전원 버튼을 눌러서 부팅하는 구조이므로, 부팅 순간에는 항상 + * 전원 버튼이 눌린 상태로 읽힌다. Nordic BSP는 이 상태를 + * BSP_EVENT_CLEAR_BONDING_DATA로 해석해 본딩을 삭제하려 하므로, + * startup event 기반 본딩 삭제 트리거를 무효화한다. */ + (void)startup_event; + *p_erase_bonds = false; } static void log_init(void) @@ -1780,6 +1802,22 @@ int main(void) conn_params_init(); #if FEATURE_SECURE_CONNECTION peer_manager_init(); + + /* 부팅 시점의 본딩 상태 로그 */ + { + uint32_t bond_count = pm_peer_count(); + DBG_PRINTF("[BOOT] Bond state: count=%lu flag_delete=%d erase_bonds=%d\r\n", + (unsigned long)bond_count, bond_data_delete, erase_bonds); + if (bond_count > 0) + { + pm_peer_id_t pid = pm_next_peer_id_get(PM_PEER_ID_INVALID); + while (pid != PM_PEER_ID_INVALID) + { + DBG_PRINTF("[BOOT] Bonded peer id=%u\r\n", pid); + pid = pm_next_peer_id_get(pid); + } + } + } #endif DBG_PRINTF(" gap/gatt/svc/adv/conn/sec OK\r\n");