From 3c8e6d6957f119460f86e901108572a3020052ed Mon Sep 17 00:00:00 2001 From: cw2007 Date: Fri, 10 Jul 2026 10:42:31 +0900 Subject: [PATCH] =?UTF-8?q?docs(sht30):=20=EC=98=A8=EC=8A=B5=EB=8F=84=202?= =?UTF-8?q?=EB=B2=88=20=EB=AA=A8=EB=93=88=20=EB=AC=B8=EC=84=9C=EB=A5=BC=20?= =?UTF-8?q?STM32=20=EA=B8=B0=EB=B3=B8=20=E2=86=92=20Raspberry=20Pi=20?= =?UTF-8?q?=EA=B8=B0=EB=B3=B8=EC=9C=BC=EB=A1=9C=20=EC=A0=95=ED=95=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 실제 배포는 Raspberry Pi 4(raspberry_pi4_sht30)인데 다수 문서가 STM32를 "현재 단일보드"로 서술하던 드리프트를 교정(README/SYSTEM_OVERVIEW/ DEPLOYMENT_PLAN은 이미 Pi 기준). - SHT30_SENSOR2_SETUP.md: Pi 기본 전면 재작성, STM32는 마이그레이션 대안 - README.md / wiring_diagram.md / INSTALL_PI_SERVER.md: Pi 기본으로 재구성 - ops_checks.php / security_evidence.php: /etc/sht30-sensor.env → config_local.py - api/sensor_data.php: 헤더 예시 device_id rpi4-sht30-01 - examples/*.html: device_id 교정 + 구식 env 예제 폐기 배너 - 전압 경고 정정: "5V=소자 손상"은 틀림(모듈 2.4~5.5V). Pi에서 3.3V 쓰는 이유는 Pi GPIO 3.3V 전용(5V 시 SDA/SCL 5V → Pi 손상) --- docs/INSTALL_PI_SERVER.md | 2 +- docs/README.md | 16 +-- docs/SHT30_SENSOR2_SETUP.md | 123 ++++++++++-------- .../admin_dashboard_capture_source.html | 2 +- docs/examples/sht30_sensor2_setup.html | 8 +- docs/wiring_diagram.md | 11 +- php/api/sensor_data.php | 4 +- php/ops_checks.php | 2 +- php/security_evidence.php | 2 +- 9 files changed, 96 insertions(+), 74 deletions(-) diff --git a/docs/INSTALL_PI_SERVER.md b/docs/INSTALL_PI_SERVER.md index 2f0b607..e4f8427 100644 --- a/docs/INSTALL_PI_SERVER.md +++ b/docs/INSTALL_PI_SERVER.md @@ -255,4 +255,4 @@ https://your-domain.example/raspi_leck_detecter/security_evidence.php - SMS 수신자 번호 - 관리자 계정과 원문 비밀번호, `ADMIN_TOTP_SECRET` - 서버 업로드 경로 -- 장비 ID(`stm32-sht30-01`)와 설치 위치 +- 장비 ID(`rpi4-sht30-01`, 배포=Raspberry Pi 4)와 설치 위치 diff --git a/docs/README.md b/docs/README.md index db8230c..74b3e5a 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,32 +1,32 @@ # 서버실 온습도(SHT30) 모니터링 시스템 v2606 -Sensirion SHT30 온습도 센서, STM32F407VGT6(FreeRTOS) 펌웨어, Cafe24 PHP/MySQL, Cafe24 SMS를 이용한 서버실 온습도 24시간 모니터링 및 임계 초과 SMS 알림 시스템입니다. 측정값은 5분 주기로 서버에 전송되어 웹 대시보드에 표시되고, 고온/저온/고습/저습 임계를 초과하면 SMS로 통보합니다. 펌웨어는 유선 Ethernet(LAN8720 RMII) + 온칩 TLS(mbedTLS HTTPS)로 서버에 보고합니다. +Sensirion SHT30 온습도 센서를 **Raspberry Pi 4 Model B(Python)**로 I2C 측정하여 Cafe24 PHP/MySQL 서버에 5분 주기로 보고하고, 웹 대시보드 표시와 고온/저온/고습/저습 임계 초과 SMS 알림을 제공하는 시스템입니다. Pi 는 유선 Ethernet(또는 WiFi) + HTTPS(raw-body HMAC 서명)로 보고합니다. (STM32F407VGT6 베어메탈 펌웨어는 별도의 마이그레이션 트랙 `firmware/` — 하드웨어 미검증, 현재 배포와 무관.) ## 구성 ```text -[SHT30] --I2C--> [STM32F407VGT6 (sht30_fw)] --유선 Ethernet/TLS--> [Cafe24 PHP API] +[SHT30] --I2C--> [Raspberry Pi 4 (raspberry_pi4_sht30, Python)] --Ethernet/TLS--> [Cafe24 PHP API] | [MySQL DB] | [Cafe24 SMS / Dashboard] ``` -- 단일 보드 `sht30_fw` (`sensor_id=2`, `device_id=stm32-sht30-01`). -- SHT30 → STM32 I2C1(PB6 SCL / PB7 SDA, 주소 0x44, 3.3V/GND, 4.7kΩ 풀업). 상세 배선은 [wiring_diagram.md](./wiring_diagram.md) 및 [firmware/docs/HARDWARE.md](../firmware/docs/HARDWARE.md) §3 참조. -- 측정 주기: 5분(펌웨어 `APP_SHT30_REPORT_INTERVAL_SEC=300`). 최초 1회 startup, 이후 periodic. -- 인증: 펌웨어가 `X-Signature = lowercase_hex(HMAC-SHA256(키=API_KEY, 메시지=요청본문 바이트))`(raw-body) 헤더로 서명하고 서버가 검증합니다. 관리자 로그인은 비밀번호 해시 + TOTP MFA + 감사로그로 보호합니다. +- Raspberry Pi 4 노드 `raspberry_pi4_sht30`(= `deploy/03_pi_b_sht30_id2`) — `sensor_id=2`, `device_id=rpi4-sht30-01`. +- SHT30 → Pi I2C 버스 1(GPIO2 SDA / GPIO3 SCL, 주소 0x44, VCC=3.3V/GND, 4.7kΩ 풀업). 상세 배선은 [SHT30_SENSOR2_SETUP.md](./SHT30_SENSOR2_SETUP.md) 및 `deploy/03_pi_b_sht30_id2/WIRING.html` 참조. (STM32 대안 배선 PB6/PB7 은 [wiring_diagram.md](./wiring_diagram.md).) +- 측정 주기: 5분(`raspberry_pi4_sht30/config.py REPORT_INTERVAL=300`). 최초 1회 startup, 이후 periodic. +- 인증: Pi 가 `X-Signature = lowercase_hex(HMAC-SHA256(키=API_KEY, 메시지=요청본문 바이트))`(raw-body) 헤더로 서명하고 서버가 검증합니다. 관리자 로그인은 비밀번호 해시 + TOTP MFA + 감사로그로 보호합니다. ## 폴더 구조 ```text docs/ README.md # 설치/운영 허브 문서 - INSTALL_PI_SERVER.md # STM32 펌웨어 및 Cafe24 서버 설치 설명서 + INSTALL_PI_SERVER.md # Cafe24 서버 설치 설명서 (Pi/STM32 공통) OPERATIONS_SECURITY_CHECKLIST.md # 월간 운영·보안 점검표 SECURITY_EVIDENCE_PACKAGE.md # 보안대책서 첨부자료 패키지 wiring_diagram.md # SHT30 I2C 배선도 - SHT30_SENSOR2_SETUP.md # SHT30 설치 가이드(STM32 기본 / RPi 대안) + SHT30_SENSOR2_SETUP.md # SHT30 설치 가이드(Raspberry Pi 4 기본 / STM32 마이그레이션 대안) solutions/ # 실행-검토 사이클에서 얻은 교훈/반복 방지 기록 firmware/ # STM32F407VGT6 베어메탈 펌웨어 (sht30_fw) common/ # 이식 코어(sha256/sig/jsonbody/sht30_convert/httpapi/net 등) diff --git a/docs/SHT30_SENSOR2_SETUP.md b/docs/SHT30_SENSOR2_SETUP.md index 0c1f286..5a37ff5 100644 --- a/docs/SHT30_SENSOR2_SETUP.md +++ b/docs/SHT30_SENSOR2_SETUP.md @@ -1,6 +1,9 @@ -# SHT30 온습도 센서 설치 가이드 +# SHT30 온습도 센서 설치 가이드 (2번 모듈, sensor_id=2) -서버실 온습도 모니터링을 위해 Sensirion SHT30(한진데이터 P4422-3, I2C) 센서를 설치하고 서버에 연동하는 가이드입니다. 기본 구성은 STM32F407VGT6 펌웨어(`sht30_fw`, `sensor_id=2`, `device_id=stm32-sht30-01`)이며, 폐쇄망의 다른 환경을 위한 Raspberry Pi I2C 대안도 함께 설명합니다. +서버실 온습도 모니터링을 위해 Sensirion SHT30(한진데이터 P4422-3, I2C) 센서를 설치하고 서버에 연동하는 가이드입니다. **현재 배포 구성은 Raspberry Pi 4 Model B + Python**(`raspberry_pi4_sht30/` = `deploy/03_pi_b_sht30_id2/`, `device_id=rpi4-sht30-01`)입니다. STM32F407 펌웨어(`firmware/`)는 **별도의 마이그레이션 트랙**(하드웨어 미검증)으로, 실제 필드 배포와 무관합니다 — §3 참고. + +> 기준 문서: 루트 [`README.md`](../README.md), [`SYSTEM_OVERVIEW.md`](../SYSTEM_OVERVIEW.md), [`docs/DEPLOYMENT_PLAN_RPI4x3.md`](./DEPLOYMENT_PLAN_RPI4x3.md) §5. +> 현장 인쇄용 배선·핀맵 도해: `deploy/03_pi_b_sht30_id2/WIRING.html` (브라우저로 열람 — 자체 완결형, 오프라인 가능). ## 1. 서버 준비 @@ -22,85 +25,93 @@ API는 `sht30` 측정을 수신하면 `leak_sensor_status`를 갱신하고 측정값을 `leak_sensor_metric`에 저장합니다. 서버가 `METRIC_*` 임계로 고온/저온/고습/저습을 판정하고, 초과 시 종류별 30분 쿨다운으로 SMS를 발송합니다. -## 2. 기본 구성 — STM32F407VGT6 (`sht30_fw`) + > 서버는 수집 시 `device_id`/`app_version`/`metric_type` 문자열을 **검증하지 않습니다**(HMAC 서명 + 필수필드 + `sensor_id` 범위 1..255 + 타임스탬프 신선도만 확인). 따라서 라즈베리파이 클라이언트(`rpi4-sht30-01`, `app_version=v2606-sht30-rpi4`)가 그대로 수용됩니다. -### 2.1 I2C 배선 +## 2. 기본 구성 — Raspberry Pi 4 (I2C) -SHT30을 STM32 I2C1 버스에 연결합니다(상세는 [wiring_diagram.md](./wiring_diagram.md), [firmware/docs/HARDWARE.md](../firmware/docs/HARDWARE.md) §3). +소스: `deploy/03_pi_b_sht30_id2/`(= `raspberry_pi4_sht30/`). 근거는 해당 README.md, SETUP.md, WIRING.html, config.py, install.sh, systemd/sht30-sensor.service. + +### 2.1 I2C 배선 (Pi 4 40핀 헤더, 버스 1) + +상세 도해는 `deploy/03_pi_b_sht30_id2/WIRING.html`(SVG 핀맵 + 스키매틱 + 체크리스트)을 브라우저로 여십시오. ```text -SHT30 VDD -> STM32 3.3V -SHT30 GND -> STM32 GND -SHT30 SCL -> STM32 PB6 (I2C1_SCL, AF4) + 4.7kΩ 풀업 -> 3.3V -SHT30 SDA -> STM32 PB7 (I2C1_SDA, AF4) + 4.7kΩ 풀업 -> 3.3V -SHT30 ADDR -> GND (주소 0x44; VDD 면 0x45) +SHT30 VCC -> Raspberry Pi 3.3V (물리 핀 1) ★ Pi 에서는 5V(핀 2·4) 금지 (모듈은 2.4~5.5V OK나, 5V 전원 시 SDA/SCL 5V → 3.3V 전용 Pi GPIO 손상) +SHT30 GND -> Raspberry Pi GND (핀 6; 대체 9·14·20·25·30·34·39) +SHT30 SDA -> Raspberry Pi GPIO2 / SDA1 (물리 핀 3) + 4.7kΩ 풀업 -> 3.3V +SHT30 SCL -> Raspberry Pi GPIO3 / SCL1 (물리 핀 5) + 4.7kΩ 풀업 -> 3.3V +SHT30 ADDR -> GND (주소 0x44; VDD면 0x45) ``` -- 7-bit 주소 `0x44`(`APP_SHT30_I2C_ADDR`), I2C 100kHz 권장. -- 명령 `0x2C06`(high-repeatability) → 약 20ms 대기 → 6바이트 read. +- 7-bit 주소 `0x44`(ADDR→GND). `config.py`의 `I2C_ADDR`와 반드시 일치. +- I2C 풀업 4.7kΩ ×2 — **SHT30 모듈에 온보드 풀업이 있으면 생략**. +- 명령 `0x2C06`(high-repeatability) → 약 20ms 대기 → 6바이트 read (드라이버 `sht30_driver.py`). -### 2.2 펌웨어 설정·빌드 (폐쇄망) +### 2.2 설정값 준비 (`config_local.py`) ```bash -cp firmware/common/secrets.h.example firmware/common/secrets.h -# secrets.h 의 APP_API_KEY 를 서버 config.local.php 의 API_KEY 와 동일하게 채운다. +cd /home/pi/raspberry_pi4_sht30 +cp config_local.example.py config_local.py +# config_local.py 를 열어 채운다: +# API_URL = https://<서버>/raspi_leck_detecter/api/sensor_data.php (1번 모듈과 동일 엔드포인트) +# API_KEY = 서버 config.local.php 의 API_KEY 와 바이트 단위로 동일 +# DEVICE_ID = rpi4-sht30-01 +# DEVICE_LOCATION = 온습도 측정 위치(예: 서버실) ``` -| 위치 | 설정 | -|---|---| -| `firmware/common/secrets.h` | `APP_API_KEY` = 서버 `API_KEY` | -| `firmware/common/app_config.h` | `APP_API_HOST`, `APP_API_PATH`(`/raspi_leck_detecter/api/sensor_data.php`), 네트워크 | -| `firmware/common/app_config.h` | `APP_SHT30_REPORT_INTERVAL_SEC`(기본 300초), `APP_SHT30_I2C_ADDR`(0x44) | -| `firmware/certs/server_ca.c` | 자리표시자 CA → 실제 Cafe24 루트 CA | +`config_local.py`가 없으면 실행 시 **명확한 오류로 즉시 중단**(fail closed)됩니다. `config_local.py`·`API_KEY`는 **절대 커밋하지 마세요**(`.gitignore` 처리됨). `sensor_id`(=2)/`sensor_name`은 `config.py` 기본값을 씁니다. -벤더링·빌드·플래시 절차는 [firmware/docs/BUILD_OFFLINE.md](../firmware/docs/BUILD_OFFLINE.md)를 따릅니다. `sht30_fw` 타깃을 빌드해 보드에 플래시합니다. +> ⚠️ 설정은 **Python `config_local.py`** 로만 합니다. 과거 문서에 있던 `/etc/sht30-sensor.env` 환경파일 방식은 이 라즈베리파이 모듈에서 **사용하지 않습니다**. -### 2.3 동작 확인 +### 2.3 설치 (폐쇄망 오프라인 + 온라인 폴백) -USART3(PD8/PD9, 115200) 콘솔 로그에서 확인합니다. - -- I2C1 초기화 및 SHT30 0x44 응답, 첫 측정값 -- 네트워크/SNTP/TLS 핸드셰이크 → 서버 200 응답 → `startup` 보고 -- 이후 5분 주기 `periodic` 측정 보고 - -## 3. 대안 구성 — Raspberry Pi I2C (STM32 외 대안) - -STM32 보드를 쓸 수 없는 환경에서는 Raspberry Pi 40핀 헤더 I2C 버스 1을 사용할 수 있습니다. - -```text -SHT30 VCC -> Raspberry Pi 3.3V (pin 1) -SHT30 GND -> Raspberry Pi GND -SHT30 SDA -> Raspberry Pi GPIO2 / SDA1 / pin 3 -SHT30 SCL -> Raspberry Pi GPIO3 / SCL1 / pin 5 -SHT30 ADDR -> GND (주소 0x44; 점퍼 변경 시 0x45) -``` - -I2C를 먼저 활성화합니다. +원샷: ```bash -sudo raspi-config # Interface Options -> I2C -> enable -sudo apt-get update -sudo apt-get install -y python3-venv python3-smbus i2c-tools +cd /home/pi/raspberry_pi4_sht30 && bash setup.sh # 설치→서비스 등록→검증→하드닝 (sudo 붙이지 말 것) ``` -센서가 보이는지 확인합니다. +또는 단계별: ```bash -i2cdetect -y 1 # 44 또는 45 가 보여야 함 +chmod +x install.sh && ./install.sh # apt(i2c-tools 등) + I2C 자동 활성화 + venv(requests/smbus2) + 로그 +sudo reboot # I2C 를 새로 켠 경우 1회 (usermod -aG i2c 반영에도 필요) ``` -환경 파일 `/etc/sht30-sensor.env`를 생성하고 다음 값을 채웁니다. +- 폐쇄망: 인터넷 되는 **동일 aarch64** 머신에서 `./vendor.sh`로 `wheelhouse/`+`debs/` 번들 → 타깃 Pi로 복사 후 `./install.sh`(자동 오프라인). -```text -API_URL=https://your-domain.example/raspi_leck_detecter/api/sensor_data.php -API_KEY=서버와 동일한 API_KEY -DEVICE_ID=rpi-sht30-01 -DEVICE_LOCATION=온습도 측정 위치 -SHT30_SENSOR_ID=2 -SHT30_I2C_ADDR=0x44 +### 2.4 systemd 자동 실행 + +```bash +sudo cp systemd/sht30-sensor.service /etc/systemd/system/ +sudo systemctl daemon-reload +sudo systemctl enable --now sht30-sensor +sudo systemctl status sht30-sensor +journalctl -u sht30-sensor -f ``` -> 대안 구성에서도 `sensor_id=2`, raw-body 서명(`X-Signature = lowercase_hex(HMAC-SHA256(키=API_KEY, 메시지=요청본문 바이트))`), 5분 측정 주기는 동일합니다. 임계 판정과 SMS는 모두 서버에서 수행하므로 측정 송신부만 환경에 맞게 구성하면 됩니다. +유닛 특성: `User=pi`, **`SupplementaryGroups=i2c`**(`/dev/i2c-1` 접근), `Restart=always`. `install.sh`는 유닛을 자동 설치하지 않으므로 이 단계 누락 금지. + +### 2.5 동작 확인 + +```bash +i2cdetect -y 1 # 0x44(또는 0x45)가 보여야 함 +source venv/bin/activate +python3 test_sensor.py # CRC/포맷 자가점검 + 측정 1회 +python3 test_connection.py # 서명 POST 200(연결/서명), 403=API_KEY 불일치, 400=NTP/타임스탬프 +``` + +> ⚠️ `test_sensor.py`는 하드웨어 없이도 **시뮬레이션으로 통과**합니다. 반드시 `i2cdetect`로 0x44를 먼저 확인하고, 서비스 로그에 시뮬레이션 WARN이 없는지 점검하세요(시뮬레이션 폴백이 배선 오류를 가릴 수 있음). + +- Pi 시각은 **NTP 동기** 필수(서버 timestamp 신선도 ±600초 — Raspberry Pi OS 기본 활성). +- 이후 5분 주기 `periodic` 측정 보고. + +## 3. 대안(계획) 구성 — STM32F407VGT6 (`sht30_fw`) + +STM32F407 베어메탈 펌웨어(`firmware/`)는 RPi → STM32 전환을 목표로 한 **별도 마이그레이션 트랙**입니다. `docs/stm32f407_migration_plan.md` 기준 **코드는 완성되었으나 실제 보드 빌드·플래시·HIL 시험은 미검증**(서버 host/CA/API키/SNTP가 모두 placeholder)이며, 현재 필드에는 배포되어 있지 않습니다. 이 경로를 실제로 채택하려면 `firmware/docs/HARDWARE.md`·`firmware/docs/BUILD_OFFLINE.md`를 따라 하드웨어를 확정·검증해야 합니다. + +- I2C1 배선(참고): SHT30 SCL → STM32 **PB6**(I2C1_SCL, AF4), SDA → **PB7**(I2C1_SDA, AF4), 각 4.7kΩ 풀업 → 3.3V, ADDR → GND(0x44). VCC는 **3.3V**(5V 금지). +- 보고 식별자: `device_id=stm32-sht30-01`, `app_version=v2606-sht30`, `sensor_id=2`. 서버는 이 문자열을 검증하지 않으므로 Pi/STM32 어느 쪽이든 유효 서명이면 동일하게 수용합니다. ## 4. 대시보드 결과 diff --git a/docs/examples/admin_dashboard_capture_source.html b/docs/examples/admin_dashboard_capture_source.html index ef7e17a..7dc869f 100644 --- a/docs/examples/admin_dashboard_capture_source.html +++ b/docs/examples/admin_dashboard_capture_source.html @@ -142,7 +142,7 @@

2번 센서 (SHT30 온습도)

- 서버실 상단 랙 / rpi-sht30-01
+ 서버실 상단 랙 / rpi4-sht30-01
정상
온도 24.3C습도 48.1%
측정: 2026-05-21 09:29:18
diff --git a/docs/examples/sht30_sensor2_setup.html b/docs/examples/sht30_sensor2_setup.html index 7f177bb..7063a19 100644 --- a/docs/examples/sht30_sensor2_setup.html +++ b/docs/examples/sht30_sensor2_setup.html @@ -336,12 +336,18 @@ 문제 대처 +
+ ⚠️ 구버전 예제 안내. 이 문서는 /etc/sht30-sensor.env 환경파일 방식으로 작성된 구식 예제입니다. + 실제 배포 구성은 라즈베리파이 config_local.py(Python) 방식이며 장비 ID는 rpi4-sht30-01입니다. + 최신 정확한 절차는 SHT30_SENSOR2_SETUP.md 및 deploy/03_pi_b_sht30_id2/를 따르세요. +
+

1. 준비물

라즈베리파이 1대 - 온습도 전용 장비. 장비 ID 예시는 `rpi-sht30-01`. + 온습도 전용 장비. 장비 ID 예시는 `rpi4-sht30-01`.
SHT30 P4422-3 센서 diff --git a/docs/wiring_diagram.md b/docs/wiring_diagram.md index 64c77c1..a2d944a 100644 --- a/docs/wiring_diagram.md +++ b/docs/wiring_diagram.md @@ -1,8 +1,13 @@ -# SHT30 온습도 센서 ↔ STM32F407VGT6 I2C 배선도 +# SHT30 온습도 센서 I2C 배선도 (Raspberry Pi 4 기본 / STM32 변형) -Sensirion SHT30(한진데이터 P4422-3 모듈)을 STM32F407VGT6의 I2C1 버스에 연결합니다. 단일 보드 `sht30_fw`(`sensor_id=2`, `device_id=stm32-sht30-01`)가 5분 주기로 온습도를 측정해 유선 Ethernet/TLS로 서버에 보고합니다. +Sensirion SHT30(한진데이터 P4422-3 모듈) I2C 배선 요약입니다. -상세 핀맵·전원·클럭원은 [firmware/docs/HARDWARE.md](../firmware/docs/HARDWARE.md) §3을 따릅니다. 본 문서는 SHT30 I2C 결선 요약입니다. +> **현재 배포 = Raspberry Pi 4 Model B.** Pi 에서는 SHT30 을 40핀 헤더 I2C 버스 1에 연결합니다: +> **VCC→3.3V(핀 1), GND→핀 6, SDA→GPIO2/핀 3, SCL→GPIO3/핀 5, ADDR→GND(0x44)**, SDA/SCL 4.7kΩ 풀업→3.3V(모듈 내장 시 생략). +> 상세 도해는 `deploy/03_pi_b_sht30_id2/WIRING.html`(SVG 핀맵) 및 [SHT30_SENSOR2_SETUP.md](./SHT30_SENSOR2_SETUP.md) §2.1 을 보세요. +> `sensor_id=2`, `device_id=rpi4-sht30-01`, `raspberry_pi4_sht30/config.py REPORT_INTERVAL=300`(5분). +> +> **아래 §는 STM32F407VGT6 변형**(마이그레이션 트랙 `firmware/`, 하드웨어 미검증·현재 배포와 무관)의 I2C1(PB6/PB7) 배선입니다. 상세 핀맵·전원·클럭원은 [firmware/docs/HARDWARE.md](../firmware/docs/HARDWARE.md) §3. ## 센서 동작 개요 diff --git a/php/api/sensor_data.php b/php/api/sensor_data.php index 1cdf97f..2a47ff2 100644 --- a/php/api/sensor_data.php +++ b/php/api/sensor_data.php @@ -5,7 +5,7 @@ // // [요청 형식 — 온습도(SHT30, 2번 모듈)] POST application/json // { -// "device_id": "stm32-sht30-01", +// "device_id": "rpi4-sht30-01", // 배포=Raspberry Pi 4 (STM32 펌웨어면 "stm32-sht30-01") // "device_location": "서버실", // "sensor_id": 2, // "sensor_name": "2번 센서 (SHT30)", @@ -15,7 +15,7 @@ // "temperature_c": 24.50, // "humidity_percent": 48.30, // "metric_status": "normal", // 펌웨어 plausibility 판정(참고용; 서버가 재판정) -// "app_version": "v2606-sht30" +// "app_version": "v2606-sht30-rpi4" // Pi 배포 (STM32 펌웨어면 "v2606-sht30"); 서버는 검증 안 함 // } // // [요청 형식 — 누수(1번 모듈)] POST application/json diff --git a/php/ops_checks.php b/php/ops_checks.php index 3d847a6..55e8bed 100644 --- a/php/ops_checks.php +++ b/php/ops_checks.php @@ -94,7 +94,7 @@ function collect_ops_checks(): array { } $default_recipients = count(SMS_RECIPIENTS) === 1 && preg_replace('/\D+/', '', SMS_RECIPIENTS[0]) === '01000000000'; - $checks[] = ops_check('설정', 'API 키', API_KEY !== 'change-this-api-key', 'API_KEY 운영값 설정 여부', 'config.local.php와 /etc/sht30-sensor.env(또는 펌웨어 secrets.h)의 API 키를 동일하게 설정', 'critical', 'config.local.php 원문 미공개 설정 확인'); + $checks[] = ops_check('설정', 'API 키', API_KEY !== 'change-this-api-key', 'API_KEY 운영값 설정 여부', 'config.local.php와 라즈베리파이 config_local.py(또는 STM32 펌웨어 secrets.h)의 API 키를 동일하게 설정', 'critical', 'config.local.php 원문 미공개 설정 확인'); $checks[] = ops_check('설정', '관리자 비밀번호', ADMIN_PASSWORD_HASH !== '', 'ADMIN_PASSWORD_HASH 설정 여부', 'php setup_hash.php "new-password" 실행 후 config.local.php에 반영', 'critical', '관리자 해시 설정 확인'); $checks[] = ops_check('관리자 인증', '관리자 MFA', admin_mfa_configured(), 'ADMIN_TOTP_SECRET 설정 여부', '인증 앱용 Base32 비밀키를 config.local.php에 설정', 'critical', 'MFA 등록 확인표'); $checks[] = ops_check('관리자 인증', 'MFA 설정 토큰 정리', MFA_SETUP_TOKEN === '', MFA_SETUP_TOKEN === '' ? '정리됨(비어 있음)' : '설정됨 — 등록 후 제거 필요', 'MFA 등록을 마쳤으면 config.local.php의 MFA_SETUP_TOKEN을 빈 값으로 비우세요. 남아 있으면 토큰 보유자가 setup_mfa.php로 새 TOTP 비밀키를 발급·검증할 수 있습니다.', 'warn', 'config.local.php MFA_SETUP_TOKEN 미설정 확인'); diff --git a/php/security_evidence.php b/php/security_evidence.php index 983f69b..11ac78f 100644 --- a/php/security_evidence.php +++ b/php/security_evidence.php @@ -27,7 +27,7 @@ $control_rows = [ ['사업 범위', '서버실 온습도(SHT30) 모니터링 및 임계치 초과 SMS 경보, 장비 오프라인 알림', '보안대책서 사업개요', 'SECURITY_PLAN_PASS_READINESS.md'], ['전송구간', 'HTTPS/TLS 사용, API 서명 검증', 'api/sensor_data.php, config.php', 'SOURCE_SECURITY_EVIDENCE.md'], ['API 인증', '공유 API 키 기반 요청 서명 검증', 'config.php', '403 테스트 결과'], - ['비밀값', 'config.local.php와 /etc/sht30-sensor.env로 분리', 'config.php', '설정 파일 권한 화면'], + ['비밀값', 'config.local.php(서버)와 config_local.py(라즈베리파이)로 분리', 'config.php', '설정 파일 권한 화면'], ['관리자 인증', '비밀번호 해시, CSRF, 세션 보호, 실패 제한, 관리자 MFA', 'login.php, admin_security.php', '로그인 화면, MFA 등록 확인표'], ['감사로그', '로그인 성공/실패, 로그아웃, 관리자 활동 접속기록 저장', 'admin_security.php, php/var/admin_audit.log', '감사로그 파일'], ['로그관리', '센서 측정 이력(leak_sensor_metric)·SMS 발송 이력(leak_sms_log)·관리자 감사로그 저장 및 보관기간 정리', 'MySQL, retention_cleanup.php', '보관기간 정리 dry-run 결과'],