Как установить приложение + его конфигурацию на множество однотипных устройств? (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?

, 👍2

Обсуждение

для части загрузки: вы можете использовать "Экспорт скомпилированного двоичного файла" в IDE, а затем использовать esptool.py прошить двоичный файл без инструментов Arduino., @Juraj

Спасибо, Юрай. Это помогло., @pepr

Есть даже [приложение для Android](https://play.google.com/store/apps/details?id=com.bluino.esploader), которые можно использовать для загрузки на сайт., @AndreKR


2 ответа


Лучший ответ:

3

Если вы не хотите включать отдельные конфигурационные данные в скетч для каждого местоположения, то для этого есть в основном две возможности:

  • Как это часто бывает с потребительскими устройствами Интернета вещей, вы можете написать код для создания точки доступа с веб-сайтом, где ИТ-персонал может затем подключиться к устройству и настроить его, введя конфигурационные данные на веб-сайт.
  • Вы можете использовать SPIFFS/LittleFS (второй является преемником первого) для создания конфигурационного файла, который затем можно прочитать в начале скетча. Эта файловая система сохраняется во флэш-памяти и может быть записана с помощью дополнительного инструмента.

Я бы выбрал второй вариант. В настоящее время я все еще использую SPIFFS, поэтому я не знаю, будет ли следующее отличаться для LittleFS. Ваши пути могут отличаться (в зависимости от ядра/версии/ОС).

  1. Сначала создайте каталог данных, в который затем поместите файл config.json. Стандарт-это каталог с именем "данные" внутри папки sketch.

  2. Затем вам нужно вызвать 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


1

Обычно я использую BLE для установки учетных данных Wi-Fi.

После того как о Wi-Fi-соединении позаботились, я обычно предоставляю остальные данные конфигурации, имея в локальной сети веб-приложение, которое я перевожу в режим "сопряжения" с MAC-адресом ESP. Затем ESP загружает конфигурацию из веб-приложения. Хотя у меня нет суперсекретных конфигурационных данных, для хорошей меры приложение завершает режим сопряжения после одной загрузки и не будет обслуживать дальнейшие запросы конфигурации.

,