Автомобили Tesla теперь поддерживают протокол, обеспечивающий сквозную аутентификацию команд. Этот пакет Golang использует новый протокол для управления функциями автомобиля, такими как климат-контроль и зарядка.
Среди включенных инструментов — прокси-сервер HTTP, который преобразует вызовы REST API в новый протокол управления транспортным средством.
Некоторые разработчики могут быть знакомы с API владельца Tesla. API владельца перестанет работать, поскольку транспортные средства начнут требовать сквозной аутентификации команд. Если вы один из этих разработчиков, вы можете настроить прокси-сервер или выполнить рефакторинг своего приложения для прямого использования этой библиотеки. Автомобили моделей S и X до 2021 года не поддерживают этот новый протокол. 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 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
указывает идентификационный номер транспортного средства. Вы можете найти свой VIN в разделе «Элементы управления» > «Программное обеспечение» пользовательского интерфейса вашего автомобиля. (Несмотря на название, VIN-коды содержат как буквы, так и цифры).TESLA_CACHE_FILE
указывает файл, который кэширует информацию о сеансе. Кэш позволяет программам пропускать отправку сообщений о рукопожатии в автомобиль. Это уменьшает как задержку, так и количество вызовов Fleet API, которые клиент делает при повторном подключении к транспортному средству после перезапуска. Это особенно полезно при использовании tesla-control
, который перезапускается при каждом вызове.TESLA_HTTP_PROXY_TLS_CERT
указывает файл сертификата TLS для HTTP-прокси.TESLA_HTTP_PROXY_TLS_KEY
указывает файл ключей TLS для HTTP-прокси.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.
В этом разделе описывается, как настроить и использовать 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
.
Транспортные средства проверяют команды с помощью открытых ключей. Ваш открытый ключ должен быть зарегистрирован в транспортных средствах ваших пользователей, прежде чем они смогут принимать команды, отправленные вашим приложением.
Вот процесс регистрации с точки зрения владельца:
Чтобы этот процесс работал, вы должны зарегистрировать доменное имя, которое идентифицирует ваше приложение. Приложение 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, как описано выше.
Конечные точки, которые не поддерживают сквозную аутентификацию, передаются через REST API Tesla:
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, могут использовать идентификатор Owner API автомобиля при построении URL-путей. Вместо этого прокси-сервер требует, чтобы клиенты использовали VIN напрямую.
Вы можете прочитать документацию пакета на pkg.go.dev.
Этот репозиторий поддерживает go mod
и соответствует семантике версии Go. Обратите внимание, что выпуски v0.xx не гарантируют стабильность API.