使われずにいたテスラのディスプレイが、ハードウェアの改造なしで無線のセカンドモニターになるまで。
2023年、私はテスラ Model X を買いました。ソフトウェアエンジニアの私がまず目を奪われたのは、加速性能でもオートパイロットでもありませんでした。ダッシュボードの真ん中に鎮座する、あの大きなディスプレイだったのです。
私はよく在宅で仕事をしているのですが、お気に入りの過ごし方のひとつが、テスラで静かな場所まで出かけてそこで仕事をすることです。のどかな場所に車を停めて、ノートパソコンを開き、コーヒーを片手に車内で過ごしていると、なんとも言えない特別な気分になります。いつしか私はこれを Work From Tesla と呼ぶようになりました。
でも、14インチの MacBook で作業しているあいだ、あの美しい17インチのディスプレイが使われないままそこにあるのを見るたびに、こう思わずにはいられませんでした。あれをセカンドモニターとして使えないだろうか?
この疑問をきっかけに、何か月にもわたる試行錯誤が始まりました。
真っ先に思いついたのは、テスラに HDMI 入力ポートを物理的に取り付けてしまうことでした。それなりの手間と適切なハードウェアさえあれば、できなくはなさそうに思えました。
とはいえ、買ったばかりの新車を分解する気にはなれませんでした。何かを壊してしまうリスクはもちろん、ハードウェアに手を加えれば車両の保証が無効になるおそれもあります。ソフトウェアエンジニアとしては、はんだごてではなくコードで問題を解決したかったのです。
そこで、ソフトウェアでのアプローチを探し始めました。
ちょっと面白い試みもありました。実はテスラには Zoom アプリが標準で入っています。つまり理屈の上では、MacBook で Zoom ミーティングを開始して画面を共有し、それをテスラのディスプレイで見ればいいわけです。
技術的には動きました。でも、ひどいものでした。映像が Zoom のサーバーを経由して戻ってくるため、はっきりわかるほどの遅延が生じます。さらに悪いことに、テスラの Zoom アプリはフルスクリーン表示に対応していません。結局、カクつく小さなウィンドウの中にデスクトップが映るだけでした。私が求めていたセカンドモニターの体験とはほど遠いものでした。
本当に必要なのは、MacBook とテスラのあいだの直接接続だと気づきました。間にクラウドサーバーを挟まない接続です。テスラにはウェブブラウザがあるので、MacBook 上で動くウェブサーバーにそのブラウザから接続できれば、画面を直接ストリーミングできるはずです。
そのためには、2台のデバイスが同じローカルネットワーク上にある必要があります。LTE ルーターを買って MacBook とテスラの両方をつなぎ、これで動くだろうと考えていました。
動きませんでした。
何時間もデバッグを続けた末に、どこにも文書化されていない事実にたどり着きました。テスラのウェブブラウザは、RFC 1918 のプライベート IP アドレス帯(10.x.x.x、172.16.x.x、192.168.x.x)へのアクセスをブロックしているのです。
あくまで私の推測ですが、テスラの車両内部のシステム(カメラ、センサー、コントローラーなど)がこれらのプライベート IP 帯を使っているのではないでしょうか。そして車内ネットワークへの攻撃を防ぐセキュリティ対策として、ブラウザからのアクセスを遮断しているのだと思います。公式な資料もないので、確かめようがありません。
ただ、ここでひとつのアイデアが浮かびました。MacBook とテスラに、プライベート IP ではなくグローバル IP アドレスを割り当てたらどうだろう?
OpenWrt が動く小さなトラベルルーター、GL.iNet GL-MT300N-V2 を手に入れました。ウェブ管理画面ではプライベート IP 帯しか設定できませんが、SSH でログインすればすべてを自由に制御できます。接続したデバイスにグローバル IP アドレスを割り当てるように設定し、ネットワークを次のように構成しました。
LTE Router → OpenWrt Wi-Fi Router → Tesla & MacBook
テスラのブラウザを開いて MacBook の(グローバル)IP アドレスを入力すると……つながりました。テスラのブラウザが、私の MacBook から配信されたウェブページを読み込んだのです。2台のあいだに初めて直接接続ができた瞬間でした。
あとは、この接続を通して画面をストリーミングするだけです。
最初のストリーミングは OBS Studio で試しました。問題は、OBS が主に RTSP/RTMP プロトコルを使っていて、テスラのブラウザがそれに対応していなかったことです。ネットで調べた限りでは、これらは古いプロトコルでセキュリティ上の懸念も指摘されており、ブラウザが対応をやめたのもそのためかもしれません。ただ、私はこれらのプロトコルに詳しくないので、確かなことは言えません。
さらに調べていくうちに、OBS が HLS(HTTP Live Streaming)のセグメントを出力できることがわかりました。そこで、この .ts セグメントをライブストリームとして配信する Node.js のウェブサーバーを作り、フロントエンドには JavaScript ベースの HLS プレーヤーを組み込みました。
動きました。テスラのディスプレイに MacBook の画面が映ったのです。しかし、根本的な問題がありました。約2秒の遅延です。HLS は映像のセグメントをいったんディスクに書き出してから配信する仕組みなので、どうしても遅延が生じます。HLS にもっと詳しい人なら、さらに短縮できたのかもしれません。単に私の知識の限界だった可能性もあります。いずれにしても、マウスを動かしてから2秒後にカーソルが反応するのでは話になりません。セカンドモニターとしては使いものになりませんでした。
それでも、コンセプトの実証はできました。テスラのブラウザ経由で画面をストリーミングできることは確かめられたのです。
そのとき、ふと思い出しました。本業で、WebRTC を使ったサービスに少しだけ関わったことがあったのです。WebRTC の大きな強みは、ブラウザが標準でサポートしていることです。プラグインも拡張機能も、特別なプレーヤーもいりません。しかも、リアルタイムで低遅延な通信のために設計された技術です。
画面をキャプチャして WebRTC セッションを作る Chrome 拡張機能を用意し、共有用の URL をテスラのブラウザで開いてみると……何も起きません。うまくいきませんでした。
オンラインのチェックツールでブラウザの WebRTC 対応状況を調べてみると、当時のテスラのブラウザは WebRTC に対応していないようでした。手詰まりです。プロジェクトはいったん棚上げにしました。
数か月が過ぎ、テスラのソフトウェアアップデートも何度か入ったころ、好奇心に負けて同じ WebRTC の構成をもう一度試してみました。
今度は、完璧に動きました。
テスラがひっそりとブラウザの WebRTC 対応をアップデートしたのでしょうか? それとも、最初に私が何かミスをしていただけなのでしょうか? 正直なところ、今でもわかりません。いずれにせよ、テスラのブラウザで WebRTC が動くようになり、遅延は HLS とは比べものにならないほど改善されました。
それでも、まだ重大な問題が残っていました。WebRTC の画面共有でできるのは画面のミラーリングだけで、画面の拡張はできません。私がテスラで見たかったのは MacBook の画面のコピーではなく、もう1枚の画面、つまり本当の意味での拡張デスクトップでした。
解決策は意外なところから見つかりました。ダミー HDMI アダプターです。サーバー管理者が使う小さなプラグで、モニターのないヘッドレスマシンに「モニターがつながっている」と思い込ませ、リモートデスクトップを使えるようにするためのものです。
さっそくひとつ買って MacBook に挿すと、macOS はすぐに「2台目のディスプレイ」を認識しました。次に、この仮想ディスプレイを WebRTC でテスラに映し出しました。これで私の MacBook には、本体の画面とテスラの画面、2つの画面ができたのです。
うまくいきました。ただ、構成はだんだん笑ってしまうほど大がかりになっていました。
解像度を上げると、ストリームの品質は Wi-Fi のスループットに大きく左右されました。私の OpenWrt ルーターは最大 300Mbps までしか出ず、高解像度の拡張ディスプレイを滑らかに表示するには足りません。1Gbps 以上に対応したルーターは100ドル以上もしますし、私はすでに LTE ルーター、Wi-Fi ルーター、ダミー HDMI アダプターを持ち歩いている状態でした。
一歩引いて、自分に問いかけました。このハードウェアをひとつも使わずに実現できないだろうか?
それから1年以上が経ちました。あるときこのアイデアが再び頭に浮かび、今度は別の角度から取り組んでみました。使っていたハードウェアには、どれもソフトウェアで代わりになるものがあったのです。
iPhone には「インターネット共有」(パーソナルホットスポット)が、Mac にも同じく「インターネット共有」機能があります。MacBook の Wi-Fi を空けておくために iPhone を USB テザリングで MacBook に接続すれば、Mac 側でインターネット共有をオンにして、テスラが接続できる Wi-Fi ネットワークを作れます。
つまり MacBook そのものがルーターになり、テスラは Wi-Fi で MacBook に直接つながるわけです。LTE ルーターも OpenWrt ルーターもいりません。
ただし、プライベート IP がブロックされる問題はまだ残っていました。macOS がインターネット共有のネットワークを作ると、bridge100 というネットワークインターフェースが生成され、bootpd がプライベート IP アドレスを割り当てます。
解決方法は、意外にもシンプルでした。
bridge100 インターフェースの IP アドレス帯をグローバル IP 帯に変更するbootpd の設定を変更するたった3つの設定変更で、テスラのブラウザは再び MacBook のウェブサーバーにアクセスできるようになりました。追加のルーターはもう必要ありません。
Apple は、ソフトウェアで仮想ディスプレイを作成できる CGVirtualDisplay というフレームワークを提供しています。物理的なアダプターがなくても、macOS は本物のモニターが接続されていると認識し、完全に機能する拡張デスクトップが使えるようになります。
すべてのピースがそろい、構成は次のようになりました。
| 元のハードウェア | ソフトウェアでの置き換え |
|---|---|
| LTE ルーター | iPhone の USB テザリング |
| OpenWrt Wi-Fi ルーター | macOS のインターネット共有(bridge100 + bootpd + NAT) |
| ダミー HDMI アダプター | CGVirtualDisplay API |
追加のハードウェア費用:合計 $0。
すべてが、テスラのオーナーならすでに持っているデバイス、つまり MacBook と iPhone で動くソフトウェアだけでまかなえるようになったのです。
Work From Tesla をしたいと思っているのは、私ひとりではないとわかっていました。ツイートや Reddit の投稿、フォーラムのスレッドで、@Tesla や @elonmusk をタグ付けして AirPlay 対応を求めたり、車のディスプレイをセカンドモニターとして使えたらいいのにと願ったりする声を、何度も目にしてきたからです。
そこで、これまでに学んだすべて――ネットワーク設定の工夫、WebRTC によるストリーミング、仮想ディスプレイ――をひとつの macOS アプリケーションにまとめました。
そのアプリこそが SideDisplay です。
ワンクリックで始められます。ハードウェアの改造も、追加のルーターも、ダミー HDMI アダプターもいりません。必要なのは MacBook と iPhone、そしてテスラだけです。
ただそこにあるだけだったあのディスプレイが、今日からあなたのセカンドモニターになります。
SideDisplay をダウンロードして、テスラを無線のセカンドモニターにしましょう。
無料でお試し — 毎週60分まで無料、無制限は年額$10.99