Kendaraan Tesla sekarang mendukung protokol yang menyediakan otentikasi perintah ujung ke ujung. Paket Golang ini menggunakan protokol baru untuk mengontrol fungsi kendaraan, seperti pengatur suhu dan pengisian daya.
Di antara alat yang disertakan adalah server proksi HTTP yang mengubah panggilan REST API ke protokol perintah kendaraan baru.
Beberapa pengembang mungkin akrab dengan API Pemilik Tesla. API Pemilik akan berhenti berfungsi saat kendaraan mulai memerlukan otentikasi perintah ujung ke ujung. Jika Anda salah satu dari pengembang ini, Anda dapat menyiapkan server proxy atau memfaktorkan ulang aplikasi Anda untuk menggunakan perpustakaan ini secara langsung. Kendaraan Model S dan X sebelum tahun 2021 tidak mendukung protokol baru ini. Fleet API akan terus mengerjakan kendaraan ini.
Otentikasi perintah terjadi dalam dua langkah:
Jadi untuk mengirimkan perintah ke kendaraan, aplikasi pihak ketiga harus mendapatkan token OAuth yang valid dari pengguna, dan pengguna harus mendaftarkan kunci publik aplikasi di kendaraan.
Situs web Tesla memiliki instruksi untuk mendapatkan token OAuth. README ini memiliki instruksi untuk membuat kunci privat dan mengarahkan pengguna ke alur pendaftaran kunci publik. Alat dalam repositori ini dapat menggunakan token OAuth dan kunci pribadi untuk mengirimkan perintah ke kendaraan.
Misalnya, repositori menyertakan antarmuka baris perintah:
tesla-control -ble -key-file private_key.pem lock
Dan server proksi REST API (yang dilengkapi dengan kunci pribadi saat peluncuran dan menggunakan token OAuth yang dikirim oleh klien):
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"
Persyaratan:
Langkah-langkah instalasi:
go get ./...
go build ./...
go install ./...
Perintah terakhir menginstal utilitas berikut:
Gambar Docker tersedia untuk menjalankan alat ini. Gambar secara default menjalankan proksi HTTP, tetapi tanda --entrypoint
mengubah alat yang akan digunakan.
Jalankan image dari hub 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
Contoh file docker-compose.yml juga disediakan.
docker compose up
Variabel lingkungan berikut dapat digunakan sebagai pengganti tanda baris perintah.
TESLA_KEY_NAME
digunakan untuk mendapatkan nama entri untuk kunci pribadi autentikasi perintah Anda di gantungan kunci sistem Anda.TESLA_TOKEN_NAME
digunakan untuk mendapatkan nama entri untuk token OAuth Anda di keyring sistem Anda.TESLA_KEYRING_TYPE
digunakan untuk menggantikan jenis keyring sistem default untuk OS Anda. Jalankan tesla-keygen -h
untuk melihat nilai yang didukung yang tercantum dalam dokumentasi tanda -keyring-type
. Konsultasikan dokumentasi keyring untuk rincian tentang setiap opsi.TESLA_VIN
menentukan nomor identifikasi kendaraan. Anda dapat menemukan NIK Anda di Kontrol > Perangkat Lunak di UI kendaraan Anda. (Terlepas dari namanya, NIK berisi huruf dan angka).TESLA_CACHE_FILE
menentukan file yang menyimpan informasi sesi dalam cache. Cache memungkinkan program untuk melewatkan pengiriman pesan jabat tangan ke kendaraan. Hal ini mengurangi latensi dan jumlah panggilan Fleet API yang dilakukan klien saat menyambungkan kembali ke kendaraan setelah memulai ulang. Hal ini sangat membantu ketika menggunakan tesla-control
, yang memulai ulang pada setiap pemanggilan.TESLA_HTTP_PROXY_TLS_CERT
menentukan file sertifikat TLS untuk proksi HTTP.TESLA_HTTP_PROXY_TLS_KEY
menentukan file kunci TLS untuk proksi HTTP.TESLA_HTTP_PROXY_HOST
menentukan host untuk proksi HTTP.TESLA_HTTP_PROXY_PORT
menentukan port untuk proksi HTTP.TESLA_HTTP_PROXY_TIMEOUT
menentukan batas waktu proksi HTTP yang akan digunakan saat menghubungi server Tesla.TESLA_VERBOSE
mengaktifkan pencatatan verbose. Didukung oleh tesla-control
dan tesla-http-proxy
.Misalnya:
export TESLA_KEY_NAME= $( whoami )
export TESLA_TOKEN_NAME= $( whoami )
export TESLA_CACHE_FILE= ~ /.tesla-cache.json
Pada titik ini, Anda siap menggunakan alat baris perintah untuk mulai mengirimkan perintah ke kendaraan pribadi Anda melalui BLE! Alternatifnya, lanjutkan membaca di bawah ini untuk mempelajari cara membuat aplikasi yang dapat mengirimkan perintah melalui Internet menggunakan REST API.
Bagian ini menjelaskan cara menyiapkan dan menggunakan proksi HTTP, yang memungkinkan klien mengirim perintah kendaraan menggunakan REST API.
Seperti dibahas di atas, proksi HTTP Anda perlu mengautentikasi dengan Tesla (menggunakan token OAuth) dan dengan kendaraan individual (menggunakan kunci pribadi).
Server Tesla mengharuskan klien Anda untuk memberikan token akses OAuth sebelum mereka meneruskan perintah ke kendaraan. Anda harus mendapatkan token OAuth dari pemilik kendaraan. Lihat situs web Tesla untuk petunjuk cara mendaftarkan akun pengembang dan mendapatkan token OAuth.
Meskipun klien Anda memiliki token yang valid, kendaraan hanya menerima perintah yang disahkan oleh kunci pribadi klien Anda.
Utilitas tesla-keygen
yang disertakan dalam repositori ini menghasilkan kunci pribadi, menyimpannya di gantungan kunci sistem Anda, dan mencetak kunci publik yang sesuai:
export TESLA_KEY_NAME=$(whoami)
tesla-keygen create > public_key.pem
Gantungan kunci sistem menggunakan penyimpanan kredensial yang bergantung pada OS Anda sebagai gantungan kunci sistem. Di macOS, misalnya, defaultnya adalah menggunakan rantai kunci login Anda. Jalankan tesla-keygen -h
untuk opsi lainnya.
Menjalankan kembali perintah tesla-keygen
akan mencetak kunci publik yang sama tanpa menimpa kunci privat. Anda dapat memaksa utilitas untuk menimpa kunci publik yang ada dengan -f
.
Kendaraan memverifikasi perintah menggunakan kunci publik. Kunci publik Anda harus didaftarkan pada kendaraan pengguna Anda sebelum mereka menerima perintah yang dikirim oleh aplikasi Anda.
Berikut proses pendaftaran dari sudut pandang pemilik:
Agar proses ini berfungsi, Anda harus mendaftarkan nama domain yang mengidentifikasi aplikasi Anda. Aplikasi Tesla akan menampilkan nama domain ini kepada pengguna ketika ditanya apakah mereka ingin menyetujui permintaan Anda, dan kendaraan akan menampilkan nama domain di sebelah kunci di layar Kunci.
Ikuti petunjuk untuk mendaftarkan kunci publik dan domain Anda. Kunci publik yang dimaksud dalam instruksi tersebut adalah file public_key.pem
pada contoh di atas.
Setelah kunci publik Anda berhasil didaftarkan, berikan tautan ke https://tesla.com/_ak/<your_domain_name>
kepada pemilik kendaraan. Misalnya, jika Anda mendaftar example.com
, berikan tautan ke https://tesla.com/_ak/example.com
. Aplikasi seluler resmi Tesla iPhone atau Android (versi 4.27.3 atau lebih tinggi) akan menangani sisanya. Pelanggan yang memiliki lebih dari satu produk Tesla harus memilih kendaraan yang diinginkan sebelum mengklik link atau memindai kode QR.
Proksi HTTP memerlukan sertifikat server TLS. Untuk tujuan pengujian dan pengembangan, Anda dapat membuat sertifikat server localhost yang ditandatangani sendiri menggunakan 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"
Perintah ini membuat kunci pribadi yang tidak terenkripsi, config/tls-key.pem
.
Server proxy dapat dijalankan menggunakan perintah berikut:
tesla-http-proxy -tls-key config/tls-key.pem -cert config/tls-cert.pem -key-file config/fleet-key.pem -port 4443
Itu juga dapat dijalankan menggunakan 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
Catatan: Dalam produksi, Anda mungkin ingin menghilangkan -port 4443
dan mendengarkan pada port standar 443.
Bagian ini mengilustrasikan bagaimana klien dapat menjangkau server menggunakan curl
. Klien bertanggung jawab untuk mendapatkan token OAuth. Dapatkan token OAuth seperti dijelaskan di atas.
Titik akhir yang tidak mendukung autentikasi ujung ke ujung diproksikan ke 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 .
Titik akhir yang mendukung autentikasi ujung ke ujung dicegat dan ditulis ulang oleh proksi, yang menangani status sesi dan percobaan ulang. Setelah menyalin cert.pem
ke klien Anda, menjalankan perintah berikut dari klien akan menyebabkan proksi mengirimkan perintah flash_lights
ke kendaraan:
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 "
Alur untuk mendapatkan $TESLA_AUTH_TOKEN
:
Aliran perintah melalui sistem:
Proksi HTTP mengimplementasikan titik akhir perintah kendaraan Tesla Fleet API.
Klien lama yang ditulis untuk Owner API mungkin menggunakan ID API Pemilik kendaraan saat membuat jalur URL. Server proxy mengharuskan klien untuk menggunakan VIN secara langsung.
Anda dapat membaca dokumentasi paket di pkg.go.dev.
Repositori ini mendukung go mod
dan mengikuti semantik versi Go. Perlu diperhatikan bahwa rilis v0.xx tidak menjamin stabilitas API.