2번 모듈 신규(raspberry_pi4_sht30/): SHT30 온습도 → cafe24, raw-body X-Signature HMAC, 폐쇄망 오프라인 설치(vendor/install), systemd, CRC/포맷 자가점검. firmware sht30_fw wire 포맷과 byte-parity 검증. 1번 모듈 통합(raspberry_pi4/): 누수+카메라를 동일 서버로. 레거시 sha256(key+json) body-sig → X-Signature HMAC 전환, 사진 canonical=device_id|sensor_id|log_id|timestamp. 서버 통합(php/): api/sensor_data.php 누수 이벤트 수신, api/photo_upload.php 신규(HMAC·finfo·서버생성 파일명·nonce 멱등·sensor 결속), photo.php 인증 사진서빙, dashboard.php 누수 패널+사진, sms_send.php 누수 SMS, config.php 태그/요약. DB: sql/migration_add_leak.sql(가산·멱등), schema_sht30.sql 통합 스키마. 보안 하드닝(외부 펜테스트 대비, 확정 CRITICAL/HIGH 0): cron_heartbeat api_key fail-closed, setup_mfa 부트스트랩 토큰 post-enrollment 잠금, var/ PHP 실행차단, HSTS. 문서/테스트: SYSTEM_OVERVIEW.md, security_hardening_test.php 갱신. 참고: 사용자 요청으로 세션 외 기존 미커밋 변경도 함께 포함. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
87 lines
5.5 KiB
C
87 lines
5.5 KiB
C
/* =============================================================================
|
|
* app_config.h - SHT30 온습도 모니터링 STM32F407 펌웨어 공통 설정 (컴파일 타임)
|
|
*
|
|
* 이 헤더는 SHT30 온습도 보드의 네트워크/API/주기/핀 설정을 담는다.
|
|
* 운영 비밀값(API_KEY 등)은 secrets.h 로 분리한다(저장소 미포함).
|
|
* 보드 식별값(device_id 등)은 board_config.h 에서 BOARD_* 매크로로 정의한다.
|
|
*
|
|
* RPi config.py 대응:
|
|
* API_URL/API_KEY -> APP_API_HOST/APP_API_PATH/secrets.h:APP_API_KEY
|
|
* REPORT_INTERVAL -> APP_SHT30_REPORT_INTERVAL_SEC
|
|
* HTTP_TIMEOUT/RETRY -> APP_HTTP_*_*
|
|
* ===========================================================================*/
|
|
#ifndef APP_CONFIG_H
|
|
#define APP_CONFIG_H
|
|
|
|
/* ── 펌웨어 버전 (서버로 보고하는 app_version 필드) ───────────────────────── */
|
|
#define APP_VERSION "v2606-sht30"
|
|
|
|
/* ── 서버 API (Cafe24 PHP, HTTPS) ───────────────────────────────────────── */
|
|
/* 서버 호스트명. TLS SNI 및 HTTP Host 헤더, 인증서 CN/SAN 검증에 사용된다. */
|
|
#ifndef APP_API_HOST
|
|
#define APP_API_HOST "your-domain.example"
|
|
#endif
|
|
#ifndef APP_API_PORT
|
|
#define APP_API_PORT 443
|
|
#endif
|
|
/* sensor_data.php 경로 (서버 디렉터리 구조에 맞게 조정) */
|
|
#ifndef APP_API_PATH
|
|
#define APP_API_PATH "/raspi_leck_detecter/api/sensor_data.php"
|
|
#endif
|
|
|
|
/* ── 주기/타이밍 (초) ───────────────────────────────────────────────────── */
|
|
/* SHT30 측정/보고 주기 (sht30_monitor.py: 기본 300초, 최소 30초) */
|
|
#define APP_SHT30_REPORT_INTERVAL_SEC 300u
|
|
|
|
/* ── HTTP/네트워크 재시도 (config.py HTTP_*_*) ──────────────────────────── */
|
|
#define APP_HTTP_TIMEOUT_MS 10000u /* 단일 요청 타임아웃 */
|
|
#define APP_HTTP_RETRY_COUNT 3u /* 재시도 횟수 */
|
|
#define APP_HTTP_RETRY_DELAY_MS 5000u /* 재시도 간 대기 */
|
|
|
|
/* ── 시간 동기 (SNTP) — TLS 인증서 유효기간/timestamp 필드에 필수 ────────── */
|
|
/* !! 폐쇄망(air-gapped) 필수 설정 !!
|
|
* APP_SNTP_SERVER 는 *폐쇄망 내부 LAN NTP 서버*의 IP/호스트로 반드시 교체할 것.
|
|
* 인터넷 NTP(예: pool.ntp.org)는 폐쇄망에서 도달 불가 → SNTP 실패 → RTC 미설정 →
|
|
* timestamp=0 → TLS 연결 차단 + 서버가 신선도 위반으로 전량 거부 = 보고 전면 장애.
|
|
* (DNS 가 없을 수 있으므로 호스트명보다 LAN IP 권장. 아래는 RFC5737 TEST-NET 자리표시자
|
|
* 로, 그대로 두면 의도적으로 동기 실패하여 미설정을 드러낸다.)
|
|
* 보조: 서버 ingest 200 응답의 server_now 로 RTC 드리프트를 미세보정하는 후속 작업
|
|
* 예정(LSI 드리프트/간헐 NTP 대비). 최초 시각 확보는 LAN NTP(또는 배터리 RTC)가 필요. */
|
|
#define APP_SNTP_SERVER "192.0.2.123" /* TODO(deploy): 폐쇄망 LAN NTP IP 로 교체 */
|
|
#define APP_SNTP_RETRY_DELAY_MS 15000u
|
|
|
|
/* ── 네트워크 주소 지정 ─────────────────────────────────────────────────── */
|
|
/* 1 = DHCP 우선(실패 시 아래 static fallback), 0 = static 고정 */
|
|
#define APP_NET_USE_DHCP 1
|
|
#define APP_NET_DHCP_TIMEOUT_MS 20000u
|
|
/* static fallback (DHCP 실패 또는 APP_NET_USE_DHCP=0 일 때) */
|
|
#define APP_NET_STATIC_IP "192.168.0.50"
|
|
#define APP_NET_STATIC_NETMASK "255.255.255.0"
|
|
#define APP_NET_STATIC_GW "192.168.0.1"
|
|
#define APP_NET_STATIC_DNS "8.8.8.8"
|
|
|
|
/* ── 워치독 (IWDG) ──────────────────────────────────────────────────────── */
|
|
#define APP_WATCHDOG_TIMEOUT_MS 20000u /* 이 시간 내 refresh 없으면 리셋 */
|
|
|
|
/* ── 디버그 로그 UART (USART3: PD8 TX / PD9 RX) ──────────────────────────
|
|
* 주의: PA2/PA3 는 LAN8720 RMII(ETH_MDIO 등)와 충돌하므로 로그 UART 로 쓸 수 없다.
|
|
* 따라서 ST-Link VCP(PA2/PA3) 대신 USART3 PD8/PD9 를 사용한다. HARDWARE.md 참조. */
|
|
#define APP_LOG_UART_BAUD 115200u
|
|
|
|
/* ── SHT30 보드: I2C 설정 (board_sht30) ─────────────────────────────────── */
|
|
#define APP_SHT30_I2C_ADDR 0x44u /* 7-bit 주소 */
|
|
/* 센서 plausibility 범위 (벗어나면 metric_status="out_of_range").
|
|
* 주의: 운영 경보 임계(고온/저온/고습/저습 → SMS)는 서버(php/config.php 의
|
|
* METRIC_* 상수)에서 판정한다. 폐쇄망에서 임계값을 바꿀 때 펌웨어 재플래시가
|
|
* 불필요하도록, 펌웨어는 측정 원값만 보고하고 아래 범위는 센서 물리/타당성
|
|
* 한계로만 사용한다. */
|
|
#define APP_SHT30_TEMP_LOW_C (-40.0)
|
|
#define APP_SHT30_TEMP_HIGH_C (125.0)
|
|
#define APP_SHT30_RH_LOW (0.0)
|
|
#define APP_SHT30_RH_HIGH (100.0)
|
|
|
|
/* 운영 비밀값/보드 식별 */
|
|
#include "secrets.h"
|
|
#include "board_config.h"
|
|
|
|
#endif /* APP_CONFIG_H */
|