- 본 프로젝트는 본격적인 공부를 시작하는 고등학교 1학년 학생들을 위해,
예상 등급과, 커리큘럼, 추후에는 희망자에 한해 비슷한 등급의 학생들을 매칭시켜
학습 메이트를 만드는 서비스를 제공하는 것을 목적으로 하는 프로젝트 입니다.
- 모의고사 문제를 기반으로한 등급 예측 기능
- 등급에 따른 커리큘럼 제공 기능
- 학습 메이트 매칭 기능
- 학습 메이트와의 스터디 기능
- 학습 메이트와의 스터디 기록 기능
- 학습 메이트와의 스터디 결과 공유 기능
- 학생들이 공부를 시작할 때, 어떤 과목을 공부해야 하는지, 어떤 순서로 공부해야 하는지,
어떤 등급을 받을 수 있는지 등을 예측하여 학생들이 공부를 시작할 때 도움을 줄 수 있습니다. - 학생들이 공부를 하면서, 같이 공부할 수 있는 학습 메이트를 만들어 줄 수 있습니다.
- 프로젝트는 크게 3가지로 구성되어 있습니다.
- AI 모델
- 웹 서버
- 클라이언트
프로젝트는 다음과 같은 구성 요소로 이루어져 있습니다:
- 3개의 DNN AI 모델과 OMR 모델 or OMR Mirror1: 이 모델들은 각각 TCP 기반의 소켓을 사용하여 서로 통신합니다.
- RPI 4B: 각 모델은 RPI 4B 한 대씩을 사용합니다.
- 웹 서버: FastAPI를 사용하여 웹 서버를 구축하였습니다.
- 클라이언트 앱: 플러터를 사용하여 클라이언트 앱을 개발하였습니다.
- SBC(Single Board Computer): 모든 장비는 SBC 위에 상주하는 2개의 프로세스를 이용합니다.
- 자원 할당: 각 프로세스에는 2개의 쓰레드가 할당됩니다.
- TCP 통신: 각 쓰레드는 램에 모델을 상주시키고, TCP 소켓으로 들어오는 정보를 처리/분석한 후 다시 TCP 소켓을 통해 데이터를 보냅니다.
- 포트 정보: SBC는 4개의 쓰레드를 가지며, n번 쓰레드는 Recv: 760n, Send: 770n 포트를 사용합니다.
- 내부 네트워크: 성적 및 개인정보가 사용되는 특성상 외부와 공유되지 않는 VPN을 사용하여
내부 네트워크를 구성하였습니다.
MasterSBC만 외부 데이터를 받아 VPN 망으로 전송합니다. - VPN 망: 10.0.0.1/24의 IP 대역을 사용하며, IP 할당은 다음과 같습니다:
- MasterSBC: 10.0.0.1 (서버: ServerID[0xFF])
- AI SBC1 (수학 점수 판독 및 수학 커리큘럼 작성): 10.0.0.2 (클라이언트: ClientID[0xEC])
- AI SBC2 (국어 점수 판독 및 국어 커리큘럼 작성): 10.0.0.3 (클라이언트: ClientID[0xF5])
- AI SBC3 (영어 점수 판독 및 영어 커리큘럼 작성): 10.0.0.4 (클라이언트: ClientID[0x1A])
- OMR SBC (OMR 채점 및 분석): 10.0.0.5 (클라이언트: ClientID[0x23])
- SBC와 MasterSBC 통신: 각 SBC는 MasterSBC와 통신하기 위해 TCP 소켓 8181번을 사용하며,
5초마다 HeartBeat를 보냅니다. - HeartBeat 감지: HeartBeat가 30초 동안 3번 이하로 수신되면 해당 SBC는 장애로 간주되고,
시스템 관리자에게 메일을 전송합니다. - 메인 SBC의 역할: OMR 채점/분석 후, 정보를 각 SBC의 쓰레드에
WorkID와 함께 동적으로 Load Balancing하여 전송합니다. - 서버에 전송되는 패킷들입니다.
- Master to AiSBC: Total Length: 23 + DataSize bytes, Packet Structure: [Header(1 byte, ClientID), WorkID(4 bytes), Data Length(2 bytes), Data(Max 65535 bytes), Checksum(16 byte, [SHA256])] as Python Struct Module:
>BLH[Data Length]s16s
- AiSBC to Master: Packet Structure: [Header(1 byte, ClientID), WorkID(4 bytes), GradeData(1 bytes), Checksum(16 byte, [SHA256])] as Python Struct Module:
>BLHB16s
- HeartBeat: Packet Structure: [Header(1 byte, ClientID), Time(as HHMM to MD5, 16 bytes)] as Python Struct Module:
>BL16s
- HeartBeat Response: Packet Structure: [Header(1 byte, ClientID), 0x01] as Python Struct Module:
>BB
- OMR Packet: 20문항 오지선다 기준 0000 -> 1번 ~ 0001 -> 2번 ~... Python Struct Module:
>20B
- OS: Raspberry Pi OS Lite (64-bit)
- Hostname: MasterSBC, AiSBC1, AiSBC2, OMR
- MasterSBC SD Card: 128GB (OMR 스캔본 저장)
- AiSBC1, AiSBC2, AiSBC3, OMR SD Card: 32GB
- VPN: WireGuard
- Language: Python 3.9
- IDE: PyCharm
- AI Framework: TensorFlow 2.12
- Web Framework: FastAPI
- Client Framework: Flutter
- Database: MongoDB
OMR - ArUco 사용
ArUco
(XXXX) - 학년 과목 타입
전 학년 각 과목당 4타입 - 3 x 2 x 4 = 24타입
1학년 국어 0~3 수학 4~7
2학년 국어 8~11 수학 12~15
3학년 국어 16~19 수학 20~23
Ex) 1104 - 1학년 수학 4타입 -> 1학년 수학중 0번
Ex2) 3014 - 3학년 국어 14타입 -> 3학년 국어중 0번
ArUco No = 타입 넘버 앞 두글자 hex + 뒤 두글자 hex