Как обновить код OTA на ESP8266, сохранив конфигурацию

Имею 3 самодельных устройства на базе ESP8266. Каждый из них предназначен для разных приложений, и все они действительно только для хобби.

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

Каждая плата имеет один и тот же код, но каждая имеет уникальный идентификатор, определенный в коде, и некоторую уникальную конфигурацию, к которой они могут получить доступ из базы данных в Интернете. В идеале я мог бы обновить код на плате № 01, эта плата будет искать в таблице базы данных предыдущую конфигурацию при запуске, и все будет работать нормально.

Проблема в том, что при изменении кода идентификатор (который определяется в коде) теряется, и я не хочу вручную компилировать 3 разных двоичных файла, по одному для каждой платы, с идентификатором как единственной разницей между ними. Конечно, я должен сделать это в первый раз, когда программирую эту доску, но я не хочу делать это при каждом обновлении.

Есть ли способ обновить код OTA, но сохранить ID на плате? Возможно, способ записать этот идентификатор (или даже другие флаги) в незамещенный раздел памяти.


person vinyluis    schedule 01.03.2019    source источник
comment
В каком фреймворке или среде разработки вы работаете? Ардуино? MicroPython? Lua? FreeRTOS? Что-то другое?   -  person romkey    schedule 02.03.2019
comment
Я работаю со средой Arduino   -  person vinyluis    schedule 02.03.2019


Ответы (3)


Ваш ESP8266 имеет флэш-память, которая сохраняется даже без питания. Здесь хранится прошивка для ESP8266.

Можно использовать библиотеку EEPROM для хранения небольших объемов данных (между 4 и 4096 байт) во флеш-памяти. ESP8266 не имеет настоящего EEPROM - название этой библиотеки унаследовано от истинного Arduinos. На ESP8266 он использует небольшую часть флэш-памяти и делает вид, что это EEPROM.

Если вы используете библиотеку EEPROM, убедитесь, что вы вызываете EEPROM.commit() или EEPROM.end() после записи данных, чтобы убедиться, что они действительно хранятся во флэш-памяти. Это отличается от того, как он используется на Arduinos, и примеры Arduino обычно этого не делают.

Вы также можете использовать библиотеку SPIFFS для хранения файлов во флеш-памяти - вы можете просто сохранить всю информацию о конфигурации в файле (или в пространстве EEPROM), а не хранить ее в своей базе данных.

person romkey    schedule 02.03.2019
comment
Это похоже на то, что мне нужно. Я посмотрю, как это работает для меня, затем вернусь сюда и скажу результаты. - person vinyluis; 03.03.2019
comment
Сработало нормально, это было именно то, что мне было нужно. Большое спасибо! - person vinyluis; 31.03.2019
comment
Это красивое и проверенное решение. Единственное, о чем вы должны позаботиться, это то, что EEPROM не имеет бесконечных перезаписей. Я сохраняю подпись, что в первый раз не существует, поэтому я пишу в EEPROM, а во всех остальных случаях читаю только идентификатор устройства, потому что сигматура существует. Другое решение - прочитать определенный байт из EEPROM перед записью и игнорировать, если он равен. - person Christos Themelis; 30.07.2019

почему вы не используете MAC-адрес WiFi в качестве уникального идентификатора?

Так что вы можете обновить какой-то код на любых досках, и при этом не потерять ID.

person JoaoLopesF    schedule 02.03.2019
comment
Возможно, я захочу обновить доску из места за пределами моей локальной сети - person vinyluis; 02.03.2019
comment
MAC-адрес - это постоянный аппаратный адрес. Это не изменится, когда вы будете в другой сети. IP-адрес будет. - person romkey; 03.03.2019
comment
Я помню, как устанавливал MAC-адрес прямо в коде, и ставил что-то случайное. Должен ли я узнать настоящий MAC-адрес на оборудовании и использовать его тогда? - person vinyluis; 03.03.2019
comment
Если у вас нет очень конкретной причины для изменения MAC-адреса вашей платы (не IP-адреса), вы почти наверняка должны позволить плате использовать свой аппаратный MAC-адрес и не изменять его. - person romkey; 03.03.2019
comment
Я удалил новый MAC-адрес из кода. Я привел его из примеров скетчей и не стал сомневаться. Спасибо. - person vinyluis; 31.03.2019
comment
MAC-адрес - не лучший вариант в случае замены устройства. Лучше всего хранить идентификатор в EEPROM. - person Christos Themelis; 30.07.2019

Похоже, вам следовало использовать прошивку NodeMCU ... Вы можете просто обновить свои сценарии Lua OTA и обновить свои модули даже без перезагрузки!

person poorandunlucky    schedule 06.03.2019