error in updating the firmware OTA using LTE module

PuneetMudgal
Posts: 2
Joined: Mon Apr 25, 2022 12:35 pm

error in updating the firmware OTA using LTE module

Postby PuneetMudgal » Mon Apr 25, 2022 12:46 pm

hello everyone,
I'm working on a device in which I'm trying to do Firmware Over the air update of esp32-wroom module,
but i'm using another 4G-LTE module from Quictel (EC200S) to download the bin file from server.

everything looks fine but in the last it gives me error to update as >>Error Occurred. Error #: 6

here is the ota Function i'm using.
please help

Code: Untitled.c Select all



bool FirmwareVersionCheck()
{
bool value;
int httpCode ;
String fwurl = "";
fwurl = URL_fw_Version;
Serial.println(fwurl);
Serial.println();

if (WiFi.status() != WL_CONNECTED)
{
Network_Check_GSM();
if (GSM_Network_STS == true)
{
Serial2.write("AT+QIACT?\r\n");
delay(100);
input = Serial2.readString();
if (input.indexOf("OK") >= 0)
{
Serial.println("GPRS CONNECT SUCCESSFULLY");
Serial.println();
input = Serial2.readString();
input.remove(0);
Serial2.print("AT+QHTTPURL=83,30\r\n");
delay(100);
input = Serial2.readString();
if (input.indexOf("CONNECT") >= 0)
{
Serial2.print(fwurl);
delay(100);
input = Serial2.readString();
if (input.indexOf("OK") >= 0)
{
Serial.println("URL CONNECT SUCCESSFULLY");
Serial.println();
input = Serial2.readString();
input.remove(0);
int count = 0;
Serial2.write("AT+QHTTPGET=30\r\n");
input = Serial2.readString();
while (input.indexOf("+QHTTPGET") < 0)
{
Serial.println("WAITING FOR GET COMMAND RESPONSE");
Serial.println();
if (count >= 5)
{
value = false;
break;
}
count++;
input = Serial2.readString();
}

String GetResponse = input.substring(input.indexOf("+QHTTPGET") + 13, input.indexOf("+QHTTPGET") + 16);
Serial.print("GET RESPONSE IS:");
Serial.println(GetResponse);
Serial.println();
if (GetResponse == "200")
{
Serial.println("GET RESPONSE IS OK");
Serial.println();
input = Serial2.readString();
input.remove(0);
Serial2.write("AT+QHTTPREAD=30\r\n");
while (!Serial2.available())
{
}

while (Serial2.available())
{
String line = Serial2.readStringUntil('\n');
Serial.print("line is:" + line); Serial.println();
line.trim();// remove white/empty space from the line.
if (!line.length())// if the the line is empty,this is end of headers,//break the while and feed the remaining `Serial2` to the Update.writeStream()
{
Serial.println("This Line Was empty");//headers ended
httpResponseLineCount ++;
Serial.println("httpResponseLineCount is :" + String(httpResponseLineCount));
if (httpResponseLineCount == 2)
{
Serial.println("This Line Was empty Two Times");//headers ended
Serial.println("Breaking While() Now");
httpResponseLineCount = 0;
break;
}

}

if (line.startsWith("HTTP/1.1"))// Check if the HTTP Response is 200, else break and Exit Update.
{
if (line.indexOf("200") < 0)
{
Serial.println("Got a non 200 status code from server. Exiting OTA Update.");
break;
}
}

if (line.startsWith("Content-Length: "))// extract headers here, Start with content length
{
contentLength = atol((getHeaderValue(line, "Content-Length: ")).c_str());
Serial.println("Got " + String(contentLength) + " bytes from server");
}

if (line.startsWith("Content-Type: "))// Next, the content type
{
String contentType = getHeaderValue(line, "Content-Type: ");
Serial.println("Got " + contentType + " payload.");
if (contentType == "text/plain")
{
isValidContentType = true;
}
}

}//-------------------------------------while

Serial.println("contentLength : " + String(contentLength) + ", isValidContentType : " + String(isValidContentType));

if (contentLength && isValidContentType)// check contentLength and content type
{
String GetVersion = Serial2.readStringUntil('#');

GetVersion = GetVersion.substring(GetVersion.indexOf("$") + 1, GetVersion.indexOf("#"));
Serial.println("Found Firmware Version is:" + GetVersion);

if (GetVersion == FirmwareVer)
{
Serial.println("Device is already on the latest Firmware Version:" + GetVersion );
value = false;
}

if (GetVersion != FirmwareVer)
{
Serial.println("This is a New Firmware Version" + GetVersion );
value = true;
}
}

else
{
Serial.println("There was no content in the response");
Serial2.flush();
value = false;
}

}

input = Serial2.readString();
input.remove(0);
Serial2.write("AT+QHTTPSTOP\r\n");
delay(100);
input = Serial2.readString();
input.remove(0);
}

else
{
Serial.println("HTTP RESPONSE ERROR");
Serial.println();
input.remove(0);
value = false;
}

}

else
{
Serial.println("URL CONNECT FAILED");
Serial.println();
value = false;
}

}

else
{
Serial.println("GPRS CONNECT FAILED");
Serial.println();
value = false;
}

}

else if (GSM_Network_STS == false)
{
value = false;
}


}

if (WiFi.status() == WL_CONNECTED)
{
WiFiClient * client = new WiFiClient;
if (client)
{
HTTPClient http;
if (http.begin( * client, fwurl))
{
httpCode = http.GET();
Serial.print("HTTP_Code Recieved : ");
Serial.print(httpCode);
Serial.println();
delay(1000);
if (httpCode == HTTP_CODE_OK) // if version received
{
payload = http.getString();
payload = payload.substring(payload.indexOf("$") + 1, payload.indexOf("#"));

Serial.println("Found Firmware Version is: " + payload );
Serial.println();

if (payload == FirmwareVer)
{
Serial.printf("\nDevice is already on the latest Firmware Version:%s\n", payload);
Serial.println();
value = false;
}

else if (payload != FirmwareVer)
{
Serial.println("This is a New Firmware Version: " + payload);
Serial.println();
value = true;
}

}

else
{
Serial.print("Error in Downloading version file:");
Serial.println(httpCode);
Serial.println();
value = false;
}

http.end();
}
delete client;
}

}

return value;
}

