为了使用方便把OTA封装一下为以下类
#include "ESP8266HTTPUpdate.h"
class OTA
{
private:
ESP8266HTTPUpdate httpUpdate;
// using HTTPUpdateStartCB = std::function<void()>;
void OnStartCB()
{
Serial.println("开始OTA升级");
}
// using HTTPUpdateEndCB = std::function<void()>;
void OnEndCB()
{
Serial.println("结束OTA升级");
}
// using HTTPUpdateErrorCB = std::function<void(int)>;
void OnErrorCB(int ec)
{
Serial.println("OTA升级错误:" + ec);
}
// using HTTPUpdateProgressCB = std::function<void(int, int)>;
void OnProgressCB(int cur, int total)
{
Serial.println("OTA升级中:" + String(cur) + "/" + String(total));
}
public:
void updateBin()
{
if (CConfigMgr::getSingleton().OTAURL().isEmpty())
{
Serial.println("OTA url为空,无法升级");
return;
}
Serial.println("ota升级,禁止切断电源");
WiFiClient UpdateClient;
httpUpdate.setLedPin(2);
httpUpdate.rebootOnUpdate(true);
httpUpdate.onStart(std::bind(&OTA::OnStartCB, this));
httpUpdate.onEnd(std::bind(&OTA::OnEndCB, this));
httpUpdate.onError(std::bind(&OTA::OnErrorCB, this, _1));
httpUpdate.onProgress(std::bind(&OTA::OnProgressCB, this, _1, _2));
HTTPUpdateResult ret = httpUpdate.update(UpdateClient, CConfigMgr::getSingleton().OTAURL());
switch (ret)
{
case HTTP_UPDATE_FAILED: // 当升级失败
Serial.println("升级失败.");
break;
case HTTP_UPDATE_NO_UPDATES: // 当无升级
Serial.println("无升级.");
break;
case HTTP_UPDATE_OK: // 当升级成功
Serial.println("升级成功.");
break;
}
}
};
当接收到ota命令时直接
OTA ota;
ota.updateBin();
即可.
这里的CConfigMgr是一个单例类它保存了一些从eeprom读取的配置信息其中
CConfigMgr::getSingleton().OTAURL()返回OTA的URL.这个地址可以从巴法云的主题处获取
点击 这里的OTA即可上传固件.上传以后
这里就是需要的URL,这个URL是和当前主题绑定的,即这个主题的OTA url始终是这个.所以你可以写死在代码里,也可以像我一样保存是EEPROM.