如何在ESP8266上更新代码OTA以保持配置

时间:2019-03-01 23:46:34

标签: arduino esp8266 ota

我有3个基于ESP8266的自制设备。它们每个都针对不同的应用程序,并且它们实际上仅是出于爱好。

有时候,我只是想对代码做些小改动,或者添加新功能,所以我一直在进行Web上的OTA更新。

每个板都有相同的代码,但是每个板都有在代码上定义的唯一ID和可以从Web上的数据库访问的某些唯一配置。理想情况下,我可以更新01号板中的代码,该板将在数据库表中搜索启动时的先前配置,并且一切正常。

问题是,当更改代码时,ID(在代码上定义)丢失了,我不想手动编译3种不同的二进制文件,每块板一个,唯一的区别是ID它们之间。当然,我必须在第一次对该板进行编程时就要做,但是我不想每次更新都这样做。

是否有任何方法可以更新代码OTA,但将ID保留在板上?也许是一种在内存的不可替换部分中写入此ID(甚至其他标志)的方法。

3 个答案:

答案 0 :(得分:0)

为什么不将WiFi mac地址用作唯一ID?

因此,您可以在任何板上更新一些代码,而这不会丢失ID。

答案 1 :(得分:0)

您的ESP8266 has flash memory,即使没有电源也可以持续使用。 ESP8266的固件存储在这里。

您可以使用EEPROM library在闪存中存储少量数据(4到4096字节之间)。 ESP8266没有真正的EEPROM-该库的名称是真正Arduino的保留。在ESP8266上,它只使用闪存的一小部分,并假装是EEPROM。

如果使用EEPROM库,请确保在写入数据后调用const sinon = require("sinon"); /* Import the app module shown above */ const App = require("./app"); describe("forEach", function () { var stubSavePost; before(() => { /* Setup the savePost stub for use in unit test before it runs. Notice the stub is created via the App object that is basically the module.exports object of the app.js module above */ stubSavePost = sinon.stub(App, "savePost"); }); after(() => { /* Restore the original state of your application logic, removing all stubs, etc after unit test complete */ sinon.restore(); }); it("forEach is calling savePost three times", () => { /* Call handlePosts() via the exported App module object in app.js */ App.handlePosts(); /* Use callCount assertion from sinon to verify our savePost stub was called exactly three times */ sinon.assert.callCount(stubSavePost, 3); }); }); EEPROM.commit(),以确保其实际存储在闪存中。这与在Arduino上使用的方式不同,并且Arduino示例通常不会这样做。

您还可以使用SPIFFS library将文件存储在闪存中-您可能只将所有配置信息存储在文件(或EEPROM空间)中,而不是将其保留在数据库中。

答案 2 :(得分:0)

似乎您应该使用NodeMCU固件...您可以只更新Lua脚本OTA并更新模块,而无需重新启动!