무인 보관함의 보관·찾기·결제·원격 제어를 담당하는 키오스크 소프트웨어를 설계하고 개발했습니다. 비동기
I/O와 이벤트 기반 구조, MQTT·TCP 통신으로 화면이 멈추지 않게 만들었습니다.
키오스크 앱과 관제 웹을 잇는 원격 제어 프로토콜을 직접 설계·구현했고, 이 코드는 다른 현장용 키오스크를 찍어내는 엔진으로도 씁니다.
무인 보관함 프로그램 소스 코드는 공개하지 않습니다. 현장 키오스크, 결제 중계, 관제 웹, 매출 적재, DB가 어떻게 붙는지 역할만 적었습니다.
AI를 적극 활용해서 프로그램 설계 및 구조를 직접 설계하고 코드를 작성하였습니다.
프로그램 사이 통신만 그렸습니다. 박스를 누르면 그 프로그램이 무엇을 하는지 나옵니다.
소스 코드는 공개하지 않습니다. 현장 키오스크, 결제 중계, 관제 웹, 매출 적재, DB가 어떻게 붙는지 역할만 적었습니다.
locker-app은 이 흐름 밖에 있습니다. 보관함을 지도에서 찾는 소비자용 웹이고, 지금은 검색·상세·리뷰까지 동작하며 예약·결제는 개발 중입니다.
CUI_Page 상속 기반 모듈화된 UI 시스템. GDI+ 더블 버퍼링, 프레임 캐싱, 동적 레이아웃(1080×1920) 지원. 저자세 모드 시 자동 좌표 변환.
CPaymentManager 단일 진입점으로 카드·현금·카카오페이 통합. 비동기 콜백 패턴과 Transaction-per-Connection TCP 설계.
MQTT 프로토콜 기반 실시간 관제. 오프라인 DB 큐 재전송, 자동 재연결, 초기 핸드셰이크(0101) 동기화.
RS-232 시리얼 통신으로 보관함 보드·지폐기·동전기 정밀 제어. 자동 복구, 재시도, 상태 머신 기반 안정성 확보.
고대비·저자세·돋보기·음성 안내 4종 접근성 기능. 레이어드 렌더링 오버레이 방식으로 모든 페이지에서 일관 동작.
TaskManager가 결제 프로세스 감시(5초), 일일 작업(60초), 새벽 자동 재부팅을 관리. 이벤트 기반 즉시 종료 지원. 하드웨어 연결 끊김 감지 등
키오스크 앱과 관제 웹(UExpress) 사이에 쓰는 원격 제어 프로토콜을 직접 설계하고, 양쪽 구현을 맞췄습니다.
MQTT 토픽 NC{KID}로 0203 전문을 주고받고, cmd 21~29로 공지·배너·카드고장·함 크기·레이아웃·함 이동·요금 조회를 나눕니다.
관제 ASP가 명령을 발행하면 현장 키오스크가 받아 INI에 저장하고, 이용 중일 때는 첫화면을 강제로 빼앗지 않습니다.
첫화면 공지 단건·일괄 발행, 배너 이미지 HTTP 배포와 기본 배너 복귀, 카드리더 고장 시 현금만 받기와 연체 면제상한.
함 치수와 커스텀 레이아웃을 관제에서 고치고, 원격 열기·함 보관정보 이동·재부팅도 같은 프로토콜로 처리합니다.
관제 ASP가 MSSQL의 키오스크 상태·명령 로그·함 상태를 읽고 씁니다. 운영 PC의 서비스 중계 프로그램이 매출을 SQL Server와 코레일 Oracle에 넣고, 결제 누락은 재전송으로 메웁니다.
키오스크 현장 설치 시 필요한 17개 설치 단계를
사용자 입력 없이 원클릭으로 일괄 자동 실행하는
배포 자동화 시스템을 설계·구현했습니다.
파티션 생성, OS 환경 설정, 런타임 설치, DB 구성, 드라이버 설치,
키오스크 프로그램 배포까지 — 모든 과정이 Silent Install 방식으로
자동 진행되어, 현장 엔지니어의 수작업을 최소화하고
설치 품질의 일관성을 보장합니다.
기존 설치 자료 폴더에서 필요한 파일을 자동으로 수집하여 USB 배포용 패키지 구조로 구성합니다.
config.json 설정을 읽어 17개 단계를 순차적으로 자동 실행합니다. 모든 설치는 사일런트 모드로 진행됩니다.
Prepare_Package.bat을 실행하면 기존 설치 자료 폴더에서
VC++ Redistributable, MySQL, ODBC 드라이버, 하드웨어 드라이버,
키오스크 프로그램 등 필요한 모든 파일을 자동으로 수집하여
배포용 패키지 구조(8단계)로 구성합니다.
준비가 완료된 패키지 폴더를 USB에 복사하고
config.json만 현장 환경에 맞게 수정하면
현장 설치 준비가 완료됩니다.
{
// === 키오스크 자동 설치 설정 파일 ===
// 현장마다 이 파일의 값만 수정해서 사용하세요
"kiosk": {
"kiosk_id": "0",
"kiosk_addr": "현장명",
"server_ip": "관제서버 도메인",
"server_port": "****",
"install_drive": "D",
"install_folder": "Locker_Kiosk_V2"
},
"mysql": { "root_password": "****", "db_name": "****", "port": "3306" },
"partition": { "drive_letter": "D", "size_gb": 10, "label": "DATA" },
"options": {
// --- 사전 환경설정 (STEP 0) ---
"create_partition": true,
"disable_sleep": true,
"disable_uac": true,
"remove_default_apps": true,
"disable_windows_update": true,
// --- 키오스크 설치 ---
"install_vcredist": true,
"install_mysql": true,
"install_odbc_driver": true,
"setup_odbc_dsn": true,
"setup_database": true,
"apply_registry": true,
"copy_kiosk_files": true,
"install_intel_hdmi": true,
"install_j1900_drivers": true
// ... 총 17개 옵션 개별 ON/OFF 가능
}
}
USB 설치와 별도로, 관제에서 키오스크 ID를 찍어 원격 업데이트를 예약합니다.
현장 Updater가 version.json과 MD5를 확인한 뒤 EXE·이미지·INI·UbiAnyCard를 갈아끼우고,
실패하면 백업본으로 되돌립니다. AutoStart는 키오스크를 감시하다가
업데이트 중에는 중간에 다시 띄우지 않습니다.
AutoStart가 부팅 시 Updater를 먼저 돌리고 키오스크를 띄웁니다. 프로세스가 죽으면 약 10초 뒤 다시 살리고, 관제에서 레이아웃을 적용해 앱이 내려가도 감시 프로그램이 다시 올립니다.
전체 시스템의 모듈 구조, 스레드 모델, 메시지 기반 비동기 패턴을 설계하고 CUI_Page 기반의 확장 가능한 UI 프레임워크를 구축했습니다.
카드는 로컬 결제 중계 프로그램(TCP), 현금은 시리얼, 카카오페이는 관제 중계로 CPaymentManager에 모았습니다. 보관함 보드와 지폐/동전 투입기도 시리얼로 제어합니다.
CCommRun의 송신 이벤트 루프, 연결 감시, 초기/재연결 스레드, DB 큐 동기화를 모두 재설계하여 무중단 통신을 구현했습니다.
Layered Window 기반 터치 이펙트, 독립 UI 스레드, 4종 접근성 기능, 동적 레이아웃 시스템을 구현했습니다.
TaskManager로 결제 프로세스 감시, 자동 재부팅, 로그 정리를 돌리고, 관제 MSSQL과 서비스 중계 프로그램으로 매출·함 상태를 맞춥니다.
키오스크 C++와 관제 ASP가 같은 cmd 표를 쓰도록 MQTT 0203 서브커맨드를 설계하고, 공지 일괄 발행부터 함 이동·요금 조회까지 운영 화면에 붙였습니다.
키오스크와 카드 단말기(ED-785/ED-721) 사이를 잇는 로컬 결제 중계 프로그램입니다. 같은 PC에서 localhost TCP로 결제/취소/핑을 받고, 시리얼로 단말기와 주고받아 승인 결과를 돌려줍니다. 티머니·캐시비·레일플러스 파싱과 최종거래조회(LASTTX)도 여기서 합니다. 관제 서버가 아닙니다.
코레일 21인치(세로)와 같은 코어를 쓰는 가로형 키오스크입니다. 10인치와 17인치 모드를 같이 유지하고, 원격 공지·장기보관·웹결제도 코레일과 맞춰 갑니다. 저자세·고대비·돋보기와 일부 TTS가 있습니다.
운영 PC에서 키오스크 MQTT 이용·매출 전문을 받아 SQL Server와 코레일 Oracle에 넣는 프로그램입니다. 이름에 Server가 있어도 브로커에 붙는 클라이언트입니다.
전국 보관함을 지도에서 찾는 모바일 웹(PWA)입니다. Next.js와 NestJS로 장소 검색, 가까운 함, 상세·요금, 리뷰, 4개 국어까지 동작합니다. 예약과 결제는 아직 자리만 있는 상태입니다.