Tesla 차량은 이제 엔드투엔드 명령 인증을 제공하는 프로토콜을 지원합니다. 이 Golang 패키지는 새로운 프로토콜을 사용하여 실내 온도 조절 및 충전과 같은 차량 기능을 제어합니다.
포함된 도구 중에는 REST API 호출을 새로운 차량 명령 프로토콜로 변환하는 HTTP 프록시 서버가 있습니다.
일부 개발자는 Tesla의 Owner API에 익숙할 수 있습니다. 차량이 엔드투엔드 명령 인증을 요구하기 시작하면 소유자 API 작동이 중단됩니다. 이러한 개발자 중 한 명이라면 프록시 서버를 설정하거나 애플리케이션을 리팩터링하여 이 라이브러리를 직접 사용할 수 있습니다. 2021년 이전 모델 S 및 X 차량은 이 새로운 프로토콜을 지원하지 않습니다. Fleet API는 이러한 차량에서 계속 작동합니다.
명령 인증은 두 단계로 이루어집니다.
따라서 차량에 명령을 보내려면 타사 애플리케이션이 사용자로부터 유효한 OAuth 토큰을 얻어야 하며, 사용자는 애플리케이션의 공개 키를 차량에 등록해야 합니다.
Tesla 웹사이트에는 OAuth 토큰 획득에 대한 지침이 있습니다. 이 README에는 개인 키를 생성하고 사용자를 공개 키 등록 흐름으로 안내하는 지침이 포함되어 있습니다. 이 저장소의 도구는 OAuth 토큰과 개인 키를 사용하여 차량에 명령을 보낼 수 있습니다.
예를 들어 저장소에는 다음과 같은 명령줄 인터페이스가 포함되어 있습니다.
tesla-control -ble -key-file private_key.pem lock
그리고 REST API 프록시 서버(실행 시 개인 키와 함께 제공되고 클라이언트가 보낸 OAuth 토큰을 사용함):
curl --cacert cert.pem
--header 'Content-Type: application/json'
--header "Authorization: Bearer $TESLA_AUTH_TOKEN"
--data '{}'
"https://localhost:4443/api/1/vehicles/$VIN/command/door_lock"
요구사항:
설치 단계:
go get ./...
go build ./...
go install ./...
마지막 명령은 다음 유틸리티를 설치합니다.
이러한 도구를 실행하는 데 Docker 이미지를 사용할 수 있습니다. 이미지는 기본적으로 HTTP 프록시를 실행하도록 설정되어 있지만 --entrypoint
플래그는 사용할 도구를 변경합니다.
Docker 허브에서 이미지를 실행합니다.
docker pull tesla/vehicle-command:latest
docker run tesla/vehicle-command:latest --help
# running a different tool
docker run --entrypoint tesla-control tesla/vehicle-command:latest --help
예제 docker-compose.yml 파일도 제공됩니다.
docker compose up
명령줄 플래그 대신 다음 환경 변수를 사용할 수 있습니다.
TESLA_KEY_NAME
시스템 키링의 명령 인증 개인 키에 대한 항목 이름을 파생하는 데 사용됩니다.TESLA_TOKEN_NAME
시스템 키링에서 OAuth 토큰의 항목 이름을 파생하는 데 사용됩니다.TESLA_KEYRING_TYPE
OS의 기본 시스템 키링 유형을 재정의합니다. -keyring-type
플래그 문서에 나열된 지원 값을 보려면 tesla-keygen -h
실행하세요. 각 옵션에 대한 자세한 내용은 키링 설명서를 참조하세요.TESLA_VIN
차량 식별 번호를 지정합니다. 차량 UI의 컨트롤 > 소프트웨어에서 VIN을 찾을 수 있습니다. (이름에도 불구하고 VIN에는 문자와 숫자가 모두 포함됩니다.)TESLA_CACHE_FILE
세션 정보를 캐시하는 파일을 지정합니다. 캐시를 사용하면 프로그램이 차량에 핸드셰이크 메시지를 보내는 것을 건너뛸 수 있습니다. 이렇게 하면 다시 시작한 후 차량에 다시 연결할 때 클라이언트가 수행하는 Fleet API 호출 횟수와 지연 시간이 모두 줄어듭니다. 이는 호출할 때마다 다시 시작되는 tesla-control
사용할 때 특히 유용합니다.TESLA_HTTP_PROXY_TLS_CERT
HTTP 프록시에 대한 TLS 인증서 파일을 지정합니다.TESLA_HTTP_PROXY_TLS_KEY
HTTP 프록시에 대한 TLS 키 파일을 지정합니다.TESLA_HTTP_PROXY_HOST
HTTP 프록시의 호스트를 지정합니다.TESLA_HTTP_PROXY_PORT
HTTP 프록시의 포트를 지정합니다.TESLA_HTTP_PROXY_TIMEOUT
Tesla 서버에 접속할 때 사용할 HTTP 프록시의 시간 초과를 지정합니다.TESLA_VERBOSE
자세한 로깅을 활성화합니다. tesla-control
및 tesla-http-proxy
에서 지원됩니다.예를 들어:
export TESLA_KEY_NAME= $( whoami )
export TESLA_TOKEN_NAME= $( whoami )
export TESLA_CACHE_FILE= ~ /.tesla-cache.json
이제 명령줄 도구를 사용하여 BLE를 통해 개인 차량에 명령을 보낼 준비가 되었습니다! 또는 아래에서 계속해서 REST API를 사용하여 인터넷을 통해 명령을 보낼 수 있는 애플리케이션을 구축하는 방법을 알아보세요.
이 섹션에서는 클라이언트가 REST API를 사용하여 차량 명령을 보낼 수 있도록 하는 HTTP 프록시를 설정하고 사용하는 방법을 설명합니다.
위에서 설명한 것처럼 HTTP 프록시는 Tesla(OAuth 토큰 사용)와 개별 차량(개인 키 사용) 모두를 인증해야 합니다.
Tesla 서버는 차량에 명령을 전달하기 전에 클라이언트가 OAuth 액세스 토큰을 제공하도록 요구합니다. 차량 소유자로부터 OAuth 토큰을 받아야 합니다. 개발자 계정 등록 및 OAuth 토큰 획득에 대한 지침은 Tesla 웹사이트를 참조하세요.
클라이언트에 유효한 토큰이 있더라도 차량은 클라이언트의 개인 키로 승인된 명령만 수락합니다.
이 저장소에 포함된 tesla-keygen
유틸리티는 개인 키를 생성하여 시스템 키링에 저장하고 해당 공개 키를 인쇄합니다.
export TESLA_KEY_NAME=$(whoami)
tesla-keygen create > public_key.pem
시스템 키링은 OS 종속 자격 증명 저장소를 시스템 키링으로 사용합니다. 예를 들어 macOS에서는 기본적으로 로그인 키체인을 사용합니다. 더 많은 옵션을 보려면 tesla-keygen -h
실행하세요.
tesla-keygen
명령을 다시 실행하면 개인 키를 덮어쓰지 않고 동일한 공개 키가 인쇄됩니다. -f
사용하여 유틸리티가 기존 공개 키를 덮어쓰도록 할 수 있습니다.
차량은 공개 키를 사용하여 명령을 확인합니다. 사용자가 애플리케이션에서 보낸 명령을 수락하려면 먼저 사용자의 차량에 공개 키를 등록해야 합니다.
소유자 관점의 등록 프로세스는 다음과 같습니다.
이 프로세스가 작동하려면 애플리케이션을 식별하는 도메인 이름을 등록해야 합니다. Tesla 앱은 요청 승인 여부를 물을 때 사용자에게 이 도메인 이름을 표시하며, 차량은 잠금 화면의 키 옆에 도메인 이름을 표시합니다.
지침에 따라 공개 키와 도메인을 등록하세요. 해당 지침에서 참조되는 공개 키는 위 예의 public_key.pem
파일입니다.
공개 키가 성공적으로 등록되면 차량 소유자에게 https://tesla.com/_ak/<your_domain_name>
링크를 제공하세요. 예를 들어 example.com
등록한 경우 https://tesla.com/_ak/example.com
링크를 제공하세요. 나머지는 공식 Tesla iPhone 또는 Android 모바일 앱(버전 4.27.3 이상)에서 처리됩니다. Tesla 제품을 두 개 이상 보유한 고객은 링크를 클릭하거나 QR 코드를 스캔하기 전에 원하는 차량을 선택해야 합니다.
HTTP 프록시에는 TLS 서버 인증서가 필요합니다. 테스트 및 개발 목적으로 OpenSSL을 사용하여 자체 서명된 로컬 호스트 서버 인증서를 생성할 수 있습니다.
mkdir config
openssl req -x509 -nodes -newkey ec
-pkeyopt ec_paramgen_curve:secp521r1
-pkeyopt ec_param_enc:named_curve
-subj '/CN=localhost'
-keyout config/tls-key.pem -out config/tls-cert.pem -sha256 -days 3650
-addext "extendedKeyUsage = serverAuth"
-addext "keyUsage = digitalSignature, keyCertSign, keyAgreement"
이 명령은 암호화되지 않은 개인 키인 config/tls-key.pem
생성합니다.
프록시 서버는 다음 명령을 사용하여 실행할 수 있습니다.
tesla-http-proxy -tls-key config/tls-key.pem -cert config/tls-cert.pem -key-file config/fleet-key.pem -port 4443
Docker를 사용하여 실행할 수도 있습니다.
# option 1: using docker run
docker pull tesla/vehicle-command:latest
docker run -v ./config:/config -p 127.0.0.1:4443:4443 tesla/vehicle-command:latest -tls-key /config/tls-key.pem -cert /config/tls-cert.pem -key-file /config/fleet-key.pem -host 0.0.0.0 -port 4443
# option 2: using docker compose
docker compose up
참고: 프로덕션에서는 -port 4443
생략하고 표준 포트 443에서 수신 대기하는 것이 좋습니다.
이 섹션에서는 클라이언트가 curl
사용하여 서버에 연결하는 방법을 보여줍니다. 클라이언트는 OAuth 토큰을 획득할 책임이 있습니다. 위에서 설명한 대로 OAuth 토큰을 얻습니다.
엔드투엔드 인증을 지원하지 않는 엔드포인트는 Tesla의 REST API로 프록시됩니다.
export TESLA_AUTH_TOKEN= < access-token >
export VIN= < vin >
curl --cacert cert.pem
--header " Authorization: Bearer $TESLA_AUTH_TOKEN "
" https://localhost:4443/api/1/vehicles/ $VIN /vehicle_data "
| jq -r .
엔드투엔드 인증을 지원하는 엔드포인트는 세션 상태 및 재시도를 처리하는 프록시에 의해 가로채어 다시 작성됩니다. cert.pem
클라이언트에 복사한 후 클라이언트에서 다음 명령을 실행하면 프록시가 flash_lights
명령을 차량에 보냅니다.
export TESLA_AUTH_TOKEN= < access-token >
export VIN= < vin >
curl --cacert cert.pem
--header ' Content-Type: application/json '
--header " Authorization: Bearer $TESLA_AUTH_TOKEN "
--data ' {} '
" https://localhost:4443/api/1/vehicles/ $VIN /command/flash_lights "
$TESLA_AUTH_TOKEN
획득하는 흐름:
시스템을 통한 명령 흐름:
HTTP 프록시는 Tesla Fleet API 차량 명령 엔드포인트를 구현합니다.
소유자 API용으로 작성된 기존 클라이언트는 URL 경로를 구성할 때 차량의 소유자 API ID를 사용할 수 있습니다. 대신 프록시 서버에서는 클라이언트가 VIN을 직접 사용해야 합니다.
pkg.go.dev에서 패키지 설명서를 읽을 수 있습니다.
이 저장소는 go mod
지원하고 Go 버전 의미를 따릅니다. v0.xx 릴리스는 API 안정성을 보장하지 않습니다.