SKVMOIP
Scalable KVM Over IP Software Suite for Managing Servers and Remote Computers.
0
Project description
SKVMOIP โ Scalable KVM Over IP: One Ethernet Spine for an Entire Server Rack
#KVM-over-IP #RemoteDesktop #ServerManagement #TOE-TCP #STM32 #W5500 #USB-HID #HDMI-over-IP #Vulkan #GPU-Accelerated
๐ Individual open-source project โ hobby-scale hardware + production-grade ambition Firmware verified on STM32F401CCU6 + W5500; client runs on Windows (alpha release v1.0.0)
01 โ What is this project?
Managing a rack of servers from a single seat is a solved problem โ if you can afford it. Commercial KVM-over-IP appliances from APC, ATEN, or IPMI-equipped boards cost hundreds to thousands of dollars per node, and most single-board solutions like PiKVM or TinyPilot solve only the one-machine case: want to cover ten servers? Buy ten units.
SKVMOIP (Scalable KVM Over IP) attacks this scaling problem directly. Instead of replicating expensive hardware per machine, it separates the concerns:
- A STM32F401CCU6 + W5500 module handles keyboard, mouse, power button, and reset signals for each managed machine โ inexpensive, the size of a credit card.
- A single HDMI Encoder Server (a mini-PC with enough GPU) captures and encodes video from the target machines.
- A client PC (Windows or Linux) connects to both, rendering the remote desktop via GPU-accelerated Vulkan decoding.
The result is a software suite that can grow to cover an entire server rack by adding only cheap STM32+W5500 nodes, without multiplying the cost of video processing hardware.
02 โ Why KVM Over IP?
๐ท Agentless, Pre-OS Control
KVM-over-IP operates below the operating system. Keyboard and mouse signals are injected as USB HID, and video is captured directly from the HDMI port โ the target machine needs no software installed. This means the operator can enter BIOS, run OS installers, recover from kernel panics, and manage power state as if sitting physically in front of the machine. No SSH, no VNC agent, no Windows Remote Desktop prerequisites.
๐ท Scalability as the Core Design Constraint
Existing cheap KVM solutions (PiKVM, TinyPilot) treat scalability as an afterthought. SKVMOIP's architecture decouples the input/power path (cheap, per-machine) from the video path (shared, centralized). A single encoder server and Ethernet switch can front an entire lab. Adding a new machine costs only the STM32+W5500 module.
๐ท GPU-Accelerated Video Path
The client software uses Vulkan and NVIDIA CUDA for hardware-accelerated HDMI stream decoding. NV12-to-RGB conversion is handled in shader code (shaders/ directory), keeping latency low even at high resolutions. This is categorically different from CPU-decoded VNC streams.
03 โ System Architecture
04 โ Why W5500?
๐ท TOE TCP Socket Mode โ Reliable Delivery for Control Commands
The STM32 firmware uses W5500's hardware TCP socket mode (Sn_MR_TCP, port 2000). This is the correct choice for a keyboard-mouse control channel where every packet must arrive reliably and in order. A dropped key event or a missed power-button press is operationally unacceptable when managing a remote server.
W5500's TOE offloads the entire TCP/IP stack into silicon โ the STM32 simply calls socket(), listen(), and receives NetworkPacket structs from the IP stack without managing retransmission timers, sequence numbers, or connection state in firmware code. The STM32's CPU budget is freed entirely for USB HID injection and GPIO front-panel control.
// From firmware/STM32F401CCU6/SKMOIP/Core/Src/main.c
W5500_Init(); // SPI-connected W5500 initialization
wizchip_setnetinfo(&netInfo); // Static IP: 192.168.1.117
SOCKET mySocket = socket(0, Sn_MR_TCP, 2000, 0); // TCP socket, port 2000
listen(mySocket); // Wait for client connection
// Loop: recv() โ decode NetworkPacket โ inject USB HID / toggle GPIO
๐ท SPI Integration on STM32F401CCU6
STM32F401CCU6 is an 84 MHz Cortex-M4 without a native Ethernet MAC. W5500 fills this gap cleanly over SPI1 โ no external PHY power domain, no RMII timing constraints. The w5500_spi.c driver handles the chip-select and frame-layer; the application code uses the standard ioLibrary socket API. This is precisely the integration pattern W5500 was designed for: Ethernet capability for any SPI-capable MCU.
๐ท Static IP, Minimal Overhead
The firmware uses NETINFO_STATIC (no DHCP) and a hardcoded IP (192.168.1.117). For a lab KVM node, this is correct: the device must be reachable immediately after power-on, before any DHCP server responds. W5500's onboard register set retains network configuration in hardware, so the STM32 can enter its listen loop within milliseconds of power-on โ deterministic, no boot negotiation.
๐ท Verified Evidence โ
socket(0, Sn_MR_TCP, 2000, 0)andlisten(mySocket)confirmed inmain.cwizchip_setnetinfo(&netInfo)andW5500_Init()confirmed in application codeNetworkPacketstruct encodes keyboard, mouse, and front-panel commands โ all transmitted over this single TCP socket- Alpha release v1.0.0 published (Mar 2024) with real hardware setup photo in repository
05 โ Key Components
๐ WIZnet W5500 โ TCP TOE Mode (Sn_MR_TCP)
Hardware-offloaded TCP/IP on SPI bus. Powers the keyboard-mouse-power control channel from STM32 to the SKVMOIP client. One socket, one TCP connection, one NetworkPacket stream. No TCP stack in firmware; CPU fully dedicated to USB HID and GPIO.
๐ง STM32F401CCU6
84 MHz Cortex-M4 acting as the KVM endpoint node. Enumerates as USB HID device (keyboard + mouse composite) to the managed server. GPIO controls front-panel signals (power, reset, power LED).
๐ฌ HDMI Capture + Encoder Server
USB HDMI capture card feeds raw HDMI signal to the encoder server PC. SKVMOIP server app encodes the stream with GPU hardware (NVIDIA CUDA; Intel/AMD in progress). Delivered to the client over TCP on a separate connection.
๐ป SKVMOIP Client (Windows/Linux)
Vulkan-based GUI client with NV12โRGB shader pipeline for GPU-decoded video display. Manages VIP (Video Server IP) and KMIP (Keyboard-Mouse Server IP) connections separately. GTK3 UI allows adding multiple machines and switching between them.
06 โ Application Scenarios
01. Headless Server Lab Management
A developer running 5โ10 bare-metal servers in a home lab deploys one STM32+W5500 node per machine. All machines are accessible from a single SKVMOIP client window. BIOS tweaks, OS reinstalls, kernel crash recovery โ all handled remotely without a crash cart.
02. Small Data Center On-Site Operations
A small hosting provider replaces per-rack KVM switches with SKVMOIP nodes. The single encoder server handles video for the entire rack. Staff walk the floor with a laptop, not a KVM cart.
03. Hardware Bringup and Firmware Development
Embedded teams use SKVMOIP to manage target boards during bringup. The pre-OS video path means the team can observe BIOS POST, U-Boot output, and early kernel messages before any network stack on the target machine is alive.
04. Remote Power Management
Administrators manage server power state (boot, reboot, hard reset, power LED monitoring) over IP without IPMI. The STM32 GPIO-to-front-panel bridge makes this possible on any server that lacks remote management hardware.
07 โ Similar Projects on WIZnet Makers
Two projects on the platform share the same problem space.
SimpleIPMI (same author) tackles KVM-over-IP with ESP32-S3 + W5500 โ browser-based control, MJPEG video, USB HID, GPIO power control. Single-machine scope, no dedicated client app. W5500 is optional (WiFi AP fallback exists). โ https://maker.wiznet.io/Lihan__/projects/simpleipmi/
IP Keyboard on W5500-EVB-Pico strips the idea down to keyboard-only: UDP commands โ USB HID keystrokes via CircuitPython. No video, no mouse, no power control. โ https://maker.wiznet.io/josephsr/projects/ip-keyboard-on-w5500-evb-pico/
SilentHID focuses on secure keyboard+mouse remote control over TLS WebSocket, targeting robotics and test automation. No video or power control. โ https://maker.wiznet.io/Aimee0/projects/silenthid/
| SKVMOIP | SimpleIPMI | IP Keyboard | SilentHID | |
|---|---|---|---|---|
| Core MCU | STM32F401 | ESP32-S3 | RP2040 | W55RP20 |
| W5500 role | Required (TCP KM channel) | Optional (LAN extension) | On-board | On-board |
| Keyboard Over IP | โ TCP | โ WebSocket | โ UDP | โ TLS WebSocket |
| Mouse Over IP | โ | โ | โ | โ |
| Video Over IP | โ | โ | โ | โ |
| Power/Reset control | โ GPIO | โ GPIO | โ | โ |
| Scalability | Multi-server | Single | Single | Single |
| Client | Dedicated app (Vulkan) | Browser | UDP socket | WebSocket |
| Security | None (LAN assumed) | None | None | TLS 1.2 |
| Complexity | High (C++, STM32) | Medium (ESP32) | Low (Python) | Medium |
The ecosystem shows a clear spectrum: from single-function primitives (IP Keyboard) to security-focused controllers (SilentHID) to full KVM suites (SimpleIPMI, SKVMOIP). SKVMOIP is the only one architected for scale โ separating the video path (centralized GPU encoder) from the control path (per-machine STM32+W5500 node) so that adding a new machine costs only a cheap module, not another full stack.
Conclusion
SKVMOIP turns the STM32+W5500 combination into a scalable KVM infrastructure node, demonstrating that W5500's hardware TCP offload is exactly what you need when reliable control delivery matters more than raw throughput.
- โ
W5500 TCP TOE socket mode confirmed in
main.cโsocket(0, Sn_MR_TCP, 2000, 0)+listen() - โ
Static IP configuration via
wiz_NetInfoandwizchip_setnetinfo()โ deterministic power-on connectivity - โ Full keyboard (USB HID composite) + mouse + power/reset + power LED over IP
- โ BIOS-level, pre-OS control โ no target software required
- โ GPU-accelerated video path via NVIDIA CUDA + Vulkan NV12โRGB shader
- โ Scalable architecture: add machines by adding only cheap STM32+W5500 nodes
- โ Alpha release v1.0.0 published with real hardware setup photograph
A server rack, a mini-PC encoder, and a handful of STM32+W5500 modules. This kind of project also uses W5500.
Q&A
Q: Why use W5500's TCP mode rather than UDP for the keyboard-mouse channel? A: KVM control events are small but loss-intolerant. A missed keyboard HID report or an undelivered power-button command can leave a server in an undefined state. TCP's reliable delivery guarantee โ offloaded entirely into W5500's silicon without firmware overhead โ is the correct choice for this workload.
Q: Why not use Raspberry Pi's onboard Ethernet instead of W5500? A: The STM32F401CCU6 was chosen as the KVM endpoint because it can enumerate as a USB HID device directly, which is how it injects keyboard/mouse signals into the target machine's USB port. Raspberry Pi would require a USB gadget mode setup that is more complex and more expensive. W5500 adds Ethernet to the STM32 without changing the USB HID architecture.
Q: Can SKVMOIP scale beyond a single LAN? A: The current architecture uses static LAN IPs. Cross-subnet or VPN access would require additional network configuration not yet addressed in the project. The TODO list mentions HDMI routing over IP as a planned scaling enhancement.
SKVMOIP โ ํ์ฅํ KVM Over IP: ์ด๋๋ท ํ๋๋ก ์๋ฒ ๋ ์ ์ฒด๋ฅผ ์ ์ดํ๋ค
#KVM-over-IP #์๊ฒฉ๋ฐ์คํฌํฑ #์๋ฒ๊ด๋ฆฌ #TOE-TCP #STM32 #W5500 #USB-HID #HDMI-over-IP #Vulkan #GPU๊ฐ์
๐ ๊ฐ์ธ ์คํ์์ค ํ๋ก์ ํธ โ ์ ๊ฐ ํ๋์จ์ด์ ํ๋ก๋์ ๊ธ ํ์ฅ์ฑ ์ค๊ณ STM32F401CCU6 + W5500 ๊ธฐ๋ฐ ํ์จ์ด ๊ฒ์ฆ ์๋ฃ; ํด๋ผ์ด์ธํธ๋ Windows ์ง์ (alpha v1.0.0)
01 โ ์ด ํ๋ก์ ํธ๋ ๋ฌด์์ธ๊ฐ?
์๋ฒ ๋์ ๋จ์ผ ์ข์์์ ์๊ฒฉ ๊ด๋ฆฌํ๋ ๊ฒ์ 'ํด๊ฒฐ๋ ๋ฌธ์ '๋ค โ ๋น์ฉ๋ง ๊ฐ์ํ๋ค๋ฉด. APC, ATEN ๋ฑ ์์ฉ KVM-over-IP ์ฅ๋น๋ ๋ ธ๋๋น ์์ญ๋ง~์๋ฐฑ๋ง ์์ด๊ณ , PiKVM์ด๋ TinyPilot ๊ฐ์ ๋จ์ผ ๋ณด๋ ์๋ฃจ์ ์ ๋จธ์ ํ ๋๋ง ์ง์ํ๋ค. ์ด ๋๋ฅผ ๊ด๋ฆฌํ๋ ค๋ฉด ์ด ์ธํธ๋ฅผ ์ฌ์ผ ํ๋ค.
SKVMOIP(Scalable KVM Over IP)๋ ์ด ํ์ฅ์ฑ ๋ฌธ์ ๋ฅผ ์ ๋ฉด์ผ๋ก ํด๊ฒฐํ๋ค. ๋จธ์ ๋ง๋ค ๋น์ผ ํ๋์จ์ด๋ฅผ ๋ณต์ ํ๋ ๋์ , ์ญํ ์ ๋ถ๋ฆฌํ๋ค:
- STM32F401CCU6 + W5500 ๋ชจ๋์ด ๊ด๋ฆฌ ๋์ ๋จธ์ ๋ง๋ค ํค๋ณด๋, ๋ง์ฐ์ค, ์ ์ ๋ฒํผ, ๋ฆฌ์ ์ ํธ๋ฅผ ๋ด๋น โ ์ ๋ ดํ๊ณ ์ ์ฉ์นด๋ ํฌ๊ธฐ.
- ๋จ์ผ HDMI ์ธ์ฝ๋ ์๋ฒ(GPU ์๋ ๋ฏธ๋ PC)๊ฐ ๋์ ๋จธ์ ๋ค์ ๋น๋์ค๋ฅผ ์บก์ฒ/์ธ์ฝ๋ฉ.
- ํด๋ผ์ด์ธํธ PC(Windows/Linux)๊ฐ ๋ ๊ฒฝ๋ก์ ๋ชจ๋ ์ ์, Vulkan GPU ๊ฐ์์ผ๋ก ์๊ฒฉ ํ๋ฉด์ ๋ ๋๋ง.
๊ฒฐ๊ณผ์ ์ผ๋ก ์ ๋ ดํ STM32+W5500 ๋ ธ๋๋ง ์ถ๊ฐํ๋ฉด ์๋ฒ ๋ ์ ์ฒด๋ก ํ์ฅ๋๋ ์ํํธ์จ์ด ์ค์ํธ๊ฐ ์์ฑ๋๋ค.
02 โ KVM Over IP๊ฐ ์ ํ์ํ๊ฐ?
๐ท ์์ด์ ํธ ์๋ OS ์ด์ ์ ์ด
KVM-over-IP๋ ์ด์์ฒด์ ์๋์์ ๋์ํ๋ค. ํค๋ณด๋/๋ง์ฐ์ค ์ ํธ๋ USB HID๋ก ์ฃผ์ ๋๊ณ , ๋น๋์ค๋ HDMI ํฌํธ์์ ์ง์ ์บก์ฒ๋๋ค. ๋์ ๋จธ์ ์ ์ํํธ์จ์ด๊ฐ ์ค์น๋์ด ์์ง ์์๋ BIOS ์ง์ , OS ์ค์น, ์ปค๋ ํจ๋ ๋ณต๊ตฌ, ์ ์ ์ ์ด๊ฐ ๋ชจ๋ ๊ฐ๋ฅํ๋ค.
๐ท ํ์ฅ์ฑ์ด ํต์ฌ ์ค๊ณ ์ ์ฝ
๊ธฐ์กด ์ ๊ฐ KVM ์๋ฃจ์ ๋ค์ ํ์ฅ์ฑ์ ๋ถ์ฐจ์ ์ผ๋ก ์ทจ๊ธํ๋ค. SKVMOIP๋ ์ ๋ ฅ/์ ์ ๊ฒฝ๋ก(์ ๋ ด, ๋จธ์ ๋น)์ ๋น๋์ค ๊ฒฝ๋ก(๊ณต์ , ์ค์ํ)๋ฅผ ๋ช ์์ ์ผ๋ก ๋ถ๋ฆฌํ๋ค. ๋จ์ผ ์ธ์ฝ๋ ์๋ฒ์ ์ด๋๋ท ์ค์์น ํ๋๋ก ์คํ์ค ์ ์ฒด๋ฅผ ์ปค๋ฒํ ์ ์๋ค.
๐ท GPU ๊ฐ์ ๋น๋์ค ๊ฒฝ๋ก
ํด๋ผ์ด์ธํธ ์ํํธ์จ์ด๋ Vulkan๊ณผ NVIDIA CUDA๋ก HDMI ์คํธ๋ฆผ์ ํ๋์จ์ด ๊ฐ์ ๋์ฝ๋ฉํ๋ค. NV12โRGB ๋ณํ์ ์
ฐ์ด๋(shaders/ ๋๋ ํ ๋ฆฌ)์์ ์ฒ๋ฆฌ๋์ด, ๊ณ ํด์๋์์๋ ์ง์ฐ ์๊ฐ์ด ๋ฎ๊ฒ ์ ์ง๋๋ค. CPU ๋์ฝ๋ฉ ๊ธฐ๋ฐ VNC์๋ ๋ฒ์ฃผ ์์ฒด๊ฐ ๋ค๋ฅด๋ค.
03 โ ์์คํ ์ํคํ ์ฒ

