양산 모드인 경우 부팅 시 본딩 유지

- bond_data_delete 플래시 기본값 1→0 으로 변경
- advertising_start(erase)에서 플래시 플래그까지 클리어하여 1회성 삭제 요청이 영구 상태로 남지 않도록 수정
- 전원 버튼으로 부팅되는 구조상 BSP startup event가 항상 CLEAR_BONDING_DATA로 해석되던 문제를 무력화(추후 전원 버튼 BSP -> GPIO 직접 제어로 교체 예정)
This commit is contained in:
2026-04-15 18:31:31 +09:00
parent e4ed1b7588
commit 16acb34bf0
2 changed files with 44 additions and 6 deletions

View File

@@ -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");