JetKVM の WebRTC 部分
JetKVM を購入して、使ってみたらとても良くできていたので、Claude Code をお供に JetKVM のコードを読んでみた。雰囲気で読んでるので間違いが含まれている可能性があるので要注意。
ちなみに 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 よくできてる。買うべき。

