ขณะนี้รถยนต์ของ Tesla รองรับโปรโตคอลที่ให้การรับรองความถูกต้องของคำสั่งตั้งแต่ต้นทางถึงปลายทาง แพ็คเกจ Golang นี้ใช้โปรโตคอลใหม่ในการควบคุมฟังก์ชั่นของยานพาหนะ เช่น การควบคุมสภาพอากาศและการชาร์จ
เครื่องมือที่รวมมาให้นั้นได้แก่ พร็อกซีเซิร์ฟเวอร์ HTTP ที่แปลงการเรียก REST API ไปเป็นโปรโตคอลคำสั่งยานพาหนะใหม่
นักพัฒนาบางคนอาจคุ้นเคยกับ Owner API ของ Tesla Owner 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:
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 ของคุณได้ในส่วนการควบคุม > ซอฟต์แวร์ใน UI ของรถ (แม้จะมีชื่อ แต่ VIN ก็มีทั้งตัวอักษรและตัวเลข)TESLA_CACHE_FILE
ระบุไฟล์ที่แคชข้อมูลเซสชัน แคชช่วยให้โปรแกรมข้ามการส่งข้อความจับมือไปยังรถยนต์ได้ ซึ่งจะช่วยลดทั้งเวลาแฝงและจำนวนการเรียก Fleet API ที่ไคลเอ็นต์ทำเมื่อเชื่อมต่อกับยานพาหนะอีกครั้งหลังจากรีสตาร์ท สิ่งนี้มีประโยชน์อย่างยิ่งเมื่อใช้ tesla-control
ซึ่งจะรีสตาร์ททุกครั้งที่เรียกใช้TESLA_HTTP_PROXY_TLS_CERT
ระบุไฟล์ใบรับรอง TLS สำหรับพร็อกซี HTTPTESLA_HTTP_PROXY_TLS_KEY
ระบุไฟล์คีย์ TLS สำหรับพร็อกซี HTTPTESLA_HTTP_PROXY_HOST
ระบุโฮสต์สำหรับพร็อกซี HTTPTESLA_HTTP_PROXY_PORT
ระบุพอร์ตสำหรับพร็อกซี HTTPTESLA_HTTP_PROXY_TIMEOUT
ระบุการหมดเวลาสำหรับพร็อกซี HTTP ที่จะใช้เมื่อติดต่อกับเซิร์ฟเวอร์ TeslaTESLA_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 Proxy ต้องมีใบรับรองเซิร์ฟเวอร์ TLS เพื่อวัตถุประสงค์ในการทดสอบและพัฒนา คุณสามารถสร้างใบรับรองเซิร์ฟเวอร์ localhost ที่ลงนามด้วยตนเองโดยใช้ 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