놀고 있던 테슬라 디스플레이가 하드웨어 개조 없이 무선 세컨드 모니터가 되기까지.
2023년, 저는 Tesla Model X를 샀습니다. 소프트웨어 엔지니어인 제 눈에 가장 먼저 들어온 것은 가속력도, 오토파일럿도 아니었습니다. 대시보드 한가운데 자리 잡은 커다란 디스플레이였습니다.
저는 재택근무를 자주 하는데, 제가 가장 좋아하는 일 중 하나는 테슬라를 몰고 조용한 곳으로 가서 거기서 일하는 것입니다. 한적한 곳에 차를 세워 두고 노트북을 펼친 채 커피 한 잔을 손에 들고 앉아 있는 그 시간에는 특별한 무언가가 있습니다. 저는 이것을 Work From Tesla라고 부르기 시작했습니다.
하지만 14인치 MacBook으로 일하는 동안 저 멋진 17인치 디스플레이가 그냥 놀고 있는 모습을 볼 때마다 이런 생각이 들었습니다. 저걸 세컨드 모니터로 쓸 수는 없을까?
그 질문 하나가 저를 몇 달에 걸친 긴 삽질의 길로 이끌었습니다.
가장 먼저 떠오른 방법은 테슬라에 HDMI 입력 포트를 직접 달아 버리는 것이었습니다. 충분한 노력과 적절한 하드웨어만 있다면 가능할 것 같았습니다.
하지만 새로 뽑은 차를 뜯고 싶지는 않았습니다. 무언가를 망가뜨릴 위험은 둘째 치고, 하드웨어를 개조하면 차량 보증이 무효가 될 수도 있었습니다. 소프트웨어 엔지니어로서 저는 납땜인두가 아니라 코드로 문제를 풀고 싶었습니다.
그래서 소프트웨어 기반 접근 방식을 찾기 시작했습니다.
재미있는 시도가 하나 있습니다. 테슬라에는 사실 Zoom 앱이 기본으로 들어 있습니다. 그러니 이론상으로는 MacBook에서 Zoom 회의를 열고 화면을 공유한 다음, 테슬라 디스플레이에서 그 화면을 보면 됩니다.
기술적으로는 됐습니다. 하지만 형편없었습니다. 영상이 Zoom 서버를 거쳐 돌아와야 해서 눈에 띄는 지연 시간이 생겼습니다. 더 심각한 문제는 테슬라의 Zoom 앱이 전체 화면 모드를 지원하지 않는다는 점이었습니다. 결국 제 데스크톱이 버벅이는 작은 창 안에 갇혀 보였습니다. 제가 원하던 세컨드 모니터 경험과는 거리가 멀었습니다.
제게 정말 필요한 것은 MacBook과 테슬라 사이의 직접 연결이라는 걸 깨달았습니다. 중간에 클라우드 서버가 끼어들지 않는 연결 말입니다. 테슬라에는 웹 브라우저가 있으니, MacBook에서 돌아가는 웹 서버에 접속하게만 하면 화면을 바로 스트리밍할 수 있을 터였습니다.
이를 위해서는 두 기기가 같은 로컬 네트워크에 있어야 했습니다. 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에서 서빙하는 웹 페이지를 불러왔습니다. 처음으로 두 기기 사이에 직접 연결이 만들어진 순간이었습니다.
이제 이 연결로 화면을 스트리밍하기만 하면 됐습니다.
첫 스트리밍 시도는 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 화면의 복사본을 보고 싶은 게 아니라, 진짜 확장 데스크톱, 즉 추가 화면을 원했습니다.
해결책은 뜻밖의 곳에서 나왔습니다. 바로 더미 HDMI 어댑터입니다. 서버 관리자들이 모니터 없는 헤드리스 머신에 모니터가 연결된 것처럼 속여 원격 데스크톱을 쓸 수 있게 만드는 작은 플러그입니다.
하나를 사서 MacBook에 꽂자 macOS가 곧바로 "두 번째 디스플레이"를 인식했습니다. 그다음 이 가상 디스플레이를 WebRTC로 테슬라에 공유했습니다. 이제 제 MacBook에는 화면이 두 개였습니다. 자기 화면 하나, 테슬라 화면 하나.
됐습니다. 하지만 구성이 점점 우스꽝스러워지고 있었습니다.
해상도를 높이면 스트림 품질이 Wi-Fi 처리량에 크게 좌우됐습니다. 제 OpenWrt 라우터는 최대 300Mbps가 한계였고, 이는 매끄러운 고해상도 확장 디스플레이에는 부족했습니다. 1Gbps 이상을 지원하는 라우터는 100달러가 넘었고, 저는 이미 LTE 라우터에 Wi-Fi 라우터, 더미 HDMI 어댑터까지 들고 다니고 있었습니다.
한 걸음 물러서서 스스로에게 물었습니다. 이 하드웨어를 하나도 쓰지 않고 할 수는 없을까?
1년 넘게 시간이 흘렀습니다. 그러다 이 아이디어가 다시 떠올랐고, 이번에는 다르게 접근했습니다. 제가 쓰던 하드웨어 하나하나에는 모두 소프트웨어 대체재가 있었습니다.
iPhone에는 개인용 핫스팟이 있고, MacBook에는 인터넷 공유(Internet Sharing)가 있습니다. iPhone을 USB 테더링으로 MacBook에 연결하면(MacBook의 Wi-Fi를 비워 두기 위해), Mac에서 인터넷 공유를 켜서 테슬라가 접속할 수 있는 Wi-Fi 네트워크를 띄울 수 있습니다.
즉 MacBook 자체가 라우터가 되고, 테슬라는 Wi-Fi로 MacBook에 직접 연결됩니다. LTE 라우터도, OpenWrt 라우터도 필요 없습니다.
하지만 사설 IP 차단 문제는 여전히 남아 있었습니다. macOS가 인터넷 공유 네트워크를 만들면 bridge100 네트워크 인터페이스가 생성되고 bootpd가 사설 IP 주소를 할당합니다.
해결책은 의외로 간단했습니다.
bridge100 인터페이스의 IP 주소 대역을 공인 IP 대역으로 변경bootpd 설정 수정설정 세 가지만 바꾸니 테슬라 브라우저가 다시 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/년