Перейти к содержимому

Пакетная компиляция проектов PlatformIO

Добрый день, уважаемый читатель! Сегодня я поведаю вам по секрету, как легко и просто скомпилировать два десятка проектов PlatformIO за полчаса без труда и забот. Причем не обязательно это должны быть проекты ESP-IDF, это могут быть вполне и проекты под популярный в народе фреймворк Arduino, главное чтобы они были созданы в PlatformIO, а не в ArduinoIDE.

 

Лично у меня проекты после отладки, прошивки и установки созданного устройства на постоянное место работы не остаются в замороженном состоянии. Довольно часто я добавляю новые функции в общие библиотеки, либо исправляю найденные проблемы и ошибки, либо и то и другое.

После внесения каких-либо изменений проект, разумеется, нужно заново перекомпилировать и “залить” новую прошивку в устройство. Для удаленного обновления прошивки я использую технологию ОТА, что в переводе на русский язык означает “обновление по воздуху”, то есть без необходимости физического подключения к устройству. Но для этого требуется иметь скомпилированный двоичный файл прошивки, который для проектов на PlatformIO обычно называется firmware.bin.

Пока у вас один-два-три проекта, нет никаких проблем поочередно открыть проекты в Visual Studio Code, нажать кнопку “Build” и дождаться завершения компиляции. Но когда количество активных проектов перевалило за десяток, это стало превращаться в проблему. Мало того, что переключение проектов вручную напрягает, так еще сам VSCode при этом изрядно подтормаживает, каждый раз заново загружая ядро PlatfromIO и обновляя индексы IntelliSence. Требуется способ комплексной компиляции всех проектов поочередно, без вмешательства человека.

Для решения поставленной задачи я использовал набор из нескольких командных файлов, в простонародье “батников”, которые выполняют следующие задачи:

  • компиляция проекта и создание файла firmware.bin
  • загрузка скомпилированного файла прошивки по FTP-на хостинг для отправки на удаленные устройства через ОТА

Всё это выполняется “одним кликом мышки” и без необходимости моего вмешательства в процесс. Остается только отправить соответствующие команды на устройства для того, чтобы они скачали и установили новые прошивки с хостинга.

Предложенный в статье способ, отлично подходит в том случае, если изменения вносились в код, общий для всех проектов одновременно – например в библиотеки, иначе проще скомпилировать проект вручную. Но нет предела вашей фантазии – вы можете подкорректировать его и для других целей.

 


Компиляция проекта из командной строки windows

В PlatformIO за всю непосредственную работу конкретно отвечает файл pio.exe, который по умолчанию можно найти в каталоге вашего профиля ${env:USERPROFILE}\.platformio\penv\Scripts (впрочем, знать расположение этого файла не строго обязательно, но пригодится):

Пакетная компиляция проектов PlatformIO

Как видите, pio.exe имеет довольно много команд, которые можно использовать через командную строку, но в данном случае нас интересует только одна единственная команда – pio run. Эта команда имеет собственные опции, которые можно использовать (и я их иногда реально использую, удобно же):

Пакетная компиляция проектов PlatformIO

Для того, чтобы скомпилировать проект, то есть выполнить полный аналог кнопки “build” в IDE, необходимо выполнить всего два простых шага:

  • перейти в каталог проекта, то есть там, где находится файл platfromio.ini
  • запустить команду pio run без дополнительных опций

Впрочем, можно сократить эти две команды до одной, если передать в команду pio run путь к каталогу проекта через опцию –project-dir.

В процессе работы вы увидите все те же самые сообщения, которые обычно выводятся в терминале SC Code в нижней части экрана. Ничего нового.

Ну и не забудьте проверить код возврата – так вы сможете отловить ситуации, когда что-то пошло не так.

Где найти скомпилированный файл?

После того, как команда будет завершена, готовый файл с прошивкой вы сможете найти в каталоге %prj_dir%\.pio\build\%prj_obj%\firmware.bin, где:

  • %prj_dir% – каталог проекта, то есть тот каталог, в котором расположен файл platfromio.ini
  • %prj_obj% – название секции устройства в platfromio.ini, для которого производится компиляция, например esp32dev

 

Загрузка прошивки в устройство через командную строку

А можно сразу прошить файл в подключенное к COM или USB порту устройство из командной строки, то есть выполнить аналог команды upload?

Можно! Для этого выполните следующую команду:

platformio.exe run –target upload

Разумеется, перед этим вы должны физически подключить прошиваемый микроконтроллер к компьютеру. Но это не наш способ.

Совет: когда вы запускаете в VS Code ту или иную команду PlatformIO, первой выходной строкой в терминале будет эта самая команда. Так вы сможете узнать все необходимые команды для ваших целей, без необходимости долгого изучения справочных материалов.

Командный файл для компиляции проекта

Учитывая всё вышесказанное, я создал такой вот батничек, который и решает нужную мне задачу:

Пакетная компиляция проектов PlatformIO

⚠️ В первом (и единственном) параметре %1 в данный батник должен быть передан относительный каталог проекта. В моем случае все проекты находятся в каталоге c:\PlatformIO – скорректируйте это под вашу корневую папку проектов.

  • В строках 3-7 формируется полный путь к каталогу проекта и проверяется его наличие.
  • В строке 11 переходим в каталог проекта
  • В строке 12 запускаем компиляцию проекта
  • В строке 13 проверяем, завершилась ли компиляция успешно. Если результат отличен от нуля, значит что-то пошло не так – выходим из пакетного файла с кодом -1
  • Если всё хорошо, в строках 17-19 вызываем другой командный файл, который загружает скомпилированный bin-файл на сервер по протоколу SFTP. Об этом кратенько поговорим ниже.

Компиляция проектов согласно утвержденного списку

Осталось вызывать этот пакетный файл для каждого проекта, например так:

Пакетная компиляция проектов PlatformIO

Команда start /WAIT …. запускает другой батник в отдельном окне и контексте с ожиданием завершения. Впрочем, здесь с успехом можно применить другую команду – call …

В конце не забудьте добавить команду pause, дабы можно было визуально проконтролировать проблемы при компиляции отдельных проектов.

 


Загрузка файла по SFTP на хостинг

Для того, чтобы удаленное устройство вне вашей локальной сети, смогло скачать созданный на предыдущем этапе firmware.bin, мы должны загрузить его на некий промежуточный сервер в сети интернет, который будет доступен и вам, и прошиваемому устройству.

Если вы хотите перепрошить через OTA устройство, которое подключено к той же самой сети, что и ваш компьютер, то в принципе можно обойтись и без промежуточного сервера, при определенной сноровке и приготовлениях. Но в моем случае этот способ категорически не подходит.

 

⚠️ Для ОТА обновления нам понадобится любой HTTPS-сервер (обязательно HTTPS, так как ESP32, например, откажется скачивать прошивку по незащищенному протоколу) с поддержкой прямых ссылок на файл. Это важно, поэтому всякие Яндекс.Диски, Гуголь диски, Dropbox и прочие подобные сервисы нам не подходят – так как в них ссылка на файл на самом деле ведет на некую промежуточную страницу, а прямая ссылка выдается сервером в момент непосредственного скачивания. Выцепить прямую ссылку теоретически возможно, но очень сложно, поэтому я этот способ не использую.

Я использую тот же виртуальный хостинг, на котором расположен мой сайт https://kotyara12.ru, а затем передаю ссылку на файл на устройство через служебный MQTT-топик. Получившее адрес файла устройство скачивает файл прошивки и загружает его себе на специальный раздел flash-памяти, а затем запускается с этого раздела. Так и происходит удаленное обновление прошивки в любой сети.

Итак, нам нужно загрузить скомпилированный на предыдущем этапе файл куда-то на сетевой ресурс по FTP или SFTP. В стандартном наборе команд windows такой команды нет. Но на помощь нам приходит популярная программа WinScp, которая позволяет легко работать с FTP-серверами, в том числе и из командной строки. Я не буду здесь подробно расписывать её работу, приведу лишь пример командного файла из своих примеров:

Пакетная компиляция проектов PlatformIO

  • В строках 3-6 формируются значения внутренних переменных, необходимых для работы
  • В строках 12-16 в специальную папку проекта копируется elf-файл, который может понадобится для расшифровки backtrace (о том, как это сделать, я уже писал на этом канале). Я храню последние три elf-файла
  • Ну а в последней строке 22-25 (на самом деле это читается коммандным процессором как одна строка, так как ^ экранирует символ переноса строки) идет собственно загрузка файла на хостинг в специально созданную для этого папку. Разумеется, имя папки в этом примере изменено.

И таки да, имя пользователя и пароль доступа придется прописать в этом батнике “в открытую”, поэтому в примере они были заменены на пару user:password – подставьте свои значения, если это необходимо.

После выполнения этого батника скомпилированный файл будет загружен в папку на сайте, откуда его можно уже отправить на устройство для обновления. Разными способами. но об этом как-нибудь в другой раз.

 

На этом всё, благодарю за внимание. На самом деле эта статья – всего лишь еще одна подготовительная ступенька к теме ОТА, которую я обещал некоторым своим читателям.

? Архив статей, упорядоченный по категориям ?


Пожалуйста, оцените статью:
[ 0 из 5, всего 0 оценок ]

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *