Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 16acb34bf0 | |||
| e4ed1b7588 | |||
| 87fbccf650 | |||
| c539b0c756 |
@@ -1014,28 +1014,23 @@ static void all_sensors(void)
|
||||
info4 = true; /* 센서값을 전역 변수에 저장 (BLE 전송 안 함) */
|
||||
|
||||
/* 1. 배터리 전압 측정 → info_batt에 저장 */
|
||||
DBG_PRINTF("1");
|
||||
battery_saadc_done = false;
|
||||
battery_level_meas();
|
||||
for (timeout_cnt = 0; !battery_saadc_done && timeout_cnt < 100; timeout_cnt++)
|
||||
{
|
||||
dr_sd_delay_ms(1); /* 콜백 오면 즉시 탈출, 최대 100ms */
|
||||
}
|
||||
DBG_PRINTF("3");
|
||||
|
||||
/* 2. IMU 6축 단발 읽기 → info_imu[6]에 저장 */
|
||||
hw_i2c_init_once();
|
||||
imu_read_direct();
|
||||
DBG_PRINTF("4");
|
||||
|
||||
/* 3. 온도 측정 → info_temp에 저장 (TMP235는 Piezo TX/RX 전원 필요) */
|
||||
if (!dr_piezo_is_power_on())
|
||||
{
|
||||
dr_piezo_power_on();
|
||||
}
|
||||
DBG_PRINTF("5");
|
||||
|
||||
DBG_PRINTF("6");
|
||||
tmp235_saadc_done = false;
|
||||
tmp235_voltage_level_meas();
|
||||
|
||||
@@ -1043,7 +1038,6 @@ static void all_sensors(void)
|
||||
{
|
||||
dr_sd_delay_ms(1); /* 콜백 오면 즉시 탈출, 최대 100ms, 타임아웃 시 이전 값 또는 쓰레기값.. */
|
||||
}
|
||||
DBG_PRINTF("8");
|
||||
|
||||
info4 = false;
|
||||
|
||||
@@ -1064,7 +1058,6 @@ static void all_sensors(void)
|
||||
buf[19] = (uint8_t)(info_temp & 0xFF);
|
||||
|
||||
dr_binary_tx_safe(buf, 10); /* 20바이트 = 10워드 */
|
||||
DBG_PRINTF("9");
|
||||
|
||||
/* 배터리, IMU, 온도 확인용 로그 */
|
||||
//if (g_plat.log) g_plat.log("-------------------------------------------------------------------------------------\r\n[Battery] %u\r\n[IMU] %d,%d,%d,%d,%d,%d\r\n[Temperature] %u\r\n\r\n", info_batt, (int16_t)info_imu[0], (int16_t)info_imu[1], (int16_t)info_imu[2],
|
||||
@@ -1088,7 +1081,6 @@ static int Cmd_mbb(const ParsedCmd *cmd)
|
||||
dr_adc_err_t err;
|
||||
|
||||
all_sensors(); /* 배터리, IMU, 온도 센서 먼저 측정 */
|
||||
DBG_PRINTF("10");
|
||||
|
||||
if (maa_async_is_busy())
|
||||
{
|
||||
@@ -1123,7 +1115,6 @@ static int Cmd_mbb(const ParsedCmd *cmd)
|
||||
dr_piezo_power_off();
|
||||
return 1;
|
||||
}
|
||||
DBG_PRINTF("11\n");
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -121,7 +121,7 @@
|
||||
/*==============================================================================
|
||||
* 빌드 설정
|
||||
*============================================================================*/
|
||||
#define BLE_DEV_MODE 1 /* 1: 개발 모드 (보안 없음), 0: 양산 모드 (패스키 필수) */
|
||||
#define BLE_DEV_MODE 0 /* 1: 개발 모드 (보안 없음), 0: 양산 모드 (패스키 필수) */
|
||||
|
||||
/*==============================================================================
|
||||
* 하드웨어 핀 정의
|
||||
@@ -137,11 +137,9 @@
|
||||
#define APP_BLE_OBSERVER_PRIO 3 /* BLE 이벤트 옵저버 우선순위 */
|
||||
#define APP_ADV_INTERVAL 64 /* 광고 간격: 64 x 0.625ms = 40ms */
|
||||
|
||||
#if FEATURE_NO_SLEEP
|
||||
#define APP_ADV_DURATION 0 /* 슬립 비활성화(테스트) 시: 무한 광고 */
|
||||
#else
|
||||
#define APP_ADV_DURATION 18000 /* 광고 지속시간: 18000 x 10ms = 3분 → 타임아웃 시 슬립 */
|
||||
#endif
|
||||
#define APP_ADV_DURATION_NORMAL 60000 /* 일반 disconnect 시 광고 지속시간: 60000 x 10ms = 10분 */
|
||||
#define APP_ADV_DURATION_UNLIMITED 0 /* 의도치 않은 disconnect 시: 무한 광고 */
|
||||
#define APP_ADV_DURATION APP_ADV_DURATION_NORMAL /* 기본 광고 지속시간 (disconnect reason에 따라 런타임 변경) */
|
||||
|
||||
#define MIN_CONN_INTERVAL MSEC_TO_UNITS(30, UNIT_1_25_MS) /* 최소 연결 간격: 30ms */
|
||||
#define MAX_CONN_INTERVAL MSEC_TO_UNITS(30, UNIT_1_25_MS) /* 최대 연결 간격: 30ms */
|
||||
@@ -361,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);
|
||||
}
|
||||
@@ -816,7 +814,8 @@ static void on_adv_evt(ble_adv_evt_t ble_adv_evt)
|
||||
* @brief BLE 광고 초기화
|
||||
*
|
||||
* 광고 데이터 설정: 디바이스 이름(전체), NUS UUID
|
||||
* 광고 모드: Fast (40ms 간격), 지속시간 3분 (FEATURE_NO_SLEEP 시 무한)
|
||||
* 광고 모드: Fast (40ms 간격), 기본 지속시간 10분
|
||||
* disconnect reason에 따라 런타임에 무한 광고로 전환될 수 있음
|
||||
*/
|
||||
static void advertising_init(void)
|
||||
{
|
||||
@@ -827,12 +826,7 @@ static void advertising_init(void)
|
||||
|
||||
init.advdata.name_type = BLE_ADVDATA_FULL_NAME;
|
||||
init.advdata.include_appearance = true;
|
||||
|
||||
#if FEATURE_NO_SLEEP
|
||||
init.advdata.flags = BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE;
|
||||
#else
|
||||
init.advdata.flags = BLE_GAP_ADV_FLAGS_LE_ONLY_LIMITED_DISC_MODE;
|
||||
#endif
|
||||
|
||||
init.srdata.uuids_complete.uuid_cnt = sizeof(m_adv_uuids) / sizeof(m_adv_uuids[0]);
|
||||
init.srdata.uuids_complete.p_uuids = m_adv_uuids;
|
||||
@@ -869,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
|
||||
@@ -946,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);
|
||||
}
|
||||
@@ -961,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; /* 본딩 완료 상태 */
|
||||
}
|
||||
@@ -1025,8 +1036,22 @@ static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context)
|
||||
{
|
||||
/* BLE 연결이 끊어지는 경우 */
|
||||
case BLE_GAP_EVT_DISCONNECTED:
|
||||
DBG_PRINTF("[BLE] Disconnected (reason 0x%02X)\r\n",
|
||||
p_ble_evt->evt.gap_evt.params.disconnected.reason);
|
||||
{
|
||||
uint8_t disc_reason = p_ble_evt->evt.gap_evt.params.disconnected.reason;
|
||||
|
||||
/* 의도치 않은 disconnect 판별:
|
||||
* 0x08 supervision timeout, 0x22 LMP response timeout,
|
||||
* 0x3D MIC failure, 0x3E connection failed to be established
|
||||
* → 무한 광고 유지 + 슬립 진입 차단
|
||||
*/
|
||||
bool unintended_disc = (disc_reason == BLE_HCI_CONNECTION_TIMEOUT) ||
|
||||
(disc_reason == BLE_HCI_STATUS_CODE_LMP_RESPONSE_TIMEOUT) ||
|
||||
(disc_reason == BLE_HCI_CONN_TERMINATED_DUE_TO_MIC_FAILURE)||
|
||||
(disc_reason == BLE_HCI_CONN_FAILED_TO_BE_ESTABLISHED);
|
||||
|
||||
DBG_PRINTF("[BLE] Disconnected (reason 0x%02X)%s\r\n",
|
||||
disc_reason, unintended_disc ? " [UNINTENDED]" : "");
|
||||
|
||||
ble_connection_st = 0;
|
||||
m_conn_handle = BLE_CONN_HANDLE_INVALID;
|
||||
m_tx_in_progress = false;
|
||||
@@ -1034,13 +1059,26 @@ static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context)
|
||||
maa_async_abort(); // 비동기 측정 상태에 의한 먹통 현상 방지
|
||||
s_tx_pending = false; // pending TX 클리어
|
||||
|
||||
if (device_status == true)
|
||||
/* 광고 지속시간을 disconnect 원인에 따라 런타임 조정 */
|
||||
(void)sd_ble_gap_adv_stop(m_advertising.adv_handle);
|
||||
m_advertising.adv_modes_config.ble_adv_fast_timeout =
|
||||
unintended_disc ? APP_ADV_DURATION_UNLIMITED : APP_ADV_DURATION_NORMAL;
|
||||
|
||||
ret_code_t adv_err = ble_advertising_start(&m_advertising, BLE_ADV_MODE_FAST);
|
||||
if (adv_err != NRF_SUCCESS && adv_err != NRF_ERROR_INVALID_STATE)
|
||||
{
|
||||
APP_ERROR_CHECK(adv_err);
|
||||
}
|
||||
|
||||
/* 의도치 않은 disconnect: 슬립 진입 차단하여 지속 광고 보장 */
|
||||
if (!unintended_disc && device_status == true)
|
||||
{
|
||||
if (device_sleep_mode() == 0)
|
||||
{
|
||||
device_status = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case BLE_GAP_EVT_CONNECTED:
|
||||
@@ -1226,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)
|
||||
@@ -1759,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");
|
||||
|
||||
|
||||
@@ -143,7 +143,6 @@ void battery_event_handler( nrf_drv_saadc_evt_t const * p_event )
|
||||
nrf_drv_saadc_uninit();
|
||||
|
||||
/* 콜백 완료 알림 (all_sensors 대기 해제용) */
|
||||
if (info4) DBG_PRINTF("2");
|
||||
battery_saadc_done = true;
|
||||
|
||||
/* ADC값 → mV 변환 (매크로: ADC x 600/1023 x 6) */
|
||||
|
||||
@@ -569,7 +569,6 @@ int imu_read_direct(void)
|
||||
/* 일반 모드: "rsp:" 태그로 BLE 즉시 전송 */
|
||||
format_data(imu_bin_buffer, "rsp:", ssp_data, 12);
|
||||
dr_binary_tx_safe(imu_bin_buffer, 8);
|
||||
DBG_PRINTF("0");
|
||||
}
|
||||
|
||||
/* IMU 슬립 모드: PWR_MGMT0 = 0x00 → 가속도/자이로 모두 OFF (전력 절감) */
|
||||
|
||||
@@ -164,7 +164,6 @@ void tmp235_voltage_handler(nrf_drv_saadc_evt_t const * p_event) /* TMP325 Vout
|
||||
// data_tx_handler(ble_tx_buffer);
|
||||
}
|
||||
|
||||
DBG_PRINTF("7");
|
||||
tmp235_saadc_done = true;
|
||||
}
|
||||
|
||||
|
||||
@@ -50,12 +50,6 @@
|
||||
#define FEATURE_PRINTF 0
|
||||
#endif
|
||||
|
||||
//==========================================================
|
||||
// <q> FEATURE_NO_SLEEP
|
||||
// 테스트를 위하여 슬립에 들어가지 않도록.
|
||||
#ifndef FEATURE_NO_SLEEP
|
||||
#define FEATURE_NO_SLEEP 0
|
||||
#endif
|
||||
//==========================================================
|
||||
// <q> FEATURE_DELAY
|
||||
// 테스트를 위하여 SEND timer 500ms
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
|
||||
#include "ble_quick_security.h"
|
||||
#include "peer_manager_handler.h"
|
||||
#include "nrf_ble_lesc.h"
|
||||
#include "app_error.h"
|
||||
#include <string.h>
|
||||
|
||||
@@ -35,6 +36,10 @@ void ble_security_quick_init(bool development_mode)
|
||||
err_code = pm_init();
|
||||
APP_ERROR_CHECK(err_code);
|
||||
|
||||
// Initialize LESC module (ECDH P-256 key pair generation)
|
||||
err_code = nrf_ble_lesc_init();
|
||||
APP_ERROR_CHECK(err_code);
|
||||
|
||||
// Configure security parameters
|
||||
memset(&sec_params, 0, sizeof(ble_gap_sec_params_t));
|
||||
|
||||
@@ -61,7 +66,7 @@ void ble_security_quick_init(bool development_mode)
|
||||
// ===== PRODUCTION MODE: Full security =====
|
||||
sec_params.bond = 1; // Enable bonding
|
||||
sec_params.mitm = 1; // Enable MITM
|
||||
sec_params.lesc = 0; // Standard pairing
|
||||
sec_params.lesc = 1; // LE Secure Connections (ECDH P-256)
|
||||
sec_params.keypress = 0;
|
||||
sec_params.io_caps = BLE_GAP_IO_CAPS_DISPLAY_ONLY; // Show passkey
|
||||
sec_params.oob = 0;
|
||||
@@ -112,9 +117,15 @@ void ble_security_quick_pm_handler(pm_evt_t const *p_evt)
|
||||
case PM_EVT_CONN_SEC_SUCCEEDED:
|
||||
if (m_state.dev_mode) {
|
||||
DBG_PRINTF("DEV: Connected (no security)\r\n");
|
||||
} else {
|
||||
pm_conn_sec_status_t status;
|
||||
if (pm_conn_sec_status_get(p_evt->conn_handle, &status) == NRF_SUCCESS) {
|
||||
DBG_PRINTF("PROD: Link secured - LESC=%d MITM=%d bonded=%d\r\n",
|
||||
status.lesc, status.mitm_protected, status.bonded);
|
||||
} else {
|
||||
DBG_PRINTF("PROD: Link secured (bonded)\r\n");
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case PM_EVT_CONN_SEC_FAILED:
|
||||
|
||||
Reference in New Issue
Block a user