04 โ ์ W5500์ธ๊ฐ?
๐ท TOE TCP ์์ผ ๋ชจ๋ โ ์ ์ด ๋ช ๋ น์ ์ ๋ขฐ ์ ๋ฌ ๋ณด์ฅ
STM32 ํ์จ์ด๋ W5500์ **ํ๋์จ์ด TCP ์์ผ ๋ชจ๋(Sn_MR_TCP, ํฌํธ 2000)**๋ฅผ ์ฌ์ฉํ๋ค. ํค๋ณด๋-๋ง์ฐ์ค ์ ์ด ์ฑ๋์์๋ ๋ชจ๋ ํจํท์ด ์ ๋ขฐ์ฑ ์๊ฒ, ์์๋๋ก ๋๋ฌํด์ผ ํ๋ค. ํค ์ด๋ฒคํธ ํ๋๊ฐ ๋๋ฝ๋๊ฑฐ๋ ์ ์ ๋ฒํผ ์ ํธ๊ฐ ์ ์ค๋๋ฉด ์๊ฒฉ ์๋ฒ ์ํ๊ฐ ์ ์๋์ง ์์ ์ํ๋ก ๋น ์ง๋ค โ ์ด์ ๊ด์ ์์ ํ์ฉ ๋ถ๊ฐ.
W5500์ TOE๋ TCP/IP ์คํ ์ ์ฒด๋ฅผ ์ค๋ฆฌ์ฝ์ ์คํ๋ก๋ํ๋ค. STM32๋ ๋จ์ํ socket(), listen(), recv()๋ฅผ ํธ์ถํ๊ณ NetworkPacket ๊ตฌ์กฐ์ฒด๋ฅผ ๋ฐ์ ์ฒ๋ฆฌํ ๋ฟ์ด๋ค. ์ฌ์ ์ก ํ์ด๋จธ, ์ํ์ค ๋ฒํธ, ์ฐ๊ฒฐ ์ํ ๊ด๋ฆฌ๋ฅผ ํ์จ์ด ์ฝ๋์์ ์ ํ ๋ค๋ฃฐ ํ์๊ฐ ์๋ค. STM32์ CPU ์์ฐ์ ์ ๋ถ USB HID ์ฃผ์
๊ณผ GPIO ์ ๋ฉด ํจ๋ ์ ์ด์ ํฌ์
๋๋ค.
// firmware/STM32F401CCU6/SKMOIP/Core/Src/main.c ์์ ํ์ธ
W5500_Init(); // SPI ์ฐ๊ฒฐ W5500 ์ด๊ธฐํ
wizchip_setnetinfo(&netInfo); // Static IP: 192.168.1.117
SOCKET mySocket = socket(0, Sn_MR_TCP, 2000, 0); // TCP ์์ผ, ํฌํธ 2000
listen(mySocket); // ํด๋ผ์ด์ธํธ ์ฐ๊ฒฐ ๋๊ธฐ
// ๋ฃจํ: recv() โ NetworkPacket ๋์ฝ๋ โ USB HID ์ฃผ์
/ GPIO ํ ๊ธ
๐ท STM32F401CCU6์์์ SPI ํตํฉ
STM32F401CCU6์ ์จ๋ณด๋ ์ด๋๋ท MAC์ด ์๋ 84 MHz Cortex-M4์ด๋ค. W5500์ SPI1 ๋ฒ์ค ํ๋๋ก ์ด ๊ณต๋ฐฑ์ ์ฑ์ด๋ค โ ์ธ๋ถ PHY ์ ์ ๋๋ฉ์ธ๋ ์๊ณ , RMII ํ์ด๋ฐ ์ ์ฝ๋ ์๋ค. w5500_spi.c ๋๋ผ์ด๋ฒ๊ฐ ์นฉ ์
๋ ํธ์ ํ๋ ์ ๋ ์ด์ด๋ฅผ ์ฒ๋ฆฌํ๊ณ , ์ ํ๋ฆฌ์ผ์ด์
์ฝ๋๋ ํ์ค ioLibrary ์์ผ API๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ๋ค. SPI ์ง์ MCU์ ์ด๋๋ท ๋ฅ๋ ฅ์ ์ถ๊ฐํ๋ค๋ ๊ฒ์ด W5500์ด ์ค๊ณ๋ ๋ฐ๋ก ๊ทธ ์ญํ ์ด๋ค.
๐ท Static IP, ์ต์ ์ค๋ฒํค๋
ํ์จ์ด๋ NETINFO_STATIC(DHCP ์์)๊ณผ ํ๋์ฝ๋ฉ๋ IP(192.168.1.117)๋ฅผ ์ฌ์ฉํ๋ค. ์คํ์ค KVM ๋
ธ๋์์ ์ด๋ ์ฌ๋ฐ๋ฅธ ์ ํ์ด๋ค. ์ฅ์น๋ ์ ์ ํฌ์
์งํ, DHCP ์๋ฒ ์๋ต๋ณด๋ค ๋จผ์ ๋๋ฌ ๊ฐ๋ฅํด์ผ ํ๋ค. W5500์ ์จ๋ณด๋ ๋ ์ง์คํฐ ์
์ด ๋คํธ์ํฌ ์ค์ ์ ํ๋์จ์ด์ ์ ์งํ๋ฏ๋ก, STM32๋ ์ ์ ํฌ์
ํ ์ ๋ฐ๋ฆฌ์ด ์ด๋ด์ listen ๋ฃจํ์ ์ง์
ํ ์ ์๋ค.
๐ท ๊ฒ์ฆ๋ ์ฆ๊ฑฐ โ
socket(0, Sn_MR_TCP, 2000, 0)๋ฐlisten(mySocket)โmain.c์์ ์ง์ ํ์ธwizchip_setnetinfo(&netInfo)๋ฐW5500_Init()โ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋์์ ํ์ธNetworkPacket๊ตฌ์กฐ์ฒด๊ฐ ํค๋ณด๋, ๋ง์ฐ์ค, ์ ๋ฉด ํจ๋ ๋ช ๋ น์ ์ด ๋จ์ผ TCP ์์ผ์ผ๋ก ์ ์ก- ์ค์ ํ๋์จ์ด ์ ์ ์ฌ์ง ํฌํจ Alpha v1.0.0 ๋ฆด๋ฆฌ์ฆ (2024๋ 3์) ๊ณต๊ฐ
05 โ ํต์ฌ ์ปดํฌ๋ํธ
๐ WIZnet W5500 โ TCP TOE ๋ชจ๋ (Sn_MR_TCP)
SPI ๋ฒ์ค์ ํ๋์จ์ด ์คํ๋ก๋ TCP/IP. STM32์์ SKVMOIP ํด๋ผ์ด์ธํธ๊น์ง ํค๋ณด๋-๋ง์ฐ์ค-์ ์ ์ ์ด ์ฑ๋์ ๋ด๋น. ์์ผ ํ๋, TCP ์ฐ๊ฒฐ ํ๋, NetworkPacket ์คํธ๋ฆผ ํ๋. ํ์จ์ด์ TCP ์คํ ์ฝ๋ ์์; CPU๋ USB HID์ GPIO์๋ง ์ง์ค.
๐ง STM32F401CCU6
84 MHz Cortex-M4๊ฐ KVM ์๋ํฌ์ธํธ ๋ ธ๋ ์ญํ . ๊ด๋ฆฌ ๋์ ์๋ฒ์ USB HID ๋ณตํฉ ์ฅ์น(ํค๋ณด๋ + ๋ง์ฐ์ค)๋ก ์ด๊ฑฐ. GPIO๋ก ์ ๋ฉด ํจ๋ ์ ํธ(์ ์, ๋ฆฌ์ , ์ ์ LED) ์ ์ด.
๐ฌ HDMI ์บก์ฒ + ์ธ์ฝ๋ ์๋ฒ
USB HDMI ์บก์ฒ ์นด๋๊ฐ ์์ HDMI ์ ํธ๋ฅผ ์ธ์ฝ๋ ์๋ฒ PC์ ๊ณต๊ธ. SKVMOIP ์๋ฒ ์ฑ์ด GPU ํ๋์จ์ด(NVIDIA CUDA; Intel/AMD ์งํ ์ค)๋ก ์คํธ๋ฆผ ์ธ์ฝ๋ฉ. ๋ณ๋ TCP ์ฐ๊ฒฐ๋ก ํด๋ผ์ด์ธํธ์ ์ ๋ฌ.
๐ป SKVMOIP ํด๋ผ์ด์ธํธ (Windows/Linux)
NV12โRGB ์ ฐ์ด๋ ํ์ดํ๋ผ์ธ์ ๊ฐ์ง Vulkan ๊ธฐ๋ฐ GUI ํด๋ผ์ด์ธํธ. VIP(Video Server IP)์ KMIP(KM Server IP)๋ฅผ ๋ถ๋ฆฌ ๊ด๋ฆฌ. GTK3 UI๋ก ๋ณต์์ ๋จธ์ ์ถ๊ฐ ๋ฐ ์ ํ ๊ฐ๋ฅ.
06 โ ํ์ฉ ์๋๋ฆฌ์ค
01. ํค๋๋ฆฌ์ค ์๋ฒ ์คํ์ค ๊ด๋ฆฌ
๊ฐ๋ฐ์๊ฐ ํ ๋ฉ์ 5~10๋ ๋ฒ ์ด๋ฉํ ์๋ฒ์ STM32+W5500 ๋ ธ๋๋ฅผ ๊ฐ๊ฐ ๋ฐฐ์น. ๋ชจ๋ ๋จธ์ ์ SKVMOIP ํด๋ผ์ด์ธํธ ํ๋๋ก ์ ์. BIOS ์ค์ , OS ์ฌ์ค์น, ์ปค๋ ํฌ๋์ ๋ณต๊ตฌ โ ํฌ๋์ ์นดํธ ์์ด ์๊ฒฉ์ผ๋ก ์ฒ๋ฆฌ.
02. ์๊ท๋ชจ ๋ฐ์ดํฐ์ผํฐ ํ์ฅ ์ด์
์ํ ํธ์คํ ์ ์ฒด๊ฐ ๋๋ณ KVM ์ค์์น๋ฅผ SKVMOIP ๋ ธ๋๋ก ๊ต์ฒด. ๋จ์ผ ์ธ์ฝ๋ ์๋ฒ๊ฐ ๋ ์ ์ฒด์ ๋น๋์ค๋ฅผ ์ฒ๋ฆฌ. ๋ด๋น์๋ KVM ์นดํธ ์์ด ๋ ธํธ๋ถ ํ๋๋ก ํ์ฅ์ ์ปค๋ฒ.
03. ํ๋์จ์ด ๋ธ๋ง์ ๋ฐ ํ์จ์ด ๊ฐ๋ฐ
์๋ฒ ๋๋ ํ์ด ๋์ ๋ณด๋ ๋ธ๋ง์ ์ค SKVMOIP๋ฅผ ํ์ฉ. OS ์ด์ ๋น๋์ค ๊ฒฝ๋ก ๋๋ถ์ ๋์ ๋จธ์ ์ ๋คํธ์ํฌ ์คํ์ด ์ด์์๊ธฐ ์ ์๋ BIOS POST, U-Boot ์ถ๋ ฅ, ์ด๊ธฐ ์ปค๋ ๋ฉ์์ง๋ฅผ ์ค์๊ฐ์ผ๋ก ๊ด์ฐฐ ๊ฐ๋ฅ.
04. ์๊ฒฉ ์ ์ ๊ด๋ฆฌ
IPMI ์๋ ์๋ฒ์ ์ ์ ์ํ(๋ถํ , ์ฌ๋ถํ , ๊ฐ์ ๋ฆฌ์ , ์ ์ LED ๋ชจ๋ํฐ๋ง)๋ฅผ IP ๊ฒฝ์ ๋ก ๊ด๋ฆฌ. STM32 GPIO-์ ๋ฉด ํจ๋ ๋ธ๋ฆฌ์ง๊ฐ ์๊ฒฉ ๊ด๋ฆฌ ํ๋์จ์ด๊ฐ ์๋ ์๋ฒ์์๋ ์ด ๊ธฐ๋ฅ์ ๊ฐ๋ฅํ๊ฒ ํ๋ค.
07 โ WIZnet Makers ์ ์ฌ ํ๋ก์ ํธ
ํ๋ซํผ ๋ด์์ ๊ฐ์ ๋ฌธ์ ๋ฅผ ๋ค๋ฃจ๋ ํ๋ก์ ํธ ์ธ ๊ฐ๊ฐ ์กด์ฌํ๋ค.
SimpleIPMI (๋์ผ ์์ฑ์)๋ ESP32-S3 + W5500์ผ๋ก KVM-over-IP๋ฅผ ๊ตฌํํ๋ค โ ๋ธ๋ผ์ฐ์ ๊ธฐ๋ฐ ์ ์ด, MJPEG ๋น๋์ค, USB HID, GPIO ์ ์ ์ ์ด. ๋จ์ผ ๋จธ์ ๋ฒ์์ด๋ฉฐ ์ ์ฉ ํด๋ผ์ด์ธํธ ์ฑ์ด ์๋ค. W5500์ ์ ํ์ (WiFi AP ํด๋ฐฑ ์กด์ฌ). โ https://maker.wiznet.io/Lihan__/projects/simpleipmi/
IP Keyboard on W5500-EVB-Pico ๋ ์์ด๋์ด๋ฅผ ํค๋ณด๋ ๋จ์ผ ๊ธฐ๋ฅ์ผ๋ก ์์ถํ๋ค โ UDP ๋ช ๋ น โ CircuitPython โ USB HID ํค์คํธ๋กํฌ. ๋น๋์ค, ๋ง์ฐ์ค, ์ ์ ์ ์ด ์์. โ https://maker.wiznet.io/josephsr/projects/ip-keyboard-on-w5500-evb-pico/
SilentHID ๋ TLS WebSocket ๊ธฐ๋ฐ ๋ณด์ ํค๋ณด๋+๋ง์ฐ์ค ์๊ฒฉ ์ ์ด์ ์ง์คํ๋ค. ๋ก๋ด/ํ ์คํธ ์๋ํ ํ๊ฒ. ๋น๋์ค, ์ ์ ์ ์ด ์์. โ https://maker.wiznet.io/Aimee0/projects/silenthid/
| SKVMOIP | SimpleIPMI | IP Keyboard | SilentHID | |
|---|---|---|---|---|
| ํต์ฌ MCU | STM32F401 | ESP32-S3 | RP2040 | W55RP20 |
| W5500 ์ญํ | ํ์ (TCP KM์ฑ๋) | ์ ํ (LAN ํ์ฅ) | ์จ๋ณด๋ | ์จ๋ณด๋ |
| ํค๋ณด๋ Over IP | โ TCP | โ WebSocket | โ UDP | โ TLS WebSocket |
| ๋ง์ฐ์ค Over IP | โ | โ | โ | โ |
| ๋น๋์ค Over IP | โ | โ | โ | โ |
| ์ ์/๋ฆฌ์ ์ ์ด | โ GPIO | โ GPIO | โ | โ |
| ํ์ฅ์ฑ | ๋ค์ค ์๋ฒ | ๋จ์ผ | ๋จ์ผ | ๋จ์ผ |
| ํด๋ผ์ด์ธํธ | ์ ์ฉ ์ฑ(Vulkan) | ๋ธ๋ผ์ฐ์ | UDP ์์ผ | WebSocket |
| ๋ณด์ | ์์(LAN ๊ฐ์ ) | ์์ | ์์ | TLS 1.2 |
| ๋์ด๋ | ๋์(C++,STM32) | ์ค๊ฐ(ESP32) | ๋ฎ์(Python) | ์ค๊ฐ |
์ด ์ํ๊ณ๋ ํ๋์ ์คํํธ๋ผ์ ๋ณด์ฌ์ค๋ค โ ๋จ์ผ ๊ธฐ๋ฅ ์์ํ(IP Keyboard)์์ ๋ณด์ ํนํํ(SilentHID), ํ์ KVM(SimpleIPMI, SKVMOIP)๊น์ง. SKVMOIP๋ ๊ทธ ์ค ์ ์ผํ๊ฒ ํ์ฅ์ ์ค๊ณ ์ค์ฌ์ ๋ ํ๋ก์ ํธ๋ค โ ๋น๋์ค ๊ฒฝ๋ก(์ค์ํ๋ GPU ์ธ์ฝ๋)์ ์ ์ด ๊ฒฝ๋ก(๋จธ์ ๋น STM32+W5500 ๋ ธ๋)๋ฅผ ๋ถ๋ฆฌํด, ๋จธ์ ์ถ๊ฐ ๋น์ฉ์ ์ ์ฒด ์คํ ๋ณต์ ๊ฐ ์๋ ์ ๊ฐ ๋ชจ๋ ํ๋๋ก ๋ฎ์ท๋ค.
๊ฒฐ๋ก
SKVMOIP๋ STM32+W5500 ์กฐํฉ์ ํ์ฅํ KVM ์ธํ๋ผ ๋ ธ๋๋ก ์ ํํ์ฌ, W5500์ ํ๋์จ์ด TCP ์คํ๋ก๋๊ฐ ์ฒ๋ฆฌ๋๋ณด๋ค ์ ๋ขฐ์ฑ ์๋ ์ ์ด ์ ๋ฌ์ด ์ค์ํ ์ํฉ์์ ์ ํํ ๋ง๋ ์ ํ์์ ๋ณด์ฌ์ค๋ค.
- โ
W5500 TCP TOE ์์ผ ๋ชจ๋
main.c์์ ํ์ธ โsocket(0, Sn_MR_TCP, 2000, 0)+listen() - โ
wiz_NetInfo๋ฐwizchip_setnetinfo()๋ฅผ ํตํ Static IP ์ค์ โ ์ ์ ํฌ์ ์ฆ์ ๋๋ฌ ๊ฐ๋ฅ - โ ํค๋ณด๋(USB HID ๋ณตํฉ) + ๋ง์ฐ์ค + ์ ์/๋ฆฌ์ + ์ ์ LED Over IP ์์ ๊ตฌํ
- โ BIOS ๋ ๋ฒจ, OS ์ด์ ์ ์ด โ ๋์ ์ํํธ์จ์ด ๋ถํ์
- โ NVIDIA CUDA + Vulkan NV12โRGB ์ ฐ์ด๋๋ฅผ ํตํ GPU ๊ฐ์ ๋น๋์ค ๊ฒฝ๋ก
- โ ํ์ฅ ์ํคํ ์ฒ: ์ ๋ ดํ STM32+W5500 ๋ ธ๋ ์ถ๊ฐ๋ง์ผ๋ก ๋จธ์ ์ ์ฆ๊ฐ
- โ ์ค์ ํ๋์จ์ด ์ ์ ์ฌ์ง ํฌํจ Alpha v1.0.0 ๋ฆด๋ฆฌ์ฆ ๊ณต๊ฐ
์๋ฒ ๋, ๋ฏธ๋ PC ์ธ์ฝ๋, ๊ทธ๋ฆฌ๊ณ STM32+W5500 ๋ชจ๋ ๋ช ๊ฐ. ์ด๋ฐ ์ข ๋ฅ์ ํ๋ก์ ํธ๋ W5500์ ์ฌ์ฉํ๋ค.
Q&A
Q: ํค๋ณด๋-๋ง์ฐ์ค ์ฑ๋์ UDP ๋์ TCP๋ฅผ ์ฌ์ฉํ ์ด์ ๋? A: KVM ์ ์ด ์ด๋ฒคํธ๋ ํฌ๊ธฐ๋ ์์ง๋ง ์ ์ค์ ํ์ฉํ์ง ์๋๋ค. ํค๋ณด๋ HID ๋ฆฌํฌํธ๊ฐ ๋๋ฝ๋๊ฑฐ๋ ์ ์ ๋ฒํผ ๋ช ๋ น์ด ์ ๋ฌ๋์ง ์์ผ๋ฉด ์๋ฒ๊ฐ ์ ์๋์ง ์์ ์ํ์ ๋น ์ง ์ ์๋ค. TCP์ ์ ๋ขฐ ์ ๋ฌ ๋ณด์ฅ โ W5500 ์ค๋ฆฌ์ฝ์ ์ ๋ถ ์คํ๋ก๋๋์ด ํ์จ์ด ์ค๋ฒํค๋ ์์ โ ์ด ์ด ์ํฌ๋ก๋์ ์ฌ๋ฐ๋ฅธ ์ ํ์ด๋ค.
Q: Raspberry Pi ์จ๋ณด๋ ์ด๋๋ท ๋์ W5500์ ์ด ์ด์ ๋? A: STM32F401CCU6์ USB HID ์ฅ์น๋ก ์ง์ ์ด๊ฑฐํ ์ ์์ด KVM ์๋ํฌ์ธํธ๋ก ์ ํ๋์๋ค. ์ด๊ฒ์ด ๋์ ๋จธ์ ์ USB ํฌํธ์ ํค๋ณด๋/๋ง์ฐ์ค ์ ํธ๋ฅผ ์ฃผ์ ํ๋ ๋ฐฉ๋ฒ์ด๋ค. Raspberry Pi๋ USB gadget ๋ชจ๋ ์ค์ ์ด ๋ ๋ณต์กํ๊ณ ๋น์ฉ๋ ๋ ๋๋ค. W5500์ USB HID ์ํคํ ์ฒ๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ STM32์ ์ด๋๋ท์ ์ถ๊ฐํ๋ค.
Q: SKVMOIP๊ฐ ๋จ์ผ LAN์ ๋์ด ํ์ฅ๋ ์ ์๋? A: ํ์ฌ ์ํคํ ์ฒ๋ Static LAN IP๋ฅผ ์ฌ์ฉํ๋ค. ์๋ธ๋ท ๊ฐ ๋๋ VPN ์ ๊ทผ์ ์์ง ํ๋ก์ ํธ์์ ๋ค๋ฃจ์ง ์๋๋ค. TODO ๋ชฉ๋ก์๋ ๋น๋์ค Over IP์ HDMI ๋ผ์ฐํ ํ์ฅ์ด ๊ณํ์ผ๋ก ๋ช ์๋์ด ์๋ค.
Original Link: https://github.com/ravi688/SKVMOIP