Как установить приложение + его конфигурацию на множество однотипных устройств? (ESP32)
Быть новичком в области Arduino... Имея больше устройств, как я могу загрузить некоторые параметры конфигурации после загрузки кода? Возможно ли это?
Ситуация: У меня есть простое приложение для ESP32 с простым датчиком. Он будет использоваться во многих физических местах. Каждая локация имеет свой собственный Wi-Fi со своим SSID и паролем. ИТ-специалист в этом месте должен иметь возможность каким-то образом задать параметры конфигурации. Я хотел бы изучить возможности-выбрать то, что более подходит.
Отдельная компиляция и загрузка: если я правильно понимаю, я могу использовать компиляцию arduino-cli ...
скомпилировать скетч в двоичный файл, а затем загрузить arduino-cli ...
чтобы поместить двоичный файл в устройство. Таким образом, я могу подготовить множество устройств с точно таким же двоичным контентом. (Если я правильно понимаю, то arduino-cli config ...
предназначен для настройки среды разработки, а не для настройки приложения на плате.)
Конфигурация: я заметил существование библиотеки предпочтений Arduino (Preferences.h
). Я понимаю, как использовать его изнутри кода приложения. Можно ли загрузить нужные настройки на плату так же, как и скетч? (Наверное, нет, но спрашиваю, чтобы быть уверенным.)
Я также заметил существование облегченной файловой системы (SPIFFS
) и возможность создания (скажем) /config.json
на устройстве из кода приложения. Существует плагин для Arduino IDE,который появляется как новый инструмент (.../tool/esp32fs.jar
). Затем подкаталог data/
создается в каталоге sketch, и его содержимое может быть загружено другой командой IDE. Это кажется хорошим способом загрузить конфигурацию в моем случае; однако ...
Есть ли какая-либо альтернатива командной строке для загрузки данных конфигурации таким образом? Можно ли загрузить один файл или необходимо стереть всю область файловой системы и загрузить все содержимое каталога data/
like?
@pepr, 👍2
Обсуждение2 ответа
Лучший ответ:
Если вы не хотите включать отдельные конфигурационные данные в скетч для каждого местоположения, то для этого есть в основном две возможности:
- Как это часто бывает с потребительскими устройствами Интернета вещей, вы можете написать код для создания точки доступа с веб-сайтом, где ИТ-персонал может затем подключиться к устройству и настроить его, введя конфигурационные данные на веб-сайт.
- Вы можете использовать SPIFFS/LittleFS (второй является преемником первого) для создания конфигурационного файла, который затем можно прочитать в начале скетча. Эта файловая система сохраняется во флэш-памяти и может быть записана с помощью дополнительного инструмента.
Я бы выбрал второй вариант. В настоящее время я все еще использую SPIFFS, поэтому я не знаю, будет ли следующее отличаться для LittleFS. Ваши пути могут отличаться (в зависимости от ядра/версии/ОС).
Сначала создайте каталог данных, в который затем поместите файл config.json. Стандарт-это каталог с именем "данные" внутри папки sketch.
Затем вам нужно вызвать
mkspiffs
, чтобы создать двоичный образ для вашей папки данных. Я делаю это так:~/.arduino15/packages/esp32/tools/mkspiffs/0.2.3/mkspiffs -c ./data -d 5 -b 4096 -s 0x170000 -p 256 ${file_path}/spiffs_image.bin
{file_path}
- это путь к папке sketch для меня. Таким образом, изображение помещается непосредственно рядом с скетчем. Параметры означают следующее (я также вставлю страницу справки команды ниже):-d 5 --> Уровень отладки на максимуме (идет от 0 до 5) -b 4096 --> размер блока в байтах -s 0x170000 --> размер изображения в байтах -p 256 --> размер страницы в байтах -c ./data --> каталог данных
Вы можете получить эту информацию, когда посмотрите на подробный вывод в Arduino IDE при загрузке файловой системы через инструмент. Они зависят от вашей платы и используемых вами настроек (в основном от схемы разделов).
Затем вы можете загрузить файл изображения через
esptool.py
:~/.arduino15/packages/esp8266/tools/python3/3.7.2-post1/python3 ~/.arduino15/packages/esp32/hardware/esp32/1.0.5/tools/esptool.py --port /dev/ttyUSB0 --baud 921600 --before default_reset --after hard_reset write_flash 0x290000 ${file_path}/spiffs_image.bin
0x290000
-это позиция во флэш-памяти, куда должны быть записаны данные. Это также зависит от вашей схемы разделов, и она также должна появиться на выходе Arduino IDE, откуда вы можете ее скопировать. Обратите внимание, что здесь я ссылаюсь на версию python, которая поставляется с ядром ESP32.
Это отлично работает для моей платы ESP32 (используя Wemos LOLIN32 с "Стандартной" схемой разделов). Теперь вам нужно будет придумать подходящий рабочий процесс. Вы можете иметь отдельные каталоги данных и изображения для каждого местоположения. Или вы можете изменять файл каждый раз, когда вызываете приведенные выше команды (вы даже можете сделать это в скрипте).
Вот справочный вывод mkspiffs
:
~/.arduino15/packages/esp32/tools/mkspiffs/0.2.3/mkspiffs --help
USAGE:
/home/christian/.arduino15/packages/esp32/tools/mkspiffs/0.2.3/mkspiffs
{-c <pack_dir>|-u <dest_dir>|-l|-i}
[-d <0-5>] [-a] [-b <number>] [-p
<number>] [-s <number>] [--]
[--version] [-h] <image_file>
Where:
-c <pack_dir>, --create <pack_dir>
(OR required) create spiffs image from a directory
-- OR --
-u <dest_dir>, --unpack <dest_dir>
(OR required) unpack spiffs image to a directory
-- OR --
-l, --list
(OR required) list files in spiffs image
-- OR --
-i, --visualize
(OR required) visualize spiffs image
-d <0-5>, --debug <0-5>
Debug level. 0 means no debug output.
-a, --all-files
when creating an image, include files which are normally ignored;
currently only applies to '.DS_Store' files and '.git' directories
-b <number>, --block <number>
fs block size, in bytes
-p <number>, --page <number>
fs page size, in bytes
-s <number>, --size <number>
fs image size, in bytes
--, --ignore_rest
Ignores the rest of the labeled arguments following this flag.
--version
Displays version information and exits.
-h, --help
Displays usage information and exits.
<image_file>
(required) spiffs image file
И для esptool.py
:
~/.arduino15/packages/esp8266/tools/python3/3.7.2-post1/python3 ~/.arduino15/packages/esp32/hardware/esp32/1.0.5/tools/esptool.py --help
usage: esptool [-h] [--chip {auto,esp8266,esp32,esp32s2beta}] [--port PORT]
[--baud BAUD]
[--before {default_reset,no_reset,no_reset_no_sync}]
[--after {hard_reset,soft_reset,no_reset}] [--no-stub]
[--trace] [--override-vddsdio [{1.8V,1.9V,OFF}]]
[--connect-attempts CONNECT_ATTEMPTS]
{load_ram,dump_mem,read_mem,write_mem,write_flash,run,image_info,make_image,elf2image,read_mac,chip_id,flash_id,read_flash_status,write_flash_status,read_flash,verify_flash,erase_flash,erase_region,version,get_security_info}
...
esptool.py v2.9-dev - ESP8266 ROM Bootloader Utility
positional arguments:
{load_ram,dump_mem,read_mem,write_mem,write_flash,run,image_info,make_image,elf2image,read_mac,chip_id,flash_id,read_flash_status,write_flash_status,read_flash,verify_flash,erase_flash,erase_region,version,get_security_info}
Run esptool {command} -h for additional help
load_ram Download an image to RAM and execute
dump_mem Dump arbitrary memory to disk
read_mem Read arbitrary memory location
write_mem Read-modify-write to arbitrary memory location
write_flash Write a binary blob to flash
run Run application code in flash
image_info Dump headers from an application image
make_image Create an application image from binary files
elf2image Create an application image from ELF file
read_mac Read MAC address from OTP ROM
chip_id Read Chip ID from OTP ROM
flash_id Read SPI flash manufacturer and device ID
read_flash_status Read SPI flash status register
write_flash_status Write SPI flash status register
read_flash Read SPI flash content
verify_flash Verify a binary blob against flash
erase_flash Perform Chip Erase on SPI flash
erase_region Erase a region of the flash
version Print esptool version
get_security_info Get some security-related data
optional arguments:
-h, --help show this help message and exit
--chip {auto,esp8266,esp32,esp32s2beta}, -c {auto,esp8266,esp32,esp32s2beta}
Target chip type
--port PORT, -p PORT Serial port device
--baud BAUD, -b BAUD Serial port baud rate used when flashing/reading
--before {default_reset,no_reset,no_reset_no_sync}
What to do before connecting to the chip
--after {hard_reset,soft_reset,no_reset}, -a {hard_reset,soft_reset,no_reset}
What to do after esptool.py is finished
--no-stub Disable launching the flasher stub, only talk to ROM
bootloader. Some features will not be available.
--trace, -t Enable trace-level output of esptool.py interactions.
--override-vddsdio [{1.8V,1.9V,OFF}]
Override ESP32 VDDSDIO internal voltage regulator (use
with care)
--connect-attempts CONNECT_ATTEMPTS
Number of attempts to connect, negative or 0 for
infinite. Default: 7.
Спасибо @chrisl. Кажется, это именно то, что мне нужно. :), @pepr
Обычно я использую BLE для установки учетных данных Wi-Fi.
После того как о Wi-Fi-соединении позаботились, я обычно предоставляю остальные данные конфигурации, имея в локальной сети веб-приложение, которое я перевожу в режим "сопряжения" с MAC-адресом ESP. Затем ESP загружает конфигурацию из веб-приложения. Хотя у меня нет суперсекретных конфигурационных данных, для хорошей меры приложение завершает режим сопряжения после одной загрузки и не будет обслуживать дальнейшие запросы конфигурации.
- esp32 Stack canary watchpoint срабатывает
- Будет ли .ino-скетч ардуино компилироваться непосредственно на GCC-AVR?
- Ошибка A fatal error occurred: Failed to connect to ESP32: Wrong boot mode detected (0x13)! The chip needs to be in download mode. [upload] Error 2
- Почему функция server.on() из "ESPAsyncWebServer.h" выполняется на стороне setup(), а не на стороне loop()?
- Загрузка данных SPIFFS в Arduino IDE 2.0.0-rc3 (ESP32 & TTGO) - Ubuntu
- ESP32 отправляет данные на другой ESP32 без установления соединения Wi-Fi
- Как записать и прочитать из файла SPIFFS как данные объекта на ESP8266
- ESP32 в Arduino IDE: определите тип платы в коде (макрос препроцессора)
для части загрузки: вы можете использовать "Экспорт скомпилированного двоичного файла" в IDE, а затем использовать esptool.py прошить двоичный файл без инструментов Arduino., @Juraj
Спасибо, Юрай. Это помогло., @pepr
Есть даже [приложение для Android](https://play.google.com/store/apps/details?id=com.bluino.esploader), которые можно использовать для загрузки на сайт., @AndreKR