//----------------------------------------------------------------------------------

bool DoFirmwareUpdate()
{
Serial.println("<<< ATTENTION !!! DO NOT TURN OFF THE DEVICE... >>>"); Serial.println();
Serial.println("Updating the Device Firmware Now!"); Serial.println();
Serial.println("Please Wait untill the Device Restarts"); Serial.println();
bool value;
String fwurl = "";
fwurl = URL_fw_Bin;
Serial.println(fwurl); Serial.println();

if (WiFi.status() != WL_CONNECTED)
{
Network_Check_GSM();
if (GSM_Network_STS == true)
{
Serial2.write("AT+QIACT?\r\n");
delay(100);
input = Serial2.readString();
if (input.indexOf("OK") >= 0)
{
Serial.println("GPRS CONNECT SUCCESSFULLY");
Serial.println();
input = Serial2.readString();
input.remove(0);
Serial2.print("AT+QHTTPURL=79,30\r\n");
delay(100);
input = Serial2.readString();
if (input.indexOf("CONNECT") >= 0)
{
Serial2.print(fwurl);
delay(100);
input = Serial2.readString();
if (input.indexOf("OK") >= 0)
{
Serial.println("URL CONNECT SUCCESSFULLY");
Serial.println();
input = Serial2.readString();
input.remove(0);
int count = 0;
Serial2.write("AT+QHTTPGET=30\r\n");
input = Serial2.readString();
while (input.indexOf("+QHTTPGET") < 0)
{
Serial.println("WAITING FOR GET COMMAND RESPONSE");
Serial.println();
if (count >= 5)
{
break;
}
count++;
input = Serial2.readString();
}

String GetResponse = input.substring(input.indexOf("+QHTTPGET") + 13, input.indexOf("+QHTTPGET") + 16);
Serial.print("GET RESPONSE IS:");
Serial.println(GetResponse);
Serial.println();
if (GetResponse == "200")
{
Serial.println("GET RESPONSE IS OK");
Serial.println();
input = Serial2.readString();
input.remove(0);
httpResponseLineCount = 0;
Serial2.write("AT+QHTTPREAD=30\r\n");
while (!Serial2.available())
{
}
while (Serial2.available())
{
// read line till /n
String line = Serial2.readStringUntil('\n');
// remove space, to check if the line is end of headers
Serial.print("line:");
Serial.println(line);
line.trim();

// if the the line is empty,
// this is end of headers
// break the while and feed the
// remaining `client` to the
// Update.writeStream();
if (!line.length())
{
Serial.println("This Line Was empty one times");//headers ended
Serial.println("httpResponseLineCount is :" + String(httpResponseLineCount));
if (httpResponseLineCount == 1)
{
Serial.println("This Line Was empty two times");//headers ended
Serial.println("Breaking While() Now");
httpResponseLineCount = 0;
break; // and get the OTA started
}
httpResponseLineCount ++;
//break; // and get the OTA started
}

// Check if the HTTP Response is 200
// else break and Exit Update
if (line.startsWith("HTTP/1.1"))
{
if (line.indexOf("200") < 0)
{
Serial.println("Got a non 200 status code from server. Exiting OTA Update.");
break;
}
}

// extract headers here
// Start with content length
if (line.startsWith("Content-Length: "))
{
contentLength = atol((getHeaderValue(line, "Content-Length: ")).c_str());
Serial.println("Got " + String(contentLength) + " bytes from server");
}

// Next, the content type
if (line.startsWith("Content-Type: "))
{
String contentType = getHeaderValue(line, "Content-Type: ");
Serial.println("Got " + contentType + " payload.");
if (contentType == "application/octet-stream")
{
isValidContentType = true;
}
}

}//-------------------------------------while

Serial.println("contentLength : " + String(contentLength) + ", isValidContentType : " + String(isValidContentType));

// check contentLength and content type
if (contentLength && isValidContentType)
{
// Check if there is enough to OTA Update
bool canBegin = Update.begin(contentLength, 0, 2, 1, NULL);

// If yes, begin
if (canBegin)
{
Serial.println("Begin OTA. This may take 2 - 5 mins to complete. Things might be quite for a while.. Patience!");
// No activity would appear on the Serial monitor
// So be patient. This may take 2 - 5mins to complete
size_t written = Update.writeStream(Serial2);

if (written == contentLength)
{
Serial.println("Written : " + String(written) + " successfully");
}
else
{
Serial.println("Written only : " + String(written) + "/" + String(contentLength) + ". Retry?" );
// retry??
// execOTA();
}

if (Update.end())
{
Serial.println("OTA done!");
if (Update.isFinished())
{
Serial.println("Update successfully completed. Rebooting.");
ESP.restart();
}
else
{
Serial.println("Update not finished? Something went wrong!");
}
}
else
{
Serial.println("Error Occurred. Error #: " + String(Update.getError()));
}
}
else
{
// not enough space to begin OTA
// Understand the partitions and
// space availability
Serial.println("Not enough space to begin OTA");
Serial2.flush();
}
}
else
{
Serial.println("There was no content in the response");
Serial2.flush();
}

}

input = Serial2.readString();
input.remove(0);
Serial2.write("AT+QHTTPSTOP\r\n");
delay(100);
input = Serial2.readString();
input.remove(0);
}

else
{
Serial.println("HTTP RESPONSE ERROR");
Serial.println();
input.remove(0);
value = false;
}

}

else
{
Serial.println("URL CONNECT FAILED");
Serial.println();
value = false;
}

}

else
{
Serial.println("GPRS CONNECT FAILED");
Serial.println();
value = false;
}

input = Serial2.readString();
input.remove(0);
Serial2.write("AT+QIDEACT=1\r\n");
delay(100);
input = Serial2.readString();
input.remove(0);

}

else if (GSM_Network_STS == false)
{
value = false;
}


}

if (WiFi.status() == WL_CONNECTED)
{
WiFiClient client;
t_httpUpdate_return ret = httpUpdate.update(client, URL_fw_Bin);

switch (ret)
{
case HTTP_UPDATE_FAILED:
Serial.printf("HTTP_UPDATE_FAILD Error (%d): %s\n", httpUpdate.getLastError(), httpUpdate.getLastErrorString().c_str());
break;

case HTTP_UPDATE_NO_UPDATES:
Serial.println("HTTP_UPDATE_NO_UPDATES");
break;

case HTTP_UPDATE_OK:
Serial.println("HTTP_UPDATE_OK");
break;
}

}

}

//----------------------------------------------------------------------------------

String getHeaderValue(String header, String headerName)
{
return header.substring(strlen(headerName.c_str()));
}

//----------------------------------------------------------------------------------


PuneetMudgal
Posts: 2
Joined: Mon Apr 25, 2022 12:35 pm

Re: error in updating the firmware OTA using LTE module

Postby PuneetMudgal » Tue Apr 26, 2022 4:24 pm

please help someone.

Who is online

Users browsing this forum: PerplexityBot and 1 guest