特斯拉車輛現在支援提供端到端命令身份驗證的協定。該 Golang 套件使用新協議來控制車輛功能,例如氣候控制和充電。
其中包含的工具包括 HTTP 代理伺服器,可將 REST API 呼叫轉換為新的車輛命令協定。
一些開發人員可能熟悉 Tesla 的 Owner API。當車輛開始需要端到端命令身份驗證時,車主 API 將停止運作。如果您是這些開發人員之一,您可以設定代理伺服器或重構您的應用程式以直接使用此程式庫。 2021 年之前的 Model S 和 X 車輛不支援此新協議。 Fleet API 將繼續在這些車輛上運行。
命令驗證分兩步驟進行:
因此,為了向車輛發送命令,第三方應用程式必須從用戶那裡獲取有效的 OAuth 令牌,並且用戶必須在車輛中註冊應用程式的公鑰。
Tesla 的網站有取得 OAuth 令牌的說明。此自述文件包含有關產生私鑰並將使用者引導至公鑰註冊流程的說明。此儲存庫中的工具可以使用 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 hub 運行映像:
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
用於覆蓋作業系統的預設系統金鑰環類型。執行tesla-keygen -h
以查看-keyring-type
標誌文件中列出的支援的值。有關每個選項的詳細信息,請參閱密鑰環文件。TESLA_VIN
指定車輛識別號碼。您可以在車輛 UI 的「控制」>「軟體」下找到您的 VIN。 (儘管有名稱,VIN 仍包含字母和數字)。TESLA_CACHE_FILE
指定快取會話資訊的檔案。快取允許程式跳過向車輛發送握手訊息。這可以減少客戶端在重新啟動後重新連接到車輛時進行的佇列 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
指定 HTTP 代理在聯絡 Tesla 伺服器時所使用的逾時。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 透過 Internet 發送命令的應用程式。
本節介紹如何設定和使用 HTTP 代理,該代理允許客戶端使用 REST API 發送車輛命令。
如上所述,您的 HTTP 代理需要對 Tesla(使用 OAuth 令牌)和單一車輛(使用私鑰)進行驗證。
Tesla 的伺服器要求您的用戶端提供 OAuth 存取令牌,然後才能將命令轉發到車輛。您必須從車主處取得 OAuth 令牌。請參閱 Tesla 網站,以了解有關註冊開發者帳戶和取得 OAuth 令牌的說明。
即使您的客戶端擁有有效的令牌,車輛也只接受由您的客戶端私鑰授權的命令。
此儲存庫中包含的tesla-keygen
實用程式會產生私鑰,將其儲存在系統金鑰環中,並列印相應的公鑰:
export TESLA_KEY_NAME=$(whoami)
tesla-keygen create > public_key.pem
系統密鑰環使用依賴作業系統的憑證儲存作為系統密鑰環。例如,在 macOS 上,它預設使用您的登入鑰匙圈。運行tesla-keygen -h
以獲取更多選項。
重新運行tesla-keygen
命令將列印相同的公鑰,而不會覆蓋私鑰。您可以使用-f
強制實用程式覆蓋現有公鑰。
車輛使用公鑰驗證指令。您的公鑰必須在用戶的車輛上註冊,然後他們才會接受您的應用程式發送的命令。
從業主的角度來看,註冊流程如下:
為了使此過程正常進行,您必須註冊一個可標識您的應用程式的網域名稱。當特斯拉應用程式詢問用戶是否希望批准您的請求時,將向用戶顯示該域名,並且車輛將在鎖定螢幕中的鑰匙旁邊顯示該域名。
按照說明註冊您的公鑰和網域。這些說明中所引用的公鑰是上例中的public_key.pem
檔案。
成功註冊您的公鑰後,請向車主提供https://tesla.com/_ak/<your_domain_name>
的連結。例如,如果您註冊了example.com
,請提供指向https://tesla.com/_ak/example.com
的連結。官方 Tesla iPhone 或 Android 行動應用程式(版本 4.27.3 或更高版本)將處理剩下的事情。擁有超過一款特斯拉產品的客戶必須在點擊連結或掃描二維碼之前選擇所需的車輛。
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 車輛指令端點。
為 Owner API 編寫的舊版用戶端在建立 URL 路徑時可能會使用車輛的 Owner API ID。代理伺服器要求客戶端直接使用 VIN。
您可以在 pkg.go.dev 上閱讀套件文件。
該存儲庫支援go mod
並遵循 Go 版本語義。請注意,v0.xx 版本不保證 API 穩定性。