特斯拉车辆现在支持提供端到端命令身份验证的协议。该 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 稳定性。