Часть 3. Как подключить смартфон к авто — читаем данные
Мы продолжаем цикл статей о том, как подключиться к бортовой системе своего автомобиля ( я делаю перепост своих публикаций с Хабрахабр, здесь см. Начало, Часть 1 и Часть 2) и сегодня расскажем как считывать данные.
Предполагается, что к текущему моменту у нас есть машина с диагностическим разъемом, отвечающим OBD-II стандарту, любимое мобильное устройство (ноутбук, смартфон, планшет) и адаптер на базе ELM327, который позволит соединить машину и мобильное устройство.
Как уже говорилось в предыдущей части, независимо от типа связи между мобильным устройством и адаптером (Bluetooth, Wi-Fi, USB) на логическом уровне, - это последовательное соединение. На программном уровне необходимо открыть Socket соединение между компьютером и адаптером поверх имеющегося соединения нижнего уровня. Практическая программная реализация будет зависеть от операционной системы и типа соединения, примеров можно найти массу под все ваши любимые языки программирования. В качестве базового примера можно брать реализацию соединения на примерах чат-программ для Bluetooth или TCP\IP. В данной статье мы не будем останавливаться подробно на реализации такого соединения, для экспериментов нам хватит возможностей имеющихся программ а-ля Telnet, для экспериментов под Андроид и iOS мы встроили простую командную консоль в наше приложение OBD Car Doctor.
Итак, скачиваем и устанавливаем программу которая позволит установить последовательное соединение с адаптером и предоставить нам командную строку для общения с машиной.
• Для ноутбука с Windows (Linux) можно воспользоваться Putty ,
• для Андроид и iOS можно воспользоваться OBD Car Doctor Android, OBD Car Doctor iOS.Обратите внимание, что на момент публикации статьи на iTunes может еще быть старая версия 1.2, консоль будет доступна в версии 1.3.
После скачивания и установки программ пора брать компьютер (смартфон), адаптер и выдвигаться к машине. Распечатка этой статьи тоже не помешает.
• Убеждаемся, что перед вами ваша машина, и/или, что ее владелец не против жестоких экспериментов с диагностической системой автомобиля.
• Подключаем адаптер к диагностическому разъему (надеюсь, вы подготовились заранее и уже нашли разъем в соответствии с рекомендациями предыдущей части).
• Ключ «на старт», включаем зажигание.
• На адаптере должна загореться лампочка питания, и мы можем продолжать.
Подробнее остановимся на связи с Bluetooth адаптером, как наиболее популярном и распространенном типе адаптеров.
В разделе Устройства производим поиск новых устройств (на некоторых адаптерах нужно нажать кнопочку для того чтобы устройство обнаруживалось), после обнаружения устройства и ввода пин кода устройство появится в общем списке.
Смотрим на свойства, вкладка Оборудование
Теперь свойства Последовательного порта.
Видим и запоминаем, что Последовательное подключение Bluetooth мапится на порт COM3. Если есть необходимость, меняем на другой порт. Теперь запускаем Putty и настраиваем программу на работу с определенным на предыдущем шаге COM портом (в примере с COM3).
Итак, вводим имя COM порта, скорость 9600, тип Serial и кликаем Open для открытия терминального окна.
1. Подключите Bluetooth адаптер к OBD-II разъему вашего автомобиля (о нем и его расположении мы писали в Части 2). Убедитесь, что лампочка на адаптере зажглась.
2. Запустите двигатель автомобиля
3. Зайдите в окружение Bluetooth на Вашем смартфоне: «Настройки» > Bluetooth и запустите поиск Bluetooth устройств, найдите OBD II адаптер, он должен появиться в списке устройств как 'scantool','obdkey','plx ...','cbt' или что-то похожее. Выберите адаптер. Он предложит произвести спряжение устройств.
4. Произведите сопряжение устройств. Устройство попросит секретный код сопряжения, как правило: 1234 или 0000.
5. Перейдите в приложение OBD Car Doctor на своем смартфоне.
6. В Настройках в пункте BT соединение выбираем имя адаптера с которым ранее произвели сопряжение.
7. В Настройках в разделе Тест устанавливаем галочку в опции Консоль. Возвращаемся на главную страницу, кликаем Подключить и после успешного подключения выбираем пункт Консоль (данная функция доступна начиная с версии OBD Car Doctor Android 2.22).
1. Подключите OBD-II Wi-Fi адаптер к OBD-II разъему вашего автомобиля. Запустите двигатель автомобиля и дождитесь зеленого свечения на Wi-Fi адаптере.
2. На своем iPhone устройстве перейдите в Настройки (Settings), выберите подключиться к сети Wi-Fi. После подключения к Wi-Fi, перейдите в расширенные настройки и установите:
Адрес IP: Статический
Адрес IP: 192.168.0.11
Маска подсети: 255.255.255.0
Выберите имя устройства для подключения Wi-Fi. Выйдите из настроек.
3. Перейдите в приложение OBD Car Doctor > Настройки (Settings), где настройте следующее:
IP Адрес: 192.168.0.10
Порт: 35000
Кликните «Сохранить» и «Выйти»
4. Запустите двигатель.
5. Перейдите в приложение OBD Car Doctor на своем смартфоне. В Настройках в разделе Тест устанавливаем галочку в опции Консоль. Возвращаемся на главную страницу, кликаем Подключить и после успешного подключения выбираем пункт Консоль (данная функция доступна начиная с версии OBD Car Doctor iOS 1.3, выход которой ожидается в ближайшее время).
По завершению описанных действий вы готовы вводить команды и получать ответы от диагностической системы автомобиля. Естественно работать с консолью в движении не очень удобно и не безопасно даже для пассажира. Поэтому экспериментировать предлагаем на заведенной, но удобно припаркованной машине.
Выше мы упомянули, что команды подразделяются на 2 типа: команды управления адаптером и собственно OBD-II команды. Обычно команды управления начинаются с последовательности AT, в то время как OBD-II команды состоят только из шестнадцатеричных цифр.
• набираем ATZ и нажимаем Enter (или кнопку Отправить). Если на адаптере есть питание и связь с ним была установлена, мы должны увидеть ответную строку:
ELM 327 v1.3a >
Или что-то похожее, в зависимости от используемого контроллера и версии прошивки адаптера. ATZ - является командой инициализации и выполняет перезагрузку адаптера.
• Следующей командой может быть команда установки протокола, вводим команду ATSP0, в ответ мы должны получить
ATSP0 OK >
Команда ATSP0 не устанавливает непосредственно протокол взаимодействия адаптера с автомобилем, это специальная команда, которая устанавливает автоматический режим определения протокола адаптером. Для непосредственного поиска и установления связи мы должны послать OBD-II команду.
• Отправляем команду 0100 (которая расшифровывается как MODE 01, PID 00), в случае успеха мы должны получить что-то вроде
0100 Searching…
41 00 XX XX XX XX >
Где X может быть любой шестнадцатеричной цифрой.
• пробелы могут игнорироваться как в командах так и в ответах; наличие или отсутствие пробелов в ответе управляется отдельной командой ATS{0|1}
• в ответе может присутствовать или отсутствовать эхо (т.е. повтор команды, как в приведенном выше примере); наличие или отсутствие пробелов в ответе управляется отдельной командой ATE{0|1}
• сам ответ на команду содержит модифицированное значение команды, а именно (mode+0x40)(PID), т.е. положительный ответ на команду 0100, должен начинаться с 4100.
0100 SEARCHING...
UNABLE TO CONNECT >
или
0100 SEARCHING...
NO DATA >
...
Подобные ответы означают, что адаптеру не удалось автоматически определить протокол связи с авто.
Вместо автоматического поиска протокола можно явно установить номер протокола, поддерживаются шестнадцатеричные номера от 1 до C.
1 - SAE J1850 PWM
2 - SAE J1850 VPW
3 - ISO 9142-2
4 - ISO 14230-4 KWP (5 baud init)
5 - ISO 14230-4 KWP (fast init)
6 - ISO 15765-4 CAN (11 bit, 500 Kbaud)
7 - ISO 15765-4 CAN (29 bit, 500 Kbaud)
8 - ISO 15765-4 CAN (11 bit, 250 Kbaud)
9 - ISO 15765-4 CAN (29 bit, 250 Kbaud)
A - SAE J1939 CAN (29 bit, 250 Kbaud)
B - USER1 CAN (11 bit, 125 Kbaud)
C - USER2 CAN (11 bit, 50 Kbaud)
Например, для явного установления связи по протоколу ISO 9142-2 набираем команду ATSP3, получаем в ответ ATSP3 OK >
И проверяем результативность командой 0100, опять же в случае успеха ожидаем увидеть
0100 Searching…
01 00 41 00 XX XX XX XX >
Если видим что-то другое, вроде
0100 BUS INIT:
…ERROR
Что значит - связь по данному протоколу не установлена.
Для тестирования и установления протокола связи может использоваться любая поддерживаемая автомобилем OBD-II команда, но рекомендуется использовать именно 0100, поскольку она должна поддерживаться производителем в соответствии со стандартом. Данная команда должна возвращать информацию о поддержке PID c 01 по 20 для MODE 01.
Напомним, что MODE 01 отвечает за чтение динамических параметров автомобиля (скорость, обороты, температуры и т.д.) в реальном времени. Соответственно, прочитав ответ на 0100, который содержит информацию о том, какие из PID c 01 по 20 (шестнадцатеричные) поддерживаются. Для расшифровки мы должны конвертировать шестнадцатеричное представление числа в бинарное, при этом позиция бита (от старшего к младшему) соответствует номеру PID (от 01 до 20).
Например, ответ содержащий 80 00 00 00 = 1000 0000 0000 0000 0000 0000.
Означает поддержку единственного PID, а именно 01.
Сейчас вы можете прочитать ответ вашего автомобиля на команду 0100 и узнать номера всех команд (PID) поддерживаемых в вашем автомобиле. Обратите внимание, что если поддерживается команда 0120, то отправив ее, можно прочитать номера поддерживаемых PID в диапазоне 21 – 40 и т.д., т.е. 0100, 0120, … 01D0, которые отвечают за определение номеров всех поддерживаемых команд в MODE 01.
Чтобы закрепить полученные знания, предлагаем выполнить еще одну простую команду и разобрать результат. Если вы расшифровали ответ команды 0100 и получили, что PID 0C поддерживается, отправим команду 010C (обороты двигателя), ответ должен быть в виде:
01 0C 41 0C 0B B8 >
Для получения значения в оборотах в минуту, необходимо полученный ответ (0B B8 = 3000) разделить на 4, т.е. получаем 750 об/мин.
Список поддерживаемых стандартом команд и формулы преобразования можно найти здесь.
Пока вы экспериментируете с отправкой различных команд, а также получением и расшифровкой значений, мы будем готовить следующую часть(и), в которой затронем вопросы работы с несколькими бортовыми контроллерами, что нужно знать о хедерах команд, чтение и сброс ошибок, для чего используются другие MODE, «почти OBD-II», а также другие темы, которые могут вас заинтересовать.
Предполагается, что к текущему моменту у нас есть машина с диагностическим разъемом, отвечающим OBD-II стандарту, любимое мобильное устройство (ноутбук, смартфон, планшет) и адаптер на базе ELM327, который позволит соединить машину и мобильное устройство.
Как уже говорилось в предыдущей части, независимо от типа связи между мобильным устройством и адаптером (Bluetooth, Wi-Fi, USB) на логическом уровне, - это последовательное соединение. На программном уровне необходимо открыть Socket соединение между компьютером и адаптером поверх имеющегося соединения нижнего уровня. Практическая программная реализация будет зависеть от операционной системы и типа соединения, примеров можно найти массу под все ваши любимые языки программирования. В качестве базового примера можно брать реализацию соединения на примерах чат-программ для Bluetooth или TCP\IP. В данной статье мы не будем останавливаться подробно на реализации такого соединения, для экспериментов нам хватит возможностей имеющихся программ а-ля Telnet, для экспериментов под Андроид и iOS мы встроили простую командную консоль в наше приложение OBD Car Doctor.
Итак, скачиваем и устанавливаем программу которая позволит установить последовательное соединение с адаптером и предоставить нам командную строку для общения с машиной.
• Для ноутбука с Windows (Linux) можно воспользоваться Putty ,
• для Андроид и iOS можно воспользоваться OBD Car Doctor Android, OBD Car Doctor iOS.Обратите внимание, что на момент публикации статьи на iTunes может еще быть старая версия 1.2, консоль будет доступна в версии 1.3.
После скачивания и установки программ пора брать компьютер (смартфон), адаптер и выдвигаться к машине. Распечатка этой статьи тоже не помешает.
• Убеждаемся, что перед вами ваша машина, и/или, что ее владелец не против жестоких экспериментов с диагностической системой автомобиля.
• Подключаем адаптер к диагностическому разъему (надеюсь, вы подготовились заранее и уже нашли разъем в соответствии с рекомендациями предыдущей части).
• Ключ «на старт», включаем зажигание.
• На адаптере должна загореться лампочка питания, и мы можем продолжать.
Подробнее остановимся на связи с Bluetooth адаптером, как наиболее популярном и распространенном типе адаптеров.
Windows:
В разделе Устройства производим поиск новых устройств (на некоторых адаптерах нужно нажать кнопочку для того чтобы устройство обнаруживалось), после обнаружения устройства и ввода пин кода устройство появится в общем списке.
Смотрим на свойства, вкладка Оборудование
Теперь свойства Последовательного порта.
Видим и запоминаем, что Последовательное подключение Bluetooth мапится на порт COM3. Если есть необходимость, меняем на другой порт. Теперь запускаем Putty и настраиваем программу на работу с определенным на предыдущем шаге COM портом (в примере с COM3).
Итак, вводим имя COM порта, скорость 9600, тип Serial и кликаем Open для открытия терминального окна.
Android:
1. Подключите Bluetooth адаптер к OBD-II разъему вашего автомобиля (о нем и его расположении мы писали в Части 2). Убедитесь, что лампочка на адаптере зажглась.
2. Запустите двигатель автомобиля
3. Зайдите в окружение Bluetooth на Вашем смартфоне: «Настройки» > Bluetooth и запустите поиск Bluetooth устройств, найдите OBD II адаптер, он должен появиться в списке устройств как 'scantool','obdkey','plx ...','cbt' или что-то похожее. Выберите адаптер. Он предложит произвести спряжение устройств.
4. Произведите сопряжение устройств. Устройство попросит секретный код сопряжения, как правило: 1234 или 0000.
5. Перейдите в приложение OBD Car Doctor на своем смартфоне.
6. В Настройках в пункте BT соединение выбираем имя адаптера с которым ранее произвели сопряжение.
7. В Настройках в разделе Тест устанавливаем галочку в опции Консоль. Возвращаемся на главную страницу, кликаем Подключить и после успешного подключения выбираем пункт Консоль (данная функция доступна начиная с версии OBD Car Doctor Android 2.22).
iOS:
1. Подключите OBD-II Wi-Fi адаптер к OBD-II разъему вашего автомобиля. Запустите двигатель автомобиля и дождитесь зеленого свечения на Wi-Fi адаптере.
2. На своем iPhone устройстве перейдите в Настройки (Settings), выберите подключиться к сети Wi-Fi. После подключения к Wi-Fi, перейдите в расширенные настройки и установите:
Адрес IP: Статический
Адрес IP: 192.168.0.11
Маска подсети: 255.255.255.0
Выберите имя устройства для подключения Wi-Fi. Выйдите из настроек.
3. Перейдите в приложение OBD Car Doctor > Настройки (Settings), где настройте следующее:
IP Адрес: 192.168.0.10
Порт: 35000
Кликните «Сохранить» и «Выйти»
4. Запустите двигатель.
5. Перейдите в приложение OBD Car Doctor на своем смартфоне. В Настройках в разделе Тест устанавливаем галочку в опции Консоль. Возвращаемся на главную страницу, кликаем Подключить и после успешного подключения выбираем пункт Консоль (данная функция доступна начиная с версии OBD Car Doctor iOS 1.3, выход которой ожидается в ближайшее время).
По завершению описанных действий вы готовы вводить команды и получать ответы от диагностической системы автомобиля. Естественно работать с консолью в движении не очень удобно и не безопасно даже для пассажира. Поэтому экспериментировать предлагаем на заведенной, но удобно припаркованной машине.
Выше мы упомянули, что команды подразделяются на 2 типа: команды управления адаптером и собственно OBD-II команды. Обычно команды управления начинаются с последовательности AT, в то время как OBD-II команды состоят только из шестнадцатеричных цифр.
Итак, наша первая команда:
• набираем ATZ и нажимаем Enter (или кнопку Отправить). Если на адаптере есть питание и связь с ним была установлена, мы должны увидеть ответную строку:
ELM 327 v1.3a >
Или что-то похожее, в зависимости от используемого контроллера и версии прошивки адаптера. ATZ - является командой инициализации и выполняет перезагрузку адаптера.
• Следующей командой может быть команда установки протокола, вводим команду ATSP0, в ответ мы должны получить
ATSP0 OK >
Команда ATSP0 не устанавливает непосредственно протокол взаимодействия адаптера с автомобилем, это специальная команда, которая устанавливает автоматический режим определения протокола адаптером. Для непосредственного поиска и установления связи мы должны послать OBD-II команду.
• Отправляем команду 0100 (которая расшифровывается как MODE 01, PID 00), в случае успеха мы должны получить что-то вроде
0100 Searching…
41 00 XX XX XX XX >
Где X может быть любой шестнадцатеричной цифрой.
Здесь обратим внимание на несколько моментов:
• пробелы могут игнорироваться как в командах так и в ответах; наличие или отсутствие пробелов в ответе управляется отдельной командой ATS{0|1}
• в ответе может присутствовать или отсутствовать эхо (т.е. повтор команды, как в приведенном выше примере); наличие или отсутствие пробелов в ответе управляется отдельной командой ATE{0|1}
• сам ответ на команду содержит модифицированное значение команды, а именно (mode+0x40)(PID), т.е. положительный ответ на команду 0100, должен начинаться с 4100.
В случае неудачи ответы могут быть следующими:
0100 SEARCHING...
UNABLE TO CONNECT >
или
0100 SEARCHING...
NO DATA >
...
Подобные ответы означают, что адаптеру не удалось автоматически определить протокол связи с авто.
Вместо автоматического поиска протокола можно явно установить номер протокола, поддерживаются шестнадцатеричные номера от 1 до C.
1 - SAE J1850 PWM
2 - SAE J1850 VPW
3 - ISO 9142-2
4 - ISO 14230-4 KWP (5 baud init)
5 - ISO 14230-4 KWP (fast init)
6 - ISO 15765-4 CAN (11 bit, 500 Kbaud)
7 - ISO 15765-4 CAN (29 bit, 500 Kbaud)
8 - ISO 15765-4 CAN (11 bit, 250 Kbaud)
9 - ISO 15765-4 CAN (29 bit, 250 Kbaud)
A - SAE J1939 CAN (29 bit, 250 Kbaud)
B - USER1 CAN (11 bit, 125 Kbaud)
C - USER2 CAN (11 bit, 50 Kbaud)
Например, для явного установления связи по протоколу ISO 9142-2 набираем команду ATSP3, получаем в ответ ATSP3 OK >
И проверяем результативность командой 0100, опять же в случае успеха ожидаем увидеть
0100 Searching…
01 00 41 00 XX XX XX XX >
Если видим что-то другое, вроде
0100 BUS INIT:
…ERROR
Что значит - связь по данному протоколу не установлена.
Для тестирования и установления протокола связи может использоваться любая поддерживаемая автомобилем OBD-II команда, но рекомендуется использовать именно 0100, поскольку она должна поддерживаться производителем в соответствии со стандартом. Данная команда должна возвращать информацию о поддержке PID c 01 по 20 для MODE 01.
Напомним, что MODE 01 отвечает за чтение динамических параметров автомобиля (скорость, обороты, температуры и т.д.) в реальном времени. Соответственно, прочитав ответ на 0100, который содержит информацию о том, какие из PID c 01 по 20 (шестнадцатеричные) поддерживаются. Для расшифровки мы должны конвертировать шестнадцатеричное представление числа в бинарное, при этом позиция бита (от старшего к младшему) соответствует номеру PID (от 01 до 20).
Например, ответ содержащий 80 00 00 00 = 1000 0000 0000 0000 0000 0000.
Означает поддержку единственного PID, а именно 01.
Сейчас вы можете прочитать ответ вашего автомобиля на команду 0100 и узнать номера всех команд (PID) поддерживаемых в вашем автомобиле. Обратите внимание, что если поддерживается команда 0120, то отправив ее, можно прочитать номера поддерживаемых PID в диапазоне 21 – 40 и т.д., т.е. 0100, 0120, … 01D0, которые отвечают за определение номеров всех поддерживаемых команд в MODE 01.
Чтобы закрепить полученные знания, предлагаем выполнить еще одну простую команду и разобрать результат. Если вы расшифровали ответ команды 0100 и получили, что PID 0C поддерживается, отправим команду 010C (обороты двигателя), ответ должен быть в виде:
01 0C 41 0C 0B B8 >
Для получения значения в оборотах в минуту, необходимо полученный ответ (0B B8 = 3000) разделить на 4, т.е. получаем 750 об/мин.
Список поддерживаемых стандартом команд и формулы преобразования можно найти здесь.
Пока вы экспериментируете с отправкой различных команд, а также получением и расшифровкой значений, мы будем готовить следующую часть(и), в которой затронем вопросы работы с несколькими бортовыми контроллерами, что нужно знать о хедерах команд, чтение и сброс ошибок, для чего используются другие MODE, «почти OBD-II», а также другие темы, которые могут вас заинтересовать.
Интересно?
Да
28
70.0%
Нет
6
15.0%
Я об этом знал (ла)
6
15.0%
проголосовало 40 пользователей
>ATSP0
Вспомнились AT-команды инициализации модемов из диалапно-BBSного прошлого. Ностальгия.
Чувакам которые занимаются постройкой корчей, тюнингом двигателя и тд - с ними все понятно :)
Кстати, когда серьёзно тюнингуют машину, часто приходится покупать другой мозг, а с ним по obd уже не пообщаешься.
99% населения кадабры айтишники же.
Скриншот ScanMaster-ELM под Windows
Или этот топик согласованный рекламный для OBD Car Doctor? Ну тогда извините.
т.е. ты читаешь номера ошибок и лезешь на форумы смотреть, что с ними делать и уже сервисмены тебя не смогут развести))
Да и вообще ошибки там только типичные.
Я сам, кстати, только недавно стал эту штуковину осваивать, попозже может пост накатаю. Обратил внимание на то, что через ноут весьма проблематично устанавливать подключение - надо обязательно немного поплясать с бубном чтобы заработало. Через мобилу с Torque все ок, но хочется чтобы больше параметров показывало (видимо некоторые PIDы производителем прописаны не по OBD стандарту) и хочется чтобы задержки были поменьше (хотя на это наверное уже никак не повлиять).
Если надо - заделюсь :)
например у меня приборная панель установлена с бортовым компьтером встроенным и она использует сигнал K-line
а я бы еще хотел параллельно использовать коммуникатор ...
+ приборка и мозги связаны (прописаны друг в друге). вообщем там не все так просто)))