引言
对技术爱好者来说,家里有几台不接外设,用作服务器的电脑是很常见的。当这些机器出现问题时,运维十分不便。
IPMI 技术可以解决这个问题,但此功能一般只有服务器主板才支持。
也有一些商业化的盒子可以解决这个问题,比如某葵的控控A2。
这篇文章提供一个自己实现 IP-KVM 的方案。
总体硬件投入 ~ 170 RMB。
KVM = Keyboard Video Mouse
IP-KVM 即 KVM over IP, 此类设备可以将目标机器的视频输出通过网络串流到客户端,并将客户端的操作同步回目标机器,实现一个硬件版本的远程桌面效果。
软件远程桌面需要目标机器有正常的 OS 和网络连接,并且预先配置好。在运维场景下,这个条件比较苛刻。
KVM 方案是带外的,所以可以用来设置 BIOS,安装系统等更底层的场景。
代码仓库
方案
1.如何采集视频输出
使用 HDMI-USB 视频采集卡获取信号, 通过 MJPG-Streamer 推流
2.如何模拟键盘,鼠标操作
使用串口控制支持模拟 HID 设备的单片机,单片机通过 USB 连接到目标设备
3.客户端
使用浏览器作为远控客户端
4.架构图
硬件选型
1. 运行平台
这里采用一个 运行 Linux 的低功耗电脑 (SBC) 作为 IP-KVM 软件的运行平台。
常见的有树莓派或海鲜市场的某讯 N1。
如果使用 N1,需要刷入 Armbian,还需要一个 USB-TTL 的串口适配器(PL2303HX)。
这里给出 N1 相关的一些教程。
如果树莓派比较老,是不带 WIFI 的型号,还需准备一个 USB 网卡。
2. 单片机键鼠模拟
模拟 HID 采用 Arduino Leonardo,有成熟的库和实例代码。
3. HDMI 采集
HDMI-USB 采集卡市面上基本都是基于 MS2109 芯片的方案,支持最高 4K 30FPS 输入和 1080P 30FPS 输出。
注意需要选择支持 M-JPEG 输出的采集卡,可以免去视频编码流程直接串流,这样对于 Linux 板子基本没有性能要求。
这里我走过一些弯路:
一开始选择采用常见的直播推流方案,即采集卡用 YUV 输出,FFmpeg 进行H.264编码,使用 FLV 封装 RMTP 推流到远端。 结果是性能和延迟都很爆炸,完全不可用。
软件实现
代码结构
open-ip-kvm
│
├─public
│ app.mjs
│ index.html
│ kb.mjs
│ mouse.mjs
│ style.css
│ ws.mjs
│
│
├─server
│ config.json
│ index.js
│ mjpg-streamer.js
│ serial.js
│
└─virt-hid-arduino
device-info.txt
virt-hid-arduino.ino
1. IP-KVM 软件
使用 Node 编写,主要功能
提供静态 HTML 资源
浏览器通过 Websocket 将用户的鼠标,键盘指令发给 Node 服务,Node服务通过串口转发到 Leonardo
2. 浏览器客户端
主要功能
显示 MJPEG 视频流
采集键鼠操作并通过 Websocket 发送
简单的 UI 交互
值得一提的有
PointerLock API 的使用
与单片机交互的二进制协议是在前端实现的,分为 KB_EVT,MOUSE_EVT 和 KEY_SEQUENCE_EVT 三种事件
前两者是定长的,代表捕获的键鼠事件,包括 KeyDown, KeyUp, MouseDown, MouseUp 等子类型
KEY_SEQUENCE_EVT 是 ASCII 字符序列,会按照顺序逐个执行对应按键按下-抬起的动作,用于 Remote Paste
3. Arduino Leonardo HID 模拟
参考官方库即可,主要的问题在于实现一个相对鲁棒的二进制协议。
详见 Repo 的 virt-hid-arduino/virt-hid-arduino.ino
成本汇总
项目 | 参考价格 |
---|---|
某讯 N1 | 80,之前40入手 |
Arduino Leonardo | 45 |
HDMI-USB 采集卡 | 30 |
USB-TTL 转换器 | 15 |
总计 | 170 |
测试效果
使用时只需要将 SBC 供电,并且将 HDMI 线和 Leonardo 的 USB 插到目标机器,就可以通过浏览器控制了。
实测键盘延迟完全不可感,鼠标略有延迟,但可以正常使用。
基本达成设计目标。
Update 10/30 v1.0.0版本
重构了 Client
UI 更新, 添加状态指示器和帮助
新功能:远程快速输入 ASCII 字符流 - Remote Paste
Update 11/01
回复里不少人在讨论为什么不直接用 pikvm,大概有几个原因
1. pi及其配件的溢价比较多
早些年我也玩过 pi,转接板风扇壳子一套搞下来,都和商业方案差不多价格了
2. 我想要一个通用方案
可以跑在 x86/arm 的各种设备上,包括但不限于电视盒子/intel 电脑棒/软路由/淘汰的笔记本。
3. DIY 的目的就是过程
可以学到很多东西,另一方面这个项目的代码我比较注意可读性,所以各位可以根据需求去定制。
大哥你玩摇滚,你玩它有啥用啊
Update 11/20
有评论提到了可能以直接用 Linux SBC 的 OTG 来模拟 HID 设备,从而省去 Arduino。
研究了一下,这个方向是可行的,但是只有部分硬件支持 USB Device Mode。尤其是树莓派,只有较新的 Raspberry Pi Zero, Zero W, A, A+ 和 4 支持。
所以使用 Arduino 来模拟是一个更为通用的方案。
推荐本站淘宝优惠价购买喜欢的宝贝:
本文链接:https://hqyman.cn/post/6035.html 非本站原创文章欢迎转载,原创文章需保留本站地址!
休息一下~~