Что происходит когда у Вас гаджет на колесах с одной стороны, и Вы уже окрыленные тем, что Arduino скетчи Blink и Hello_world у Вас получилось запустить? Правильно, приходит мысль, как это можно соединить.
![](https://habrastorage.org/getpro/habr/upload_files/af0/371/636/af03716363082170b7dd15ca403ba16d.jpg)
Но тут скорее не баловства ради, а нужны насущной для. Я как опытный владелец Tesla и китайских авто уже и жизни себе не представляю без возможности удаленно управлять своим авто с телефона и использовать его как ключ. Но нежданно не гаданно тут и сказочки конец, Вы вне региона обслуживания...
Что такое мастер-аккаунт?
Китайцы из Zeekr, он же Lynk&Co, он же Geely, он же Volvo, он же Гога, он же Гоша, он же Юрий...решили перестать принимать запросы от аккаунтов, которые находятся вне Китая. Использование VPN, DNS тоже не всегда помогает, а подключить новое устройство или передать права управления на другой номер телефона и вовсе сродни чуду.
Естественно в данной ситуации пришла мысль уйти от этой зависимости. Русификация не единственная проблема, с которой сталкивается владелец китайского авто.
Нам необходим микроконтроллер, который будет в роли шлюза, получать данные с нашего сервера и отправлять их по CAN, а так же считывать данные с нужных нам адресов и отправлять их на сервер. По сути это и есть самая сложная часть нашей системы. Приложение для Android или iOS написать на flutter намного проще, чем понять, что, как и куда отправлять.
Слушаем CAN
Разбивая задачу на подзадачи, не ради умещения спринта иноземного в скрам заморский, а для упрощения понимания процесса и макетирования из того, что есть в холодильнике. Берем любой CAN сниффер, например CAN Hacker, в моем случае, в память о моей долгой работе с Tesla я взял PCan, именно его Tesla рекомендует для работы и он сразу подтягивается в Tesla toolbox, он и попался под рукой.
![](https://habrastorage.org/getpro/habr/upload_files/f6f/72b/605/f6f72b6053ff7f5bef0a67f6d9cf66c4.png)
Далее один из самых сложных процессов, так как в машине постоянно переписываются значения в CAN понять без информации, где именно заряд батарей, а где открытое окно крайне сложно. Выполняя одно и тоже действия, записываем лог и находим закономерности.
![](https://habrastorage.org/getpro/habr/upload_files/df2/fb4/6e4/df2fb46e42a0f43ed3383202089daff5.png)
Долгие часы в машине с выполнением монотонных действий и записи лога.
![](https://habrastorage.org/getpro/habr/upload_files/f68/6a3/88c/f686a388c2e40559c4b48afa6152a016.jpg)
Для тестов мы соединялись непосредственно в порт ODB, но в дальнейшем нужную CAN шину можно найти в любом удобном месте в авто.
![](https://habrastorage.org/getpro/habr/upload_files/5c9/7cb/474/5c97cb474faa086e235e5f8ee4419dea.jpg)
Когда у нас есть понимание, что откуда читать и что изменять для открытия двери или выставления термостата системы охлаждения приступаем к следующему шагу.
Arduino+MCP2515CAN
![](https://habrastorage.org/getpro/habr/upload_files/737/3b9/c80/7373b9c80e13755a36971d61bb88a102.jpg)
Есть возможность работать с двумя CAN шинами одновременно.
![](https://habrastorage.org/getpro/habr/upload_files/1fb/a5a/b4e/1fba5ab4e6e4d14c267b177bbaaa5365.jpg)
#include <mcp2515.h> // Подключаем библиотеку mcp2515
#define button 8 // Указываем к какому выводу подключена кнопка
struct can_frame canMsg;
MCP2515 mcp2515(10);
void setup()
{
pinMode(button, INPUT); // Устанавливаем вывод, как вход
digitalWrite(button, HIGH); // Включаем подтягивающий резистор
Serial.begin(115200); // Открываем последовательную связь
mcp2515.reset(); // Перегружаем mcp2515
mcp2515.setBitrate(CAN_125KBPS); // Устанавливается скорость на 125 кбит\с
mcp2515.setNormalMode();
canMsg.can_id = 0x0F6;
canMsg.can_dlc = 1;
}
void loop()
{
int buton_1 = digitalRead(button); // Считывает значение с кнопки
// Если HIGH выполняем функцию
if (buton_1 == HIGH)
{
canMsg.data[0] = 0x20;
mcp2515.sendMessage(&canMsg);
}
// Если LOW выполняем функцию
else if (buton_1 == LOW)
{
canMsg.data[0] = 0x10;
mcp2515.sendMessage(&canMsg);
}
delay(1000);
}
Код Arduino для примера, чтобы показать, что самое сложное это знать ID и значение, которое следует отправить. Остальное только технический момент.
Серверная часть
Сервер для макета написали на mosquitto mqtt.
MQTT (Message Queuing Telemetry Transport) работает на основе публикации-подписки (publish-subscribe) модели коммуникации. В этой модели устройства могут публиковать сообщения на определенные темы (topics), а другие устройства могут подписываться на эти темы, чтобы получать эти сообщения.
Вот как работает процесс в MQTT:
Устройство, которое хочет отправить сообщение, становится издателем (publisher) и публикует сообщение на определенную тему.
Другие устройства, которые заинтересованы в получении сообщений на эту тему, становятся подписчиками (subscribers) и подписываются на эту тему.
Когда издатель публикует сообщение на тему, MQTT брокер (broker) получает это сообщение и распространяет его всем подписчикам, которые подписаны на эту тему.
Подписчики получают сообщение и могут обработать его соответствующим образом.
Суть общения в нашем случае максимально простая:
Arduino обращается с частотой 5 Гц и получает один бит, есть команда или нет. Если нет, засыпает.
Если команда есть, обращаемся за получением команды.
Приложение для телефона обращается для изменения параметра или запрашивает чтение определенного параметра с авто.
Приложение для телефона
Для прототипа использовали flutter, накидали простейший дизайн в figma. Это лишь черновой вариант для теста.
![](https://habrastorage.org/getpro/habr/upload_files/da8/33a/4f2/da833a4f2d750c58fbb9774ed25c6749.jpg)
Вопрос безопасности и прочие проблемы
Тут же приходит на ум вопрос безопасности и это большая проблема. В текущем варианте скомпрометрировать устройство очень просто для открытия авто. Планируем общение с ключом шифрования.
Незащищенный канал общения между автомобилем и сервером системы невероятно опасен, открывая множество возможностей для злоумышленников. Вот некоторые из главных рисков:
Угон автомобиля:
Перехват сигнала: Злоумышленник может перехватить сигнал между автомобилем и сервером, получить доступ к системе сигнализации и отключить ее, а затем открыть автомобиль и угнать его.
Подделка сигнала: Злоумышленник может подделать сигнал, заставляя систему сигнализации думать, что он - это легитимный владелец. Это позволит ему открыть автомобиль, завести его и уехать.
Взлом системы:
Доступ к данным: Злоумышленник может получить доступ к данным автомобиля, хранящимся на сервере, включая информацию о местоположении, пробеге, истории обслуживания и т.д.
Управление автомобилем: В некоторых случаях, злоумышленник может получить доступ к системам управления автомобилем, таким как блокировка двигателя или тормозная система, что позволяет им дистанционно саботировать автомобиль.
Вымогательство: Злоумышленник может заблокировать автомобиль и потребовать выкуп за его разблокировку.
Шпионаж: Злоумышленник может следить за местоположением автомобиля и использовать эту информацию для незаконных целей.
Я надеюсь Вам интересна тема прошивки и доработки китайских авто, напишите в комментариях какие еще аспекты интересно было бы осветить. С уважением, Вячеслав. Сотрудник компании Provolta.
Комментарии (19)
beho1der
29.07.2024 14:24+1Можно использовать уже готовые устройства с CAN и GSM, как сделал evolute(используют vega). При этом уже у вас будет серверный софт с оптимизированным протоколом,достаточно будет только перенести CAN команды и связать со своим приложением.
fokin91
29.07.2024 14:24+1Там тоже не просто, пишу как разработчик этой системы. Для прототипа - рановато Вега. Там пришлось часть хардкодить в прошивку, что бы это хорошо работало. Хотя какой то минимальный функционал можно реализовать. Кстати к автору, на зикре еще аналоговые выходы нужны под аварийку и гудок, так что к арудинке надо будет еще пару полевых транзисторов приделать.
sdegtyarev
29.07.2024 14:24У меня есть собственной разработки плата на esp32 с can и дисплеем (ну и WiFi/BT, понятно дело) и автомобильным питанием.
webzuweb Автор
29.07.2024 14:24Можете дать для теста?
sdegtyarev
29.07.2024 14:24А есть без дисплея, но с LTE-модемом, наверное такая больше подойдёт(но их собранных нет, хотя комплектуха вся есть). Киньте контакт tg.
m0tral
29.07.2024 14:24+1Тут уже давно назрел вопрос, когда уже CAN начнут шифровать) вот чтобы был полный секьюред) и все только по подписке))
Artemka86
29.07.2024 14:24Прям шифрование с того момента как начнется внедрение след. поколения сетей CAN. Весь трафик не будет конечно шифроваться, но ключевые моменты прямо или косвенно связанные с безопасностью - точно будут, во всяком случае будущая технология имеет такую возможность в базе. Простые методы защиты от, например, спуфинга и некорректных данных используются давно в виде счетчиков и хитрых алгоритмов CRC.
zuek
29.07.2024 14:24По прочтении статьи закрались сомнения - если CAN-шина настолько всемогущая и вездесущая, не пользуются ли ею злоумышленники?.. Беглый гуглёж показал, что пользуются.
PolarWolf
29.07.2024 14:24Все уже придумано до нас) Большинство охранных комплексов в той или иной мере для большинства тачек такое реализуют - к тому же, неся финансовую гарантию на секурность. Не знаю как они работают с зикрами правда, но скорее всего рано или поздно научатся. Климатом, конечно, удаленно не поуправляешь (если только не через автоматизации, которые, в принципе, есть), но все остальное есть
ignatfomenko
Здесь лучше думаю ESP32 взять, у нее wifi на борту есть. Просто подойти и с телефона с ней связаться. Конечно все по каналу с шифрованием.
webzuweb Автор
Конечно же продукт будет сделан совершенно на другой базе. Это прототип для проверки идеи.
diaskzn
Вы OVMS изобретаете?