2 min read

JetKVM の WebRTC 部分

JetKVM を購入して、使ってみたらとても良くできていたので、Claude Code をお供に JetKVM のコードを読んでみた。雰囲気で読んでるので間違いが含まれている可能性があるので要注意。

GitHub - jetkvm/kvm: JetKVM - Control any computer remotely
JetKVM - Control any computer remotely. Contribute to jetkvm/kvm development by creating an account on GitHub.

ちなみに WebRTC 通信部分には Pion が採用されている。

シグナリング

WebRTC P2P を利用する場合は何かしらお互いの情報を交換する必要がある。それをシグナリングと呼ぶのだが、何を使ってもよく仕様が決められていない。

JetKVM は多くの WebRTC で採用されている WebSocket が採用されていた。ただちょっと違うのは JetKVM 側が WebSocket サーバーを持っているということだ。

JetKVM の WebSocket サーバーは Go の WebSocket ライブラリ https://github.com/coder/websocket が採用されている。JetKVM の IP にアクセスするとブラウザはこの WebSocket へ接続に行く。

JetKVM 側は WebSocket が確立したタイミングでデバイス情報を送る。その後ブラウザから type: offer を送り、JetKVM から type: answer を送るという仕組み。

  ブラウザ                          JetKVM端末
     |                                |
     |---- WebSocket 接続 ----------->|
     |<--- device-metadata -----------|
     |                                |
     | onnegotiationneeded 発火       |
     |   ↓                            |
     | createOffer()                  |
     | setLocalDescription(offer)     |
     |                                |
     |---- offer (SDP) -------------->|  ← ブラウザが Offer
     |                                |
     |                    SetRemoteDescription(offer)
     |                    CreateAnswer()
     |                    SetLocalDescription(answer)
     |                                |
     |<--- answer (SDP) --------------|  ← JetKVM が Answer
     |                                |
     | setRemoteDescription(answer)   |

Claude Code さん作の図

とてもシンプルな仕組み。ただなぜかブラウザ側は WebSocket はそのまま貼りっぱなしの模様。これは正直よくわからない挙動。

H.264 1080p 60fps

Rockchip Media Processor (RMP) APIを使用したハードウェア H.264 エンコーディングが採用されている。Claude Code さん作の表。

項目
コーデック RK_VIDEO_ID_AVC (H.264/AVC)
プロファイル H264E_PROFILE_HIGH
レートコントロール VENC_RC_MODE_H264VBR (可変ビットレート)
ピクセルフォーマット RK_FMT_YUV422_YUYV
GOP サイズ 60 フレーム
最大解像度 1920x1080

やけになめらかだなぁと思ったら普通に 1080p 60fps で快適。

データチャネル

キーボードやマウスの通信は全部データチャネルを利用している。シリアルポート専用のラベルもある。Claude Code さん作の票。

Label 設定 用途
rpc デフォルト(信頼・順序あり) JSON-RPC 通信
hidrpc デフォルト(信頼・順序あり) キーボード/マウス入力
hidrpc-unreliable-ordered ordered: true, maxRetransmits: 0 HID 低遅延入力(順序維持・再送なし)
hidrpc-unreliable-nonordered ordered: false, maxRetransmits: 0 HID 低遅延入力(順序なし・再送なし)
terminal デフォルト(信頼・順序あり) ターミナル/シリアルコンソール
serial デフォルト(信頼・順序あり) RS-232 シリアルポート
upload-* デフォルト(信頼・順序あり) ファイルアップロード(USB Mass Storage)

DataChannel やはりよくできてる。

STUN や TURN は?

デフォルトでは一切ない。JetKVM Cloud を利用する場合は提供してくれる模様。JetKVM Cloud API を叩くと払い出してくれるっぽい。type: offer に data として iceServers を入れてる。

まとめ

JetKVM よくできてる。買うべき。

JetKVM | Next-Gen Open-source KVM over IP, Control any computer remote
A high-performance, open-source KVM over IP solution designed for efficient remote management of computers, servers, and workstations. Key Features Ultra-low Latency - 1080p@60FPS video with 30-60ms latency using H.264 encoding. Smooth mouse and keyboard interaction for responsive remote control. Free &amp; Optional Re