Windows COM 포트 시리얼 통신 도구. Rust CLI 데몬 + REPL + Node.js MCP 서버 + SDK.
TCP (localhost:9900)
┌──────────┐ ┌──────────────┐
│ REPL CLI ├───────>│ │
└──────────┘ │ commmon │ ┌──────────┐
│ daemon ├─────>│ COM Port │
┌──────────┐ │ │ └──────────┘
│ MCP서버 ├───────>│ (TCP서버 + │
│ (Node.js)│ │ 시리얼관리 │──> monitor.html (HTTP :8765)
└──────────┘ │ │
└──────┬───────┘
┌──────────┐ │
│ SDK ├───────────────┘
│(C#/C++/Rs│ subscribe_rx → rx_data push
└──────────┘
| 컴포넌트 | 언어 | 역할 |
|---|---|---|
| commmon daemon | Rust | TCP 서버, 시리얼 포트 관리, 로깅, 웹 모니터, RX 스트리밍 |
| commmon (REPL) | Rust | 대화형 CLI, 데몬에 TCP 접속 |
| MCP 서버 | Node.js | Claude Code 등 MCP 클라이언트용 어댑터 |
| SDK | C#, C++, Rust | 실시간 RX 데이터 수신 경량 클라이언트 |
데몬이 시리얼 포트를 관리하고, REPL/MCP 서버/SDK 클라이언트가 동시에 접속하여 동일한 포트 상태를 공유합니다.
- COM 포트 열기/닫기 (baud rate, data bits, parity, stop bits 설정)
- 데이터 전송 (ASCII, HEX, UTF-8)
- 수신 데이터 읽기 (클라이언트별 독립 버퍼)
- 실시간 RX 데이터 구독 (
subscribe_rx→rx_datanotification push) - 파일 로깅 (시간 제한, 키워드 자동 중지)
- 웹 모니터 (브라우저에서 실시간 시리얼 데이터 확인)
- 서버→클라이언트 Notification (로그 완료 알림, RX 데이터 등)
commmon/
README.md
PLAN.md 설계 문서
commmon/ Rust CLI (데몬 + REPL)
Cargo.toml
src/
main.rs 엔트리포인트 (clap 서브커맨드)
daemon.rs TCP 서버 + 클라이언트 세션 관리 + RX 스트리밍
serial.rs 시리얼 포트 관리 + 로깅
repl.rs REPL CLI (rustyline)
monitor.rs 웹 모니터 HTTP/SSE 서버 (axum)
monitor.html 웹 모니터 UI
protocol.rs TCP 프로토콜 JSON 타입 정의
mcp-server/ MCP 서버 (Node.js)
package.json
index.js 데몬 TCP 클라이언트 + MCP 도구
sdk/ 실시간 RX 수신 SDK
csharp/
CommmonRxClient.cs C# SDK (단일 파일)
Example.cs C# 예제
cpp/
commmon_rx_client.h C++ 헤더
commmon_rx_client.cpp C++ 구현
example.cpp C++ 예제
rust/
Cargo.toml Rust SDK 프로젝트
src/lib.rs Rust SDK
examples/monitor.rs Rust 예제
Releases 페이지에서 최신 zip을 다운로드하여 압축 해제합니다.
commmon-v0.1.0-windows-x86_64.zip
├── commmon.exe CLI 바이너리
└── mcp-server/
├── package.json
└── index.js
commmon.exe를 PATH가 잡힌 디렉토리에 복사합니다.
- Windows 10/11
- Rust 툴체인 (1.70+)
- Visual Studio Build Tools (serialport 네이티브 바인딩에 C++ 컴파일러 필요)
- Node.js 18+ (MCP 서버 사용 시)
git clone [email protected]:matthew-zb/commmon.git
cd commmon/commmon
cargo build --release바이너리: commmon/target/release/commmon.exe
별도 터미널에서 데몬을 실행합니다. 데몬이 시리얼 포트를 관리합니다.
commmon daemon # 기본 포트 9900
commmon daemon --port 9900 # 포트 지정Ctrl+C로 종료 시 모든 포트, 로그, 모니터가 자동 정리됩니다.
다른 터미널에서 REPL로 데몬에 접속합니다.
commmon # 기본 포트 9900의 데몬에 접속
commmon --port 9900 # 포트 지정데몬이 실행 중이지 않으면 안내 메시지를 출력하고 종료합니다.
commmon> list 포트 목록 조회
commmon> open COM3 115200 포트 열기 (baud 생략 시 115200)
commmon> open COM3 115200 8N1 데이터비트/패리티/스톱비트 지정
commmon> close COM3 포트 닫기
commmon> write COM3 hello ASCII 전송
commmon> write COM3 --hex 48454C4C4F HEX 전송
commmon> read COM3 수신 버퍼 읽기
commmon> subscribe COM3 실시간 RX 데이터 구독
commmon> unsubscribe COM3 실시간 RX 구독 해제
commmon> log start COM3 로그 시작 (임시 디렉토리)
commmon> log start COM3 --file ./log.txt 파일 경로 지정
commmon> log start COM3 --duration 30 30초 후 자동 중지
commmon> log start COM3 --keyword OK 키워드 감지 시 중지
commmon> log update COM3 --keyword ERR 로그 키워드 변경
commmon> log stop COM3 로그 중지
commmon> status 전체 상태 (포트 + 모니터)
commmon> monitor start 웹 모니터 시작 (http://127.0.0.1:8765)
commmon> monitor start --port 8765 모니터 포트 지정
commmon> monitor stop 웹 모니터 종료
commmon> help 도움말
commmon> exit 종료
입력 히스토리는 ~/.commmon/history.txt에 저장되어 다음 세션에서도 사용 가능합니다.
subscribe로 포트의 수신 데이터를 실시간으로 REPL에 출력합니다:
commmon> subscribe COM3
COM3 실시간 RX 구독 시작
[2026:02:27 15:23:03] [COM3] Hello World
[2026:02:27 15:23:04] [COM3] OK
commmon> unsubscribe COM3
COM3 실시간 RX 구독 해제
read와 달리 폴링 없이 데이터가 도착하면 즉시 출력됩니다.
MCP 서버는 commmon 데몬에 TCP로 연결합니다. serialport 네이티브 의존성이 없으므로 C++ 빌드 도구 없이 npm install만으로 설치됩니다.
cd mcp-server
npm install~/.claude.json (전역) 또는 프로젝트 .mcp.json에 추가:
{
"mcpServers": {
"com-port": {
"command": "node",
"args": ["/path/to/commmon/mcp-server/index.js"],
"env": {
"COMMMON_HOST": "127.0.0.1",
"COMMMON_PORT": "9900"
}
}
}
}
args의 경로를 실제 설치 위치로 변경하세요.env는 기본값과 같으면 생략 가능합니다.
1. commmon daemon 실행 (별도 터미널)
2. Claude Code 시작 (MCP 서버가 데몬에 자동 연결)
3. Claude Code에서 시리얼 도구 사용
REPL과 MCP 서버를 동시에 사용할 수 있으며, 수신 데이터는 각 클라이언트에 독립적으로 복제됩니다.
| 도구 | 설명 |
|---|---|
list_ports |
사용 가능한 COM 포트 목록 조회 |
open_port |
COM 포트 열기 |
close_port |
COM 포트 닫기 |
write_port |
데이터 전송 |
read_port |
수신 버퍼 읽기 |
subscribe_rx |
실시간 RX 데이터 구독 시작 |
unsubscribe_rx |
실시간 RX 구독 해제 |
read_rx_stream |
실시간 RX 버퍼 읽기 |
start_log |
파일 로깅 시작 |
update_log |
로그 설정 변경 |
stop_log |
로그 중지 |
port_status |
전체 상태 조회 |
open_monitor |
웹 모니터 시작 |
close_monitor |
웹 모니터 종료 |
외부 앱(MFC, .NET, Rust 등)에서 데몬에 TCP 접속하여 실시간 RX 데이터를 수신할 수 있는 경량 SDK를 제공합니다.
SDK는 데몬의 TCP 프로토콜을 직접 사용합니다:
→ {"cmd":"subscribe_rx","args":{"port":"COM3"}}\n
← {"ok":true,"data":"COM3 실시간 RX 구독 시작"}\n
← {"notify":"rx_data","data":{"port":"COM3","timestamp":"2026:02:27 15:23:03","ascii":"Hello","hex":"48656C6C6F"}}\n
← {"notify":"rx_data","data":{"port":"COM3","timestamp":"2026:02:27 15:23:04","ascii":"OK","hex":"4F4B"}}\n
→ {"cmd":"unsubscribe_rx","args":{"port":"COM3"}}\n
← {"ok":true,"data":"COM3 실시간 RX 구독 해제"}\n
단일 파일 (sdk/csharp/CommmonRxClient.cs), 외부 의존성 없음.
var client = new CommmonRxClient();
await client.ConnectAsync("127.0.0.1", 9900);
client.OnData += data => Console.WriteLine($"[{data.Port}] {data.Ascii}");
await client.SubscribeAsync("COM3");
// ... 수신 대기 ...
await client.UnsubscribeAsync("COM3");
client.Disconnect();헤더+소스 (sdk/cpp/commmon_rx_client.h/.cpp), Winsock2만 사용, JSON 라이브러리 불필요.
CommmonRxClient client;
client.SetCallback([](auto port, auto ts, auto ascii, auto hex) {
printf("[%s] %s\n", port, ascii);
});
client.Connect("127.0.0.1", 9900);
client.Subscribe("COM3");
// ... 수신 대기 ...
client.Unsubscribe("COM3");
client.Disconnect();빌드 (MSVC):
cl /EHsc example.cpp commmon_rx_client.cpp /link ws2_32.libcd sdk/rust
cargo build
cargo run --example monitorlet mut client = CommmonRxClient::connect("127.0.0.1", 9900).await?;
let mut rx = client.on_data();
client.subscribe("COM3").await?;
while let Ok(data) = rx.recv().await {
println!("[{}] {}", data.port, data.ascii);
}데몬과 클라이언트 간 newline-delimited JSON 통신:
→ {"cmd":"open_port","args":{"port":"COM3","baudRate":115200}}
← {"ok":true,"data":"COM3 열기 성공 (115200bps, 8N1)"}
← {"ok":false,"error":"COM3가 열려 있지 않습니다."}
← {"notify":"log_stopped","data":{"port":"COM3","reason":"keyword","keyword":"OK","file":"..."}}
← {"notify":"port_error","data":{"port":"COM3","error":"장치 연결 해제"}}
← {"notify":"rx_data","data":{"port":"COM3","timestamp":"2026:02:27 15:23:03","ascii":"Hello","hex":"48656C6C6F"}}
| 명령 | 설명 |
|---|---|
list_ports |
포트 목록 조회 |
open_port |
포트 열기 |
close_port |
포트 닫기 |
write_port |
데이터 전송 |
read_port |
수신 버퍼 읽기 |
subscribe_rx |
실시간 RX 구독 (rx_data notification push 시작) |
unsubscribe_rx |
실시간 RX 구독 해제 |
start_log |
파일 로깅 시작 |
update_log |
로그 설정 변경 |
stop_log |
로그 중지 |
port_status |
전체 상태 조회 |
open_monitor |
웹 모니터 시작 |
close_monitor |
웹 모니터 종료 |
MIT