패스키 최초 1회 변경 가능 제한
This commit is contained in:
+111
-3
@@ -9,6 +9,11 @@
|
||||
******************************************************************************/
|
||||
#include <zephyr/kernel.h>
|
||||
#include <zephyr/sys/util.h>
|
||||
#include <zephyr/sys/reboot.h>
|
||||
#if IS_ENABLED(CONFIG_BT_SMP)
|
||||
#include <zephyr/bluetooth/bluetooth.h>
|
||||
#include <zephyr/bluetooth/conn.h>
|
||||
#endif
|
||||
#include <string.h>
|
||||
#include <limits.h>
|
||||
|
||||
@@ -131,6 +136,12 @@ int piezo_config_init(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void reboot_after_response(void)
|
||||
{
|
||||
k_msleep(100);
|
||||
sys_reboot(SYS_REBOOT_COLD);
|
||||
}
|
||||
|
||||
/*==============================================================================
|
||||
* CRC16 (CRC-CCITT, Nordic SDK 호환)
|
||||
*============================================================================*/
|
||||
@@ -697,6 +708,77 @@ static int cmd_msn(const uint8_t *data, uint8_t data_len)
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int cmd_msq(const uint8_t *data, uint8_t data_len)
|
||||
{
|
||||
ARG_UNUSED(data);
|
||||
ARG_UNUSED(data_len);
|
||||
|
||||
int err = send_response_u16("rsq:", 0x0000);
|
||||
if (err)
|
||||
{
|
||||
DBG_ERR("[CMD] msq tx failed err=%d\r\n", err);
|
||||
}
|
||||
|
||||
DBG_PRINTF("[CMD] msq -> power off\r\n");
|
||||
sleep_mode_enter();
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int cmd_mss(const uint8_t *data, uint8_t data_len)
|
||||
{
|
||||
ARG_UNUSED(data);
|
||||
ARG_UNUSED(data_len);
|
||||
|
||||
int err = send_response_u16("rss:", 0x0000);
|
||||
if (err)
|
||||
{
|
||||
DBG_ERR("[CMD] mss tx failed err=%d\r\n", err);
|
||||
}
|
||||
|
||||
DBG_PRINTF("[CMD] mss -> reboot\r\n");
|
||||
reboot_after_response();
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int cmd_msr(const uint8_t *data, uint8_t data_len)
|
||||
{
|
||||
uint16_t status = 0x0000;
|
||||
|
||||
ARG_UNUSED(data);
|
||||
ARG_UNUSED(data_len);
|
||||
|
||||
#if IS_ENABLED(CONFIG_BT_SMP)
|
||||
int err = bt_unpair(BT_ID_DEFAULT, NULL);
|
||||
if (err)
|
||||
{
|
||||
status = (uint16_t)(-err);
|
||||
DBG_ERR("[CMD] msr bt_unpair failed err=%d\r\n", err);
|
||||
}
|
||||
else
|
||||
{
|
||||
bond_data_delete = true;
|
||||
DBG_PRINTF("[CMD] msr bond data deleted\r\n");
|
||||
}
|
||||
#else
|
||||
bond_data_delete = true;
|
||||
DBG_PRINTF("[CMD] msr bond delete skipped (BT_SMP disabled)\r\n");
|
||||
#endif
|
||||
|
||||
int tx_err = send_response_u16("rsr:", status);
|
||||
if (tx_err)
|
||||
{
|
||||
DBG_ERR("[CMD] msr tx failed err=%d\r\n", tx_err);
|
||||
}
|
||||
|
||||
if (status == 0x0000)
|
||||
{
|
||||
DBG_PRINTF("[CMD] msr -> reboot\r\n");
|
||||
reboot_after_response();
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* msp? → IMU 1회 측정 → rsp: + accel XYZ + gyro XYZ (각 int16 빅엔디안) */
|
||||
static int cmd_msp(const uint8_t *data, uint8_t data_len)
|
||||
{
|
||||
@@ -1328,15 +1410,38 @@ static int cmd_mpz(const uint8_t *data, uint8_t data_len)
|
||||
return 1;
|
||||
}
|
||||
|
||||
memset(m_static_passkey, 0, sizeof(m_static_passkey));
|
||||
memcpy(m_static_passkey, data, PASSKEY_LENGTH);
|
||||
int err = app_nvs_save_passkey(m_static_passkey);
|
||||
if (m_passkey_changed != 0U)
|
||||
{
|
||||
/* 패스키가 변경된 경우 다시 바꿀 수 없음(FFFF 반환) */
|
||||
send_response_u16("rpz:", 0xFFFF);
|
||||
DBG_PRINTF("[CMD] mpz: passkey already changed\r\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* NVS 저장이 모두 성공한 뒤 RAM 값 확정 */
|
||||
char new_passkey[PASSKEY_BUF_SIZE];
|
||||
memset(new_passkey, 0, sizeof(new_passkey));
|
||||
memcpy(new_passkey, data, PASSKEY_LENGTH);
|
||||
|
||||
int err = app_nvs_save_passkey(new_passkey);
|
||||
if (err)
|
||||
{
|
||||
send_response_u16("rpz:", 0xFFFD);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* 변경 완료 플래그 세트 : 다음 mpz? 명령 차단 */
|
||||
err = app_nvs_save_passkey_changed(1U);
|
||||
if (err)
|
||||
{
|
||||
send_response_u16("rpz:", 0xFFFD);
|
||||
return 1;
|
||||
}
|
||||
|
||||
memset(m_static_passkey, 0, sizeof(m_static_passkey));
|
||||
memcpy(m_static_passkey, new_passkey, PASSKEY_LENGTH);
|
||||
m_passkey_changed = 1U;
|
||||
|
||||
send_response_ascii("rpz:", m_static_passkey, PASSKEY_LENGTH);
|
||||
DBG_PRINTF("[CMD] mpz updated\r\n");
|
||||
return 1;
|
||||
@@ -1396,6 +1501,9 @@ typedef struct
|
||||
|
||||
static const cmd_entry_t cmd_table[] =
|
||||
{
|
||||
{ "msq?", cmd_msq },
|
||||
{ "mss?", cmd_mss },
|
||||
{ "msr?", cmd_msr },
|
||||
{ "msn?", cmd_msn },
|
||||
{ "mls?", cmd_mls },
|
||||
{ "msp?", cmd_msp },
|
||||
|
||||
Reference in New Issue
Block a user