You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
STM32(stm32-f411re) + Raspberry-pi(버젼 4) 스마트팜 모니터링/제어 시스템
C로 구현, Epoll 기반 단일 스레드 동작
systemed 등록(부팅시 자동 실행), logrotate로 로그파일 관리
TODO : 부팅시 UART, OLED등의 /dev검사로직 + 네트워크 연결(웹서버) 검사로직 넣고, 메인 소스와 분리하기 => 네트워크 연결 실패시 OLED에 에러문구 띄우기
# farmd.service[Unit]# 서비스 표시이름Description=Smart Farm Daemon
# 네트워크 연결된 이후 실행After=network.target
# 프로세스 시작되려 할때 네트워크 켜기Wants=network.target
[Service]# 기본값(파일 없어도 우선 실행성공 반환, 이후 execve시스템콜 실패하면 재시작)Type=simple
# 실행 계정User=raspi
Group=raspi
# 장치 그룹 권한부여SupplementaryGroups=dialout i2c
# 상대경로 지정WorkingDirectory=/home/raspi/sv/farmd
# 실제 실행 명령ExecStart=/home/raspi/sv/farmd/farmd
# 서비스 떨어지면 재시작Restart=on-failure
# N초 뒤에 재시작RestartSec=5s
# 로그 파일 만드는 권한LogsDirectory=farmd
LogsDirectoryMode=0750
[Install]# 네트워크 올라온 일반 서버 상태일떄 프로세스 시작WantedBy=multi-user.target
# logrotate
/var/log/farmd/*.log {
# 하루에 한 번 실행
daily
# 파일 용량 제한선인데, 하루에 한 번 로그파일 교체해서 의미 없음
maxsize 10M
# 개 까지 파일 보관
rotate 30
# 파일 없어도 오류처리 안함
missingok
# 내용이 비었으면 교체 안 함
notifempty
# 새로 만든 파일 권한지정
create 0640 raspi raspi
# 매칭되는 로그파일이 여러개일 때의 처리
sharedscripts
# 순회 직후 실행 (파일 여러개라도 한 번만 실행됨)
postrotate
# SIGHUP 보내기
systemctl kill -s HUP farmd.service 2>/dev/null || true
endscript
}
8. Source Map
src/
├── main.c 프로세스 수명 관리
├── epoll_loop.c 이벤트 루프, 핸들러 등록/회수
├── sig_handler.c signalfd 시그널 처리
├── uart/
│ ├── uart.c termios 설정, 수신, 명령 송신
│ └── uart_parser.c 프레임 관련
├── webserver/
│ └── web_server.c HTTP 파싱, 라우팅, 세션, 연결 관리
├── oled/oled.c OLED 제어, OLED 프레임버퍼 렌더링
└── util/ 로거, 유틸함수
include/ 헤더
html/ 정적 페이지 (빌드 파일과 같은 위치로 넣으면 보임=기본값 설정)
expr/ 테스트 코드
9. TODO list
프레임 무결성 / STX랑 LEN까지만 검증중
: ETX나 TYPE 등 검증 추가
명령 실행 확인 / UART 명령 전송 성공까지만 확인중
: 상태 프레임에 액추에이터 상태 포함해야됨
웹 인증 / 관리자계정 하드코딩 상태
: 환경설정에 관리자 메뉴 추가해야됨.
: 웹뷰 종류가 하드코딩 상태, 웹기능 확장이 필요하면, 디렉터리 자동인식으로 바꿀 예정.