Приёмный сервер телематического протокола DCVP (Dongfeng Cloud Vehicle Platform) для блока T-BOX автомобиля VOYAH Courage / 岚图知音 四驱全球版.
Цель — принимать выгрузку штатного T-BOX на свой сервер (локальный, в бортовой сети),
без китайского облака: переиспользовать штатные датчики/GPS/антенны для собственной телеметрии
и заодно снять паразитный разряд 12 В (радио в flight, аплоад по Ethernet). Протокол
восстановлен статическим реверсом прошивки tsp_manager (T_BOX_H37A3630849BA), без правок
на живой машине.
⚠️ Исследовательский инструмент для собственного автомобиля. Секреты конкретной машины (ключи, сертификаты, ICCID/IMEI/MAC/VIN, GPS) в репозитории отсутствуют и не должны здесь появляться.
-
Схема данных —
proto/vcp_custom_message.proto(пакетtboxev.vcp, proto2, 68 сообщений / 534 поля), извлечена из встроенногоFileDescriptorProtoв.rodataбинаряtsp_manager. Ключевые:in_binding_info(идентификационный хендшейк),in_veh_data(97 полей состояния),in_location_data,in_driving_report/in_alarm_info,in_general_config(адрес платформы по протоколу). -
Обёртка кадра — GB/T 32960 (китайский нацстандарт телематики ЭМ), поверх mTLS-сокета:
off size поле 0 2 23 23(##, 起始符)2 1 cmd— командный флаг3 1 resp— флаг ответа (0xFE=запрос,0x01=успешный ACK)4 17 VIN (ASCII) 21 1 enc— шифрование data-unit (0x01=нет,0x02=AES)22 2 len— длина data-unit, big-endian24 N data-unit 24+N 1 BCC— XOR байтов[2 .. 24+N)Полный кадр =
25 + Nбайт. protobuftboxev.vcp.*едет в data-unit подcmd = 0xCB(заводской диапазон0x80..0xFE), а не отдельным каналом. -
Последовательность сессии:
login(0x01) → ACK → heartbeat(0x07) каждые heartBeat_Time сек + realtime(0x02)/custom(0xCB) по событию → logout(0x04). До логина данные буферизуются. При 3 неудачных логинах — ретрай-цикл 30 мин. -
Порты/транспорт:
6504/6507— DCVP-сессия (TCP mTLS, GB/T 32960);6553— HTTPSPOST /log/logReceiveGateway(загрузка логов, отдельный канал); KPI/PKI — HTTPS-JSON. -
mTLS: клиент (T-BOX) проверяет сервер по своему trust store, который лежит в перезаписываемой области блока → подменяется на собственный CA (
certs/); клиентский сертификат сервер принимает любой (илиVERIFYPEER=0). -
Bootstrap PKI: до провижининга клиентского сертификата T-BOX поднимает TLS на заводском
tbox.pfx, затемCSR → client.crt.
- Терминирует mTLS нашим CA (порты
6504/6507). - deframe GB/T 32960: поиск старта
##, разбор заголовка, длина BE по смещению 22, проверка XOR-BCC, ресинхронизация сквозь мусор, придержка недочитанного кадра. - Диспетч по
cmd; custom-кадры (0xCB) распаковывает как protobuftboxev.vcp.*;enc=0x02(AES) помечает, не пытаясь парсить. - Генерирует GB-ACK (
resp=0x01): дляlogin/logout— эхоtime+serial, дляheartbeat— header-only. Без ACK T-BOX ловитresponse_TimeOutи переоткрывает сессию. - Отдельный HTTPS-хендлер на
6553дляPOST /log/logReceiveGateway.
- Точная структура data-unit ACK сервера (какие поля кроме
serial_numberвалидирует T-BOX). Текущий ACK минимальный, но по коду достаточный для удержания сессии. - Реальные
heartBeat_Time/таймауты и включён ли AES data-unit (enc=0x02) — берутся из конфига блока. - Точная 54-байтная раскладка login data-unit (время/流水号/ICCID видны, порядок подсистем — по GB/T 32960.2).
- Приём remote-config
in_general_configот произвольного пира (второй вектор задания адреса платформы).
proto/ vcp_custom_message.proto схема выгрузки (tboxev.vcp)
server/ dcvp_server.py + Dockerfile приёмник GB/T 32960 + GB-ACK + HTTPS-логи
client/ fake_tbox.py синтетический клиент: GB/T 32960-сессия без машины
harness/ README.md план qemu-стенда: живой tsp_manager → наш сервер
certs/ gen-ca.sh генератор своего CA + server/client cert (сами cert'ы gitignored)
docker-compose.yml · Makefile
make certs # свой CA + server/client cert (генерятся локально, в git не идут)
make build # образ; protobuf-байндинги генерятся внутри из .proto
make up # сервер на :6504/6507 (сессия) + :6553 (HTTPS-логи), лог в консоль
# в другом окне — синтетический клиент (GB/T 32960-сессия end-to-end):
make clientОтладка без TLS/клиентского cert: добавить в command сервера --plaintext или --no-client-cert.
Синтетический клиент прогоняет login → binding → location → N×(heartbeat + veh_data) → logout и печатает ACK.
certs/ — наш лабораторный CA (не секреты машины), генерится локально и в git не коммитится
(.gitignore). ⛔ Реальные device-секреты T-BOX (rsa_aes_tbox.key, боевой client.crt, tbox.pfx,
настоящий ca.pem), а также VIN/ICCID/IMEI/MAC/GPS конкретной машины сюда класть нельзя. Значения в
client/fake_tbox.py — синтетические.