Skip to content

Latest commit

 

History

History
243 lines (179 loc) · 9.66 KB

File metadata and controls

243 lines (179 loc) · 9.66 KB

🌱 가상 스마트팜 시스템 (Virtual Smart Farm System)

UNIX 시스템 프로그래밍 기말 프로젝트


팀장: 안민철 (anmincheol-71)
팀원: 백승찬 (kairos1228)
제출일: 2025년 12월 4일


1. 주제 설명

1.1 프로젝트 개요

본 프로젝트는 실제 하드웨어 없이 순수 소프트웨어로 스마트팜 환경을 시뮬레이션하는 시스템입니다. UNIX 시스템 프로그래밍에서 학습한 다양한 기술들을 종합적으로 활용하여, 센서-서버-액추에이터로 구성된 IoT 시스템을 가상으로 구현하였습니다.

1.2 프로젝트 목표

  • System V IPC (Message Queue, Shared Memory, Semaphore) 활용
  • 프로세스 생성 및 관리 (fork, wait, signal)
  • 파이프를 통한 프로세스 간 통신
  • POSIX 스레드 (pthread) 활용
  • 시스템 정보 조회 (uname, getpid 등)
  • 파일 입출력을 통한 로그 기록

1.3 시스템 특징

  • 가상 물리 엔진: 단순 난수가 아닌 뉴턴 냉각 법칙을 적용한 온도 변화 시뮬레이션
  • 실시간 모니터링: ANSI Escape Code를 활용한 컬러풀한 대시보드 UI
  • 안전한 종료: Graceful Shutdown으로 모든 프로세스 자동 종료

2. 시스템 설계도

2.1 전체 시스템 구조

시스템은 4개의 독립적인 프로세스로 구성되며, System V IPC를 통해 통신합니다.

┌─────────────────────────────────────────────────────────────────────┐
│                        Virtual SmartFarm System                     │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│   [P1] SENSOR          Message Queue         [P3] SERVER            │
│   ┌───────────┐     ────────────────────▶   ┌──────────────────┐   │
│   │ 🌡️ 온도    │        (센서 데이터)        │ Main Process     │   │
│   │ 💧 습도    │                            │  └─ fork() ──▶ Child (로그 기록) │
│   │ ⚙️ 물리엔진 │                            │  └─ pthread ──▶ Thread (경고)   │
│   └─────┬─────┘                            └────────┬─────────┘   │
│         │                                           │              │
│         │         ┌─────────────────────────────────┤              │
│         │         │      Shared Memory              │              │
│         │         │  • 임계값 (temp/humidity)       │              │
│         │         │  • 제어 상태 (heater/fan/led)   │              │
│         │         │  • 현재 센서값                  │              │
│         │         │  • system_running (종료 신호)   │              │
│         │         │         ⬆️ Semaphore 동기화      │              │
│         │         └─────────────────────────────────┘              │
│         ▼                    │                    │                │
│   ┌───────────┐       ┌───────────┐       ┌───────────┐           │
│   │   [P1]    │       │   [P2]    │       │   [P4]    │           │
│   │  SENSOR   │◀──────│ ACTUATOR  │       │  MONITOR  │           │
│   │ 제어상태  │       │ 대시보드  │       │ 설정/정보 │           │
│   │ 읽기      │       │ UI        │       │           │           │
│   └───────────┘       └───────────┘       └───────────┘           │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

2.2 프로세스 구성

프로세스 역할 사용 기술
[P1] Sensor 가상 센서 데이터 생성, 물리 엔진 Message Queue, Shared Memory
[P2] Actuator 제어 장치 상태 표시, 대시보드 Shared Memory, Semaphore
[P3] Server 중앙 제어, 로그 기록, 경고 fork, pipe, pthread, IPC 전체
[P4] Monitor 사용자 설정, 시스템 정보 Shared Memory, Semaphore, select, uname

2.3 IPC 통신 구조

  1. Message Queue: 센서 → 서버로 센서 데이터(온도, 습도) 전송
  2. Shared Memory: 임계값, 제어 상태, 현재 센서값 공유
  3. Semaphore: 공유 메모리 접근 시 Race Condition 방지
  4. Pipe: 서버(부모) → 로그 프로세스(자식) 간 로그 데이터 전송

2.4 서버 내부 구조

서버 프로세스는 fork()와 pthread를 활용하여 다음과 같이 구성됩니다:

  • 메인 프로세스: 센서 데이터 수신, 제어 로직 처리
  • 자식 프로세스 (fork): 파이프에서 데이터를 읽어 로그 파일에 기록
  • 경고 스레드 (pthread): 3초마다 임계값 초과 여부 확인 및 경고 출력

3. 사용된 기술

3.1 UNIX 기술 커버리지

주차 기술 적용 내용
5-6주 파일 I/O fopen, fprintf로 smartfarm.log 기록
7주 시스템/프로세스 정보 uname(), getpid(), getppid(), getuid()
9주 프로세스 생성 fork()로 로그 기록 자식 프로세스 생성
10주 쓰레드 pthread로 경고 모니터링 스레드 구현
11주 시그널 signal()로 SIGINT/SIGTERM 처리
12주 파이프 pipe()로 부모-자식 간 로그 데이터 전송
13주 System V IPC Message Queue, Shared Memory, Semaphore

3.2 주요 시스템 콜 및 라이브러리

  • IPC 생성: msgget(), shmget(), semget()
  • IPC 조작: msgsnd(), msgrcv(), shmat(), shmdt(), semop()
  • 프로세스: fork(), wait(), waitpid(), getpid(), getppid()
  • 스레드: pthread_create(), pthread_join(), pthread_self()
  • 시그널: signal(), SIGINT, SIGTERM
  • 파이프: pipe(), read(), write(), close()
  • 파일 I/O: fopen(), fprintf(), fflush(), fclose()
  • 시스템 정보: uname(), getuid(), getgid()
  • 기타: select() - 논블로킹 입력 처리

4. 사용 매뉴얼

4.1 개발 환경

  • 운영체제: Ubuntu 24.04 (VirtualBox)
  • 컴파일러: GCC
  • 언어: C (표준 라이브러리 + pthread)

4.2 빌드 방법

$ make all

make 명령으로 모든 실행 파일이 bin/ 디렉토리에 생성됩니다.

4.3 실행 방법

4개의 터미널을 열고 다음 순서로 실행합니다:

# Terminal 1 (먼저 실행 - IPC 자원 생성)
$ ./bin/server

# Terminal 2
$ ./bin/sensor

# Terminal 3
$ ./bin/actuator

# Terminal 4
$ ./bin/monitor

4.4 종료 방법

서버 터미널에서 Ctrl+C를 누르면 Graceful Shutdown이 실행됩니다:

  1. 경고 스레드 종료
  2. Shared Memory에 종료 신호 전송
  3. 센서, 액추에이터, 모니터 프로세스 자동 종료
  4. 로그 프로세스 종료 및 파일 저장
  5. IPC 자원 정리

4.5 모니터 메뉴

  1. 온도 임계값 설정 (20~40°C)
  2. 습도 임계값 설정 (30~90%)
  3. 현재 설정 및 상태 확인
  4. 시스템 정보 확인 (uname)
  5. 종료

5. 사용 예 캡처

5.1 서버 실행 화면

  • 시스템 정보 출력 (OS, 호스트명, 아키텍처, PID)
  • IPC 자원 생성 메시지
  • 로그 프로세스 및 경고 스레드 생성 메시지
  • 센서 데이터 수신 및 제어 명령 출력

5.2 센서 실행 화면

  • PID 표시
  • IPC 연결 성공 메시지
  • 1초마다 센서 데이터 전송 로그
  • 제어 상태 변경 메시지

5.3 액추에이터 대시보드

  • 현재 환경: 온도, 습도 (임계값 표시)
  • 장치 상태: 히터, 팬, LED (ON/OFF 컬러 표시)
  • 1초마다 자동 갱신

5.4 모니터 화면

  • PID 및 부모 PID 표시
  • CLI 메뉴 인터페이스
  • 시스템 정보 (OS, 호스트명, 아키텍처, 사용자 정보)

5.5 로그 파일 (smartfarm.log)

========== 로그 시작: Thu Dec  4 15:30:00 2025
시간                  온도(°C)  습도(%)   히터    팬
----------------------------------------------------
2025-12-04 15:30:01     25.20     50.30    ON   OFF
2025-12-04 15:30:02     25.40     50.60    ON   OFF
2025-12-04 15:30:03     25.60     50.90    ON   OFF
========== 로그 종료: Thu Dec  4 15:35:00 2025

6. 프로젝트 구조

virtual-smartfarm/
├── Makefile              # 빌드 자동화
├── README.md             # 프로젝트 문서
├── include/
│   └── common.h          # 공통 헤더
├── src/
│   ├── main_sensor.c     # 센서 프로세스
│   ├── main_actuator.c   # 액추에이터 프로세스
│   ├── main_server.c     # 서버 프로세스
│   └── main_monitor.c    # 모니터 프로세스
├── bin/                  # 실행 파일
└── smartfarm.log         # 로그 파일

작성자: 안민철, 백승찬
작성일: 2025-12-04