234 lines
5.0 KiB
C++
234 lines
5.0 KiB
C++
#include "updatebyme.h"
|
|
#include "SDmanger.h"
|
|
void UpDateClassByme::performUpdate(Stream &updateSource, size_t updateSize)
|
|
{
|
|
if (Update.begin(updateSize))
|
|
{
|
|
Serial.println("Writes : ");
|
|
size_t written = Update.writeStream(updateSource);
|
|
if (written == updateSize)
|
|
{
|
|
Serial.println("Writes : " + String(written) + " successfully");
|
|
}
|
|
else
|
|
{
|
|
Serial.println("Written only : " + String(written) + "/" + String(updateSize) + ". Retry?");
|
|
}
|
|
if (Update.end())
|
|
{
|
|
Serial.println("OTA finished!");
|
|
if (Update.isFinished())
|
|
{
|
|
Serial.println("Restart ESP device!");
|
|
abort();
|
|
}
|
|
else
|
|
{
|
|
Serial.println("OTA not fiished");
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Serial.println("Error occured #: " + String(Update.getError()));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Serial.println("Cannot beggin update");
|
|
}
|
|
}
|
|
|
|
|
|
size_t UpDateClassByme::DownloadFirmwareForurl(String version)
|
|
{
|
|
String url="/weather/firmware/esp32/firmware_"+version+".bin";
|
|
int err = http->get(url.c_str());
|
|
if (err != 0)
|
|
{
|
|
Serial.println(F("Date failed to connect"));
|
|
vTaskDelay(10000);
|
|
return 0;
|
|
}
|
|
int status = http->responseStatusCode();
|
|
if (!status)
|
|
{
|
|
vTaskDelay(10000);
|
|
return 0;
|
|
}
|
|
Serial.print(F("Response status code: "));
|
|
Serial.println(status);
|
|
// SerialMon.println(F("Response Headers:"));
|
|
size_t count=0;
|
|
while (http->headerAvailable())
|
|
{
|
|
String headerName = http->readHeaderName();
|
|
String headerValue = http->readHeaderValue();
|
|
Serial.println("Date: " + headerName + " : " + headerValue);
|
|
if (headerName=="Content-Length")
|
|
{
|
|
count=headerValue.toInt();
|
|
/* code */
|
|
}
|
|
|
|
|
|
}
|
|
Serial.println("lenth is "+String(count));
|
|
if (http->isResponseChunked())
|
|
{
|
|
Serial.println(F("Date The response is chunked"));
|
|
}
|
|
char *str=new char[1000];
|
|
int lent=count/1000;
|
|
File file;
|
|
|
|
file = SD_MMC.open("/update.bin", "wb");
|
|
|
|
for (size_t i = 0; i < lent; i++)
|
|
{
|
|
http->readBytes(str,1000);
|
|
file.write((const byte *)str,1000);
|
|
Serial.print("download ");
|
|
Serial.println(String(i*100/lent));
|
|
/* code */
|
|
}
|
|
http->readBytes(str,count%1000);
|
|
file.write((const byte *)str,count%1000);
|
|
file.flush();
|
|
file.close();
|
|
//performUpdate(*http,cout);
|
|
|
|
|
|
// http->readBytes
|
|
Serial.println("adfasdfsadfsdfsd");
|
|
//Serial.write(str,cout);
|
|
//Serial.println(body.length());
|
|
http->stop();
|
|
return count;
|
|
// return body;
|
|
}
|
|
|
|
void UpDateClassByme::initme(String Version)
|
|
{
|
|
CurrentVersion=Version;
|
|
|
|
}
|
|
void UpDateClassByme::updateversion()
|
|
{
|
|
String Targetversion=GetValueFromNet("/weather/php/upVserion.php",StationID+":"+CurrentVersion);
|
|
}
|
|
bool UpDateClassByme::CheckAndUpdate()
|
|
{
|
|
|
|
|
|
String Targetversion=GetValueFromNet("/weather/php/GetVserion.php",StationID);
|
|
if ( Targetversion=="0"||Targetversion==CurrentVersion||Targetversion=="")
|
|
{
|
|
return true;
|
|
|
|
}
|
|
Serial.println("targetvesion is:"+Targetversion);
|
|
|
|
//size_t countdownload1=375584;
|
|
size_t countdownload1=DownloadFirmwareForurl(Targetversion);
|
|
if (countdownload1<10000)
|
|
{
|
|
return false;
|
|
}
|
|
Serial.println("count download is:"+String(countdownload1));
|
|
|
|
String MD5=GetValueFromNet("/weather/php/GetMD5Value.php",Targetversion);
|
|
|
|
if (MD5=="0")
|
|
{
|
|
return false;
|
|
|
|
}
|
|
|
|
// updater.setMD5(MD5);
|
|
MD5Builder md5my;
|
|
|
|
|
|
File file;
|
|
|
|
file = SD_MMC.open("/update.bin", "rb");
|
|
md5my.begin();
|
|
md5my.addStream(file,countdownload1);
|
|
md5my.calculate();
|
|
String md5com=md5my.toString();
|
|
Serial.println("md5 comput is:"+md5my.toString());
|
|
Serial.println("md5 should is:"+MD5);
|
|
file.close();
|
|
if (MD5==md5com)
|
|
{
|
|
file = SD_MMC.open("/update.bin", "rb");
|
|
performUpdate(file,countdownload1);
|
|
return true;
|
|
/* code */
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
UpDateClassByme::UpDateClassByme(HttpClient *httptm)
|
|
{
|
|
http=httptm;
|
|
StationID="000";
|
|
}
|
|
String UpDateClassByme::GetValueFromNet(String url,String Key)
|
|
{
|
|
|
|
http->beginRequest();
|
|
http->post(url.c_str());
|
|
|
|
|
|
http->sendHeader(HTTP_HEADER_CONTENT_LENGTH, Key.length());
|
|
http->endRequest();
|
|
int err = http->write((const byte *)Key.c_str(), Key.length());
|
|
Serial.print("send date size");
|
|
Serial.println(err);
|
|
|
|
if (err == 0)
|
|
{
|
|
|
|
http->stop();
|
|
return "-1";
|
|
}
|
|
int status = http->responseStatusCode();
|
|
if (!status)
|
|
{
|
|
http->stop();
|
|
return "-1";
|
|
}
|
|
|
|
int length = http->contentLength();
|
|
if (length == 0)
|
|
{
|
|
http->stop();
|
|
return "-1";
|
|
}
|
|
|
|
String body = http->responseBody();
|
|
Serial.println("body:"+body);
|
|
|
|
http->stop();
|
|
return body;
|
|
}
|