![Мобильное приложение VAG Virtual Cockpit Мобильное приложение VAG Virtual Cockpit](https://habrastorage.org/getpro/habr/upload_files/3b5/a66/40e/3b5a6640eb00584d2432e4d8f6a36ac6.jpg)
Я продолжаю изучать CAN шину авто. В предыдущих статьях я голосом открывал окна в машине и собирал виртуальную панель приборов на RPi. Теперь я разрабатываю мобильное приложение VAG Virtual Cockpit, которое должно полностью заменить приборную панель любой модели VW/Audi/Skoda/Seat. Работает оно так: телефон подключается к ELM327 адаптеру по Wi-Fi или Bluetooth и отправляет диагностические запросы в CAN шину, в ответ получает информацию о датчиках.
По ходу разработки мобильного приложения пришлось узнать, что разные электронные блоки управления (двигателя, трансмиссии, приборной панели и др.) подключенные к CAN шине могут использовать разные протоколы для диагностики, а именно UDS и KWP2000 в обертке из VW Transport Protocol 2.0.
Программный сниффер VCDS
![Программный сниффер VCDS: CAN-Sniffer Программный сниффер VCDS: CAN-Sniffer](https://habrastorage.org/getpro/habr/upload_files/e64/d58/0f6/e64d580f67861411f9cdc104b70b0349.png)
Чтобы узнать по какому протоколу общаются электронные блоки я использовал специальную версию VCDS с программным сниффером в комплекте. В этот раз никаких железных снифферов на Arduino или RPi не пришлось изобретать. С помощью CAN-Sniffer можно подсмотреть общение между VCDS и автомобилем, чтобы затем телефон мог прикинуться диагностической утилитой и отправлять те же самые запросы.
Я собрал некоторую статистику по использованию диагностических протоколов на разных моделях автомобилей:
VW/Skoda/Seat (2006-2012) - приборная панель UDS. Двигатель и трансмиссия VW TP 2.0
Audi (2006-2012) - приборная панель VW TP 2.0. Двигатель UDS. Трансмиссия VW TP 2.0
VW/Skoda/Seat/Audi (2012-2021) - везде UDS
Протокол UDS
Unified Diagnostic Services (UDS) - это диагностический протокол, используемый в электронных блоках управления (ЭБУ) автомобильной электроники. Протокол описан в стандарте ISO 14229-1 и является производным от стандарта ISO 14230-3 (KWP2000) и ныне устаревшего стандарта ISO 15765-3 (Diagnostic Communication over Controller Area Network (DoCAN)). Более подробно в википедии.
![Диагностические данные от двигателя по протоколу UDS (Skoda Octavia A7) Диагностические данные от двигателя по протоколу UDS (Skoda Octavia A7)](https://habrastorage.org/getpro/habr/upload_files/27f/f00/04d/27ff0004de30de0b05b9ac0882df0bbb.png)
В моей машине (Skoda Octavia A5) приборка использует UDS протокол, это дало мне легкий старт разработки, т.к. данные были в простом формате Single Frame SF (фрейм, вся информация которого умещается в один CAN пакет) и большинство значений легко поддавались расшифровке. Volkswagen не дает документацию на формат значений, поэтому формулу расшифровки для каждого датчика приходилось подбирать методом логического мышления. Про UDS протокол очень хорошо и с подробным разбором фреймов написано на canhacker.ru.
![Разбор UDS пакета в формате Single Frame Разбор UDS пакета в формате Single Frame](https://habrastorage.org/getpro/habr/upload_files/fd2/777/cdc/fd2777cdc0d5acdce4d6a01e84e988fb.png)
Пример запроса и ответа температуры моторного масла:
7E0 0x03 0x22 0x11 0xBD 0x55 0x55 0x55 0x55
7E8 0x05 0x62 0x11 0xBD 0x0B 0x74 0x55 0x55
Запрос температуры моторного масла:
7E0 - Адрес назначения (ЭБУ двигателя)
Байт 0 (0x03) - Размер данных (3 байта)
Байт 1 (0x22) - SID идентификатор сервиса (запрос текущих параметров)
Байт 2, 3 (0x11 0xBD) - PID идентификатор параметра (температура моторного масла)
Байт 4, 5, 6, 7 (0x55) - Заполнитель до 8 байт
Ответ температуры моторного масла:
7E8 - Адрес источника (Диагностический прибор)
Байт 0 (0x05) - Размер данных (5 байт)
Байт 1 (0x62) - Положительный ответ, такой SID существует. 0x22 + 0x40 = 0x62. (0x7F) - отрицательный ответ
Байт 2, 3 (0x11 0xBD) - PID идентификатор параметра (температура моторного масла)
Байт 4, 5 (0x0B 0x74) - значение температуры моторного масла (20.1 °C формулу пока что не смог подобрать)
Байт 6, 7 (0x55) - Заполнитель до 8 байт
Первая версия мобильного приложения VAG Virtual Cockpit умела подключаться только к приборной панели по UDS.
![VAG Virtual Cockpit - экран с данными от приборной панели по протоколу UDS VAG Virtual Cockpit - экран с данными от приборной панели по протоколу UDS](https://habrastorage.org/getpro/habr/upload_files/19b/9f1/a10/19b9f1a10db811bb3da28928ce7a88f2.png)
VW Transport Protocol 2.0
Volkswagen Transport Protocol 2.0 используется в качестве транспортного уровня, а данные передаются в формате KWP2000. Keyword Protocol 2000 - это протокол для бортовой диагностики автомобиля стандартизированный как ISO 14230. Прикладной уровень описан в стандарте ISO 14230-3. Более подробно в википедии.
Т.к. KWP2000 использует сообщения переменной длины, а CAN шина позволяет передавать сообщения не больше 8 байт, то VW TP 2.0 разбивает длинное сообщение KWP2000 на части при отправке по CAN шине и собирает заново при получении.
![Диагностические данные от двигателя по протоколу KWP2000 (Skoda Octavia A5) Диагностические данные от двигателя по протоколу KWP2000 (Skoda Octavia A5)](https://habrastorage.org/getpro/habr/upload_files/56e/a22/2b8/56ea222b89d602e8efd0145c1915dcd4.png)
ЭБУ двигателя моей машины использует протокол VW TP 2.0, поэтому мне пришлось изучить его. Видимо Volkswagen разрабатывала транспортный протокол не только для работы по надежной CAN шине, но и для менее надежных линий связи, иначе нет объяснения для чего требуется такая избыточная проверка целостности данных. Главным источником информации по VW TP 2.0 является сайт https://jazdw.net/tp20.
Разбор протокола VW TP 2.0 на примере подключения к первой группе двигателя:
200 01 C0 00 10 00 03 01 | Настраиваем канал с двигателем. Байт 0: 0x01 - двигатель, 0x02 - трансмиссия. Байт 5,4: 0x300 - адрес источника |
201 00 D0 00 03 40 07 01 | Получили положительный ответ. Байт 5,4: 0x740 - к двигателю обращаемся по этому адресу |
740 A0 0F 8A FF 32 FF | Настраиваем ЭБУ на отправку сразу 16 пакетов и выставляем временные параметры |
300 A1 0F 8A FF 4A FF | Получили положительный ответ |
740 10 00 02 10 89 | Отправляем команду KWP2000 startDiagnosticSession. Байт 0: 0x10 = 0b0001 - последняя строка данных + 0x0 счетчик отправляемых пакетов 0 (0x0 - 0xF) |
300 B1 | Получили первый ACK |
300 10 00 02 50 89 | Получили положительный ответ. Байт 0: 0x10 - cчетчик принимаемых пакетов 0 |
740 B1 | Мы отправили первый ACK, что получили ответ |
740 11 00 02 21 01 | Делаем запрос. Байт 0: 0x11 - счетчик отправляемых пакетов 1. Байт 3: 0x21 - запрос параметров. Байт 4: 0x01 - из группы 1 |
300 B2 | Получили второй ACK |
300 22 00 1A 61 01 01 C8 13 | Байт 0: 0x22 - 0b0010 (не последняя строка данных) + 0x02 (cчетчик принимаемых пакетов 2). Байт 1,2: 0x00 0x1A длина 26 байт. Байт 3,4: 0x61 0x01 - положительный ответ на команду запроса параметров 0x21+0x40=0x61 из 0x1 группы. Байт 5: 0х01 - Запрос RPM (соответсвует протоколу KW1281). Байт 6,7: (0xC8 * 0x13)/5 = 760 RPM (формула соответствует протоколу KW1281) |
300 23 05 0A 99 14 32 86 10 | Байт 1: 0x05 - запрос ОЖ. Байт 2,3: (0x0A * 0x99)/26 = 57.0 C. Байт 4: 0x14 = запрос лямбда контроль %. Байт 5,6: 0x32*0x86; Байт 7: 0х10 - двоичная настройка |
300 24 FF BE 25 00 00 25 00 | 0x25 0x00 x00 - Заполнитель, до 8 параметров |
300 15 00 25 00 00 25 00 00 | Байт 0: 0x15 - 0b0001 (последняя строка данных) + 0x5 (счетчик принимаемых пакетов 5) |
740 B5 | Отправляем ACK. Прибывляем к нашему предыдущему ACK количество полученных пакетов 0xB1 + 0x4 = 0xB5 |
300 A3 | Запрос KeepAlive, что мы еще на связи |
740 A1 0F 8A FF 4A FF | Ответ KeepAlive |
740 A8 | Мы разрываем связь |
300 A8 | ЭБУ в ответ тоже разрывает связь |
Во второй версии мобильного приложения VAG Virtual Cockpit появилась возможность диагностировать двигатель и трансмиссию по протоколу VW TP 2.0.
![VAG Virtual Cockpit - экран с данными от двигателя по протоколу VW TP 2.0 VAG Virtual Cockpit - экран с данными от двигателя по протоколу VW TP 2.0](https://habrastorage.org/getpro/habr/upload_files/8ff/8e2/e20/8ff8e2e2060400b977688bdce66c387b.png)
Диагностический адаптер ELM327
Для меня некоторое время было вопросом, как получить данные из CAN шины и передать на телефон. Можно было бы разработать собственный шлюз с Wi-Fi или Bluetooth, как это делают производители сигнализаций, например Starline. Но изучив документацию на популярный автомобильный сканер ELM327 понял, что его можно настроить с помощью AT команд на доступ к CAN шине.
![Копия диагностического сканера ELM327 Копия диагностического сканера ELM327](https://habrastorage.org/getpro/habr/upload_files/d0e/9ef/018/d0e9ef018994c1704af79aa1f830d0c1.jpg)
Не все ELM327 одинаково полезны
Оригинальный ELM327 от компании elmelectronics стоит порядка 50$, в России я таких не встречал в продаже. У нас продаются только китайские копии/подделки, разного качества и цены 10-30$. Бывают полноценные копии, которые поддерживают все протоколы, а бывают и те которые умеют отвечать только на несколько команд, остальные игнорируют, такие адаптеры не имеют доступ к CAN шине. Я например пользуюсь копией Viecar BLE 4.0, который поддерживает 100% всех функций оригинала.
Для работы с протоколом UDS через ELM327 нужно указать адреса назначения, источника и разрешить длинные 8 байтные сообщения, по умолчанию пропускается максимум 7 байт.
Последовательность ELM327 AT команд для работы с UDS по CAN шине:
ATZ // сброс настроек
AT E0 // отключаем эхо
AT L0 // отключаем перенос строки
AT SP 6 // Задаем протокол ISO 15765-4 CAN (11 bit ID, 500 kbaud)
AT ST 10 // Таймаут 10 * 4 мс, иначе EBU шлет повторные ответы каждые 100 мс, а мы не отвечаем, потому что ожидаем конца, а нам нужен только первый ответ
AT CA F0
AT AL // Allow Long (>7 byte) messages
AT SH 7E0 // задаем ID, к кому обращаемся (двигатель)
AT CRA 7E8 // CAN Receive Address. Можно задать несколько 7Xe
AT FC SH 7E0
AT FC SD 30 00 00
AT FC SM 1 // Режим Flow Control 1 должен быть определен после FC SH и FC SD, иначе в ответ придет "?"
03 22 F4 0С 55 55 55 55 // UDS запрос оборотов двигателя
Для работы с протоколом KWP2000 через ELM327 нужно только указать адреса назначения и источника.
Последовательность ELM327 AT команд для работы с VW TP 2.0 по CAN шине:
ATZ // сброс настроек
AT E0 // отключаем эхо
AT L0 // отключаем перенос строки
AT SP 6 // Задаем протокол ISO 15765-4 CAN (11 bit ID, 500 kbaud)
AT PB C0 01
AT SP B // Задаем протокол USER1 CAN (11* bit ID, 125* kbaud)
AT ST 10 // Таймаут 10 * 4 мс, иначе EBU шлет повторные ответы каждые 100 мс, а мы не отвечаем, потому что ожидаем конца, а нам нужен только первый ответ
AT SH 200 // Обращаемся к 200 ID
AT CRA 201 // Ждем ответа от 201 Блок управления двигателем, 202 - Transmission, 203 - ABS, 207 - Приборная панель
01 C0 00 10 00 03 01 // Initiate channel setup with ECU module - 01, request it use CAN ID 0x300; Transmission 02; ABS 03
AT SH 740 // адрес блока 740 получен в ответе на предыдущую команду
AT CRA 300 // Ждем ответа от 300 ID
A0 0F 8A FF 32 FF // Tell ECU module to send 16 packets at a time, and set timing parameters
10 00 02 10 89 // Send KWP2000 startDiagnosticSession request 0x10 with 0x89 as a parameter.
B1 // ACK
11 00 02 1A 9B // Запрос названия блока KWP2000
Мобильное приложение VAG Virtual Cockpit
Для разработки мобильного приложения подключаемого к автомобилю требовалось:
Сниффером собрать трафик от диагностической утилиты VCDS
Изучить работу протоколов UDS, VW TP 2.0, KWP2000
Настроить диагностический сканер ELM327 на работу с UDS и VW TP 2.0
Изучить новый для меня язык программирования Swift
![Мобильное приложение VAG Virtual Cockpit для iOS Мобильное приложение VAG Virtual Cockpit для iOS](https://habrastorage.org/getpro/habr/upload_files/fea/df6/ce9/feadf6ce9b3dbd53da76474168b50346.png)
В итоге получилось приложение, которое сочетает в себе функции отображения точных данных панели приборов и диагностика основных параметров двигателя и трансмиссии.
Пару слов про точность данных. Штатная панель приборов не точно показывает скорость - завышает показания на 5-10 км/ч, стрелка охлаждающей жидкости всегда на 90 °C, хотя реальная температура может быть 80 - 110 °C, стрелка уровня топлива до середины идет медленно, хотя топлива уже меньше половины и при нуле на самом деле топливо еще есть в баке. Производитель это делает для удобства и безопасности водителя.
На данный момент приложение показывает следующие параметры:
Приборная панель | Двигатель | Трансмиссия (температура) |
1) Какая дверь открыта | 1) Обороты | 1) ATF AISIN (G93) |
Я стремлюсь чтобы приложение поддерживало как можно больше моделей автомобилей. Пока что поддерживаются производители: Volkswagen, Skoda, Seat, Audi. На разных комплектациях могут отображаться не все параметры, но это поправимо.
Сейчас я провожу тестирование версии 3.0. Приложение доступно только на iOS, после релиза 3.0 перейду к разработке версии для Android.
Если интересно потестировать и есть желание принять участие в проекте, то установить приложение можно по ссылке. Также я веду бортжурнал на drive2.ru, где делюсь полезной информацией и новостями о VAG Virtual Cockpit.