Comments 11
И вопрос, ради которого я, честно говоря, и пишу:
ELM за шесть долларов плюс Pyren или PyClip читают Рено вдоль и поперек.
Кариста с тем же адаптером читает и позволяет частично что-то менять в Шкоде.
Я даже и не знаю, что сказать. Пирен вроде даже не скрывает кода.
В точку, и возразить нечем. Проверял я на одном клоне — том, что представляется как v1.5. Написал «обойти нельзя», а честно было бы «на этом обойти не вышло».
Полез смотреть Pyren после вашего комментария и наткнулся на неприятную для себя вещь. В версии для компьютера у меня с самого начала была лестница из трёх способов заставить адаптер дочитать длинный ответ: ATCRA и адаптер справляется сам; ATCRA плюс вручную заданный кадр разрешения; сырые кадры, где разрешение шлёт сама программа. А в Android-порт я эту лестницу просто не перенёс — приложение получало первый кадр и сдавалось. Заметить было нечем: заглушка в обоих случаях отдавала только первый кадр, разницы не видно. Нашлось только сверкой кода с кодом, и повод посмотреть дал ваш комментарий.
Теперь лестница есть в обеих версиях, и в журнал пишется, какой способ сработал, вроде «0x70A: длинный ответ дочитан — адаптер справился сам (ATCRA)». Мой клон по-прежнему не умеет, доходит до третьей ступени и там встаёт.
Если тот адаптер, которым Pyren читает Рено, у вас под рукой — скажите, что на плате написано и что он отвечает на ATI. Хочу собрать список «какой адаптер что умеет»: такого списка нигде нет, а вопрос «какой ELM327 брать» задают постоянно. Пока в списке одна строка, и та отрицательная.
Планируется ли портирование на андроид?
Уже не планируется — уже лежит. Kotlin и Compose, не обёртка над питоновской версией, протокол переписан.
Исходники: https://github.com/gdm0991/vagdiag/tree/main/android-app
Готовый APK: https://github.com/gdm0991/vagdiag/releases
Ради чего вообще стоило делать: Bluetooth-адаптеры. Из браузера к ним не подобраться, из Termux тоже, а в бардачке у большинства лежит именно такой. Wi-Fi и USB через OTG тоже есть, но USB живьём проверить не смог — кабеля у меня нет.
Чтобы не было завышенных ожиданий: полный цикл приложение прошло пока через программную заглушку адаптера, на двух телефонах — Redmi Note 13 (Android 15) и Mi 11 Lite (Android 13). На живой машине компьютерная версия обкатана куда лучше. Поставите и что-то отвалится — заводите issue, мне это сейчас полезнее всего.
А почему бы не использовать VAG-KKL, VAG-COM или что-то подобное?
Предназначение ELM327 все же считать основные параметры двигателя и сбросить ошибку у тысячи различных авто с телефона.
А для нормальной работы с машинами есть диагностические сканеры
Спорить не буду: для регулярной работы нормальный сканер быстрее и удобнее.
Задача была другая. При плавающем контакте сканер отвечает на вопрос «есть ли ошибка», а мне нужно было «в какой момент она появляется, когда я шевелю вот этот кусок жгута». Для такого нужен самописец: сидит в цикле, пищит на изменение счётчика, пишет CSV с метками времени. Второй мотив менее уважительный — было интересно, сколько можно выжать из железки за шестьсот рублей. Оказалось, меньше, чем хотелось, и статья в основном про то, где именно упираешься.
VAG-KKL — это K-line, на Polo Sedan с CAN он бы не помог. VCDS хорош, но у меня его нет, а покупать ради одного перебитого провода не хотелось.
Автор, спасибо за статью. Однако на хабр заходишь за человеческими текстами, которые писал человек, в своем собственном авторском стиле. После прочтения этой статьи остался осадок будто пообщался с claude/gpt - это не исправление ошибок нейронкой в готовом тексте, тут реально половина статьи нейронкой написана.
Но буду объективен. Технические несоответствия:
Сама последовательность специально короткая:
ATZ,ATE0(выключить эхо),ATSP6(ISO 15765-4, CAN 11 бит, 500 кбит/с),ATCAF1. Всё. Каждая лишняя команда — риск получить пустоту вместо ответа.
В тексте выше у вас 4 команды. В гите в методе Elm327.init - 9 штук. Плюс _recover добавляет поверх еще 2 штуки, но это уже мелочи.
Либо если речь о сбросе идет (reset_state), то там тоже больше 4 команд - 7 штук или более.
Elm327.init

Оставался вопрос: какой из восьми датчиков
В коде задкументированы "все четыре задних датчика" и нет упоминания передних, если подразумевается что остальные 4 спереди. Либо LLM-ка выдумала +4 датчика?
Скрытый текст

PAD = 0xAA
В тексте статьи у вас "заполнитель" 0xAA, но на гите 0x00 - это прям разные байты. И в целом гит и статья будто бы расходятся.
Статья:
PAD = 0xAA # заполнитель; блок его игнорирует
def build_single_frame(payload: bytes) -> bytes:
if len(payload) > 7:
raise ValueError("не помещается в одиночный кадр")
frame = bytes([len(payload)]) + payload
return frame + bytes([PAD]) * (8 - len(frame))Гит:
def build_single_frame(payload):
"""Собирает одиночный кадр ISO-TP из полезной нагрузки, с добиванием до 8 байт."""
frame = bytes([len(payload)]) + payload
return frame.ljust(8, b"\x00")Универсальный раздел OBD-II — на любом автомобиле с 2001 года
Подушню, есть машины 2001-2002 годов как минимум без OBD2. Тот же "патруль" например ( Nissan Patrol Y61 3.0 ZD30, 2002–2004). Наличие 16-пинового разъема не гарантирует поддержку OBD2. Полная поддержка пришла уже позже.
Далее ничего технического, чисто наблюдения:
OBD-II обязан покрывать только то, что влияет на выбросы
Какие именно выбросы в данном контексте имеются ввиду? Выбросы данных - все равно по контексту не подходит.
обе руки заняты сканером, а не жгутом
...
Руки свободны, хронология остаётся на диске
В руках жгут, руки заняты.
а на самом деле это интерфейс к блоку двигателя с боковым режимом «покажу сырые кадры, дальше сам»
Что такое "боковой режим"? С автомобилями и CAN знаком, но не понимаю этой формулировки.
Байт типа отказа говорит, что блок увидел электрически.
увидел электрически - это как? Это ведь явно не технический сленг.
Как итог: человек с аналогичной проблемой будет вынужден разбираться с нейрослопом вместо реального "дебага".
Статья "от себя" и без LLM на условном drive2 была бы куда более полезна, чем обилие галюцинаций.
Спасибо за разбор. Открыть гит и сверить с текстом — это больше, чем я мог рассчитывать, и по делу почти всё.
Про нейросеть отвечу сразу, иначе остальное будет выглядеть отпиской. Да, текст я писал с языковой моделью. И расхождения, которые вы нашли, вылезли ровно там, где я диктовал по памяти вместо того, чтобы открыть файл. Это не оправдание, это причина: сверялся бы с кодом — девять команд не превратились бы в четыре.
Команды инициализации. Ваша правда. pdc_core.py, строки 229–238: ATZ, дальше ATE0, ATL0, ATS0, ATH1, ATSP6, ATCAF1, ATAT0, ATST32. В _recover сверху ещё ATCF000 и ATCM000. Хуже, чем просто неточность: три из них прямо про тему статьи. Без ATH1 не видно, с какого адреса пришёл ответ, и весь разговор про смещение теряет смысл. ATAT0 стоит вместо ATAR намеренно — в статье про это есть, а в списке команд нет. Кто повторил бы за мной, получил бы другое поведение адаптера и не понял почему.
PAD. Тоже ваша. Рабочий путь — pdc_core.py, строка 512, добивка нулями. 0xAA живёт в pdc_diag.py, строка 1224, в третьем способе с сырыми кадрами: я там проверял, отличает ли блок мою добивку от заводской — VAG добивает AA. Не отличает, длина берётся из первого байта. В статью значение уехало из эксперимента и было выдано за рабочее.
Восемь датчиков против четырёх. Тут противоречия нет, но виноват всё равно я — не объяснил. Датчиков восемь: четыре в переднем бампере, четыре в заднем. Отключаешь по одному бамперу за раз, поэтому в подсказке четыре. Формулировку в menu.py уже поправил, в статью допишу.
На любом автомобиле с 2001 года — ошибка, и ваш Patrol ровно тот случай. Правильно: в США OBD-II обязателен с 1996, в Европе EOBD для бензиновых с 2001 и для дизелей с 2004, а у машин с других рынков разъём на месте, а режимов нет. В README и в pdc_obd.py уже исправлено, в Android-версии тоже.
Выбросы — выхлопные. OBD-II затевался как экологическое требование, и обязательные режимы покрывают то, что влияет на состав выхлопа. Написал так, что вышла загадка.
Руки — поймали. Со сканером руки заняты сканером, с регистратором — жгутом, и это не «свободные руки». Имел в виду, что не надо одновременно смотреть в экран и щупать проводку.
Боковой режим и увидел электрически — крыть нечем, я это сам сочинил, и никому оно не помогло. Первое означало, что ELM327 сделан прежде всего как интерфейс к блоку двигателя, а сырые кадры отдаёт постольку-поскольку. Второе — что байт типа отказа описывает электрику цепи: обрыв, замыкание, а не логическую ошибку. Так и напишу.
Ещё одно, чего вы не писали, но что всплыло из комментария 200sx_Pilot: «обойти невозможно» сказано слишком широко. Проверял-то я на одном клоне.
Правки внесу сегодня отдельным разделом с датой, чтобы ваш комментарий не повис в воздухе. Вечера мне это стоило, но сэкономит больше.
наименование ELM327 гарантирует... да наверно практически ничего: сколь я помню там полно неоригиналов с очень разной степенью совместимости. это закрытая soc со своим промежуточным протоколом который пытаются эмулировать. так что да это тот случай когда "все свое" гораздо лучше
Да, и я на этом ровно и попался: решил, что ELM327 — это спецификация. А это марка, которую переписали кто во что горазд, и совместимость проверяется только опытом.
Отсюда практический вывод, до которого я дошёл поздно: сравнивать адаптеры надо не по надписи, а по поведению. Программа теперь перебирает три способа дочитать длинный ответ и пишет в журнал, какой сработал. Если такие строчки собирать от разных людей, сложится таблица «плата — прошивка — что умеет». Пока в ней одна строка, и та отрицательная.
Про «всё своё» согласен целиком. SLCAN-адаптер, у которого логики транспортного уровня нет вообще, снял вопрос за вечер и стоит столько же.
ELM327 не дочитывает ответы блоков кузова: доказательство подмены кадра и обход