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
  1.  
  2. bool FirmwareVersionCheck()
  3. {
  4.   bool value;
  5.   int httpCode ;
  6.   String fwurl = "";
  7.   fwurl = URL_fw_Version;
  8.   Serial.println(fwurl);
  9.   Serial.println();
  10.  
  11.   if (WiFi.status() != WL_CONNECTED)
  12.   {
  13.     Network_Check_GSM();
  14.     if (GSM_Network_STS == true)
  15.     {
  16.       Serial2.write("AT+QIACT?\r\n");
  17.       delay(100);
  18.       input = Serial2.readString();
  19.       if (input.indexOf("OK") >= 0)
  20.       {
  21.         Serial.println("GPRS CONNECT SUCCESSFULLY");
  22.         Serial.println();
  23.         input = Serial2.readString();
  24.         input.remove(0);
  25.         Serial2.print("AT+QHTTPURL=83,30\r\n");
  26.         delay(100);
  27.         input = Serial2.readString();
  28.         if (input.indexOf("CONNECT") >= 0)
  29.         {
  30.           Serial2.print(fwurl);
  31.           delay(100);
  32.           input = Serial2.readString();
  33.           if (input.indexOf("OK") >= 0)
  34.           {
  35.             Serial.println("URL CONNECT SUCCESSFULLY");
  36.             Serial.println();
  37.             input = Serial2.readString();
  38.             input.remove(0);
  39.             int count = 0;
  40.             Serial2.write("AT+QHTTPGET=30\r\n");
  41.             input = Serial2.readString();
  42.             while (input.indexOf("+QHTTPGET") < 0)
  43.             {
  44.               Serial.println("WAITING FOR GET COMMAND RESPONSE");
  45.               Serial.println();
  46.               if (count >= 5)
  47.               {
  48.                 value = false;
  49.                 break;
  50.               }
  51.               count++;
  52.               input = Serial2.readString();
  53.             }
  54.  
  55.             String GetResponse = input.substring(input.indexOf("+QHTTPGET") + 13, input.indexOf("+QHTTPGET") + 16);
  56.             Serial.print("GET RESPONSE IS:");
  57.             Serial.println(GetResponse);
  58.             Serial.println();
  59.             if (GetResponse == "200")
  60.             {
  61.               Serial.println("GET RESPONSE IS OK");
  62.               Serial.println();
  63.               input = Serial2.readString();
  64.               input.remove(0);
  65.               Serial2.write("AT+QHTTPREAD=30\r\n");
  66.               while (!Serial2.available())
  67.               {
  68.               }
  69.  
  70.               while (Serial2.available())
  71.               {
  72.                 String line = Serial2.readStringUntil('\n');
  73.                 Serial.print("line is:" + line); Serial.println();
  74.                 line.trim();// remove white/empty space from the line.
  75.                 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()
  76.                 {
  77.                   Serial.println("This Line Was empty");//headers ended
  78.                   httpResponseLineCount ++;
  79.                   Serial.println("httpResponseLineCount is :" + String(httpResponseLineCount));
  80.                   if (httpResponseLineCount == 2)
  81.                   {
  82.                     Serial.println("This Line Was empty Two Times");//headers ended
  83.                     Serial.println("Breaking While() Now");
  84.                     httpResponseLineCount = 0;
  85.                     break;
  86.                   }
  87.  
  88.                 }
  89.  
  90.                 if (line.startsWith("HTTP/1.1"))// Check if the HTTP Response is 200, else break and Exit Update.
  91.                 {
  92.                   if (line.indexOf("200") < 0)
  93.                   {
  94.                     Serial.println("Got a non 200 status code from server. Exiting OTA Update.");
  95.                     break;
  96.                   }
  97.                 }
  98.  
  99.                 if (line.startsWith("Content-Length: "))// extract headers here, Start with content length
  100.                 {
  101.                   contentLength = atol((getHeaderValue(line, "Content-Length: ")).c_str());
  102.                   Serial.println("Got " + String(contentLength) + " bytes from server");
  103.                 }
  104.  
  105.                 if (line.startsWith("Content-Type: "))// Next, the content type
  106.                 {
  107.                   String contentType = getHeaderValue(line, "Content-Type: ");
  108.                   Serial.println("Got " + contentType + " payload.");
  109.                   if (contentType == "text/plain")
  110.                   {
  111.                     isValidContentType = true;
  112.                   }
  113.                 }
  114.  
  115.               }//-------------------------------------while
  116.  
  117.               Serial.println("contentLength : " + String(contentLength) + ", isValidContentType : " + String(isValidContentType));
  118.  
  119.               if (contentLength && isValidContentType)// check contentLength and content type
  120.               {
  121.                 String GetVersion = Serial2.readStringUntil('#');
  122.  
  123.                 GetVersion = GetVersion.substring(GetVersion.indexOf("$") + 1, GetVersion.indexOf("#"));
  124.                 Serial.println("Found Firmware Version is:" + GetVersion);
  125.  
  126.                 if (GetVersion == FirmwareVer)
  127.                 {
  128.                   Serial.println("Device is already on the latest Firmware Version:" + GetVersion );
  129.                   value = false;
  130.                 }
  131.  
  132.                 if (GetVersion != FirmwareVer)
  133.                 {
  134.                   Serial.println("This is a New Firmware Version" + GetVersion );
  135.                   value = true;
  136.                 }
  137.               }
  138.  
  139.               else
  140.               {
  141.                 Serial.println("There was no content in the response");
  142.                 Serial2.flush();
  143.                 value = false;
  144.               }
  145.  
  146.             }
  147.  
  148.             input = Serial2.readString();
  149.             input.remove(0);
  150.             Serial2.write("AT+QHTTPSTOP\r\n");
  151.             delay(100);
  152.             input = Serial2.readString();
  153.             input.remove(0);
  154.           }
  155.  
  156.           else
  157.           {
  158.             Serial.println("HTTP RESPONSE ERROR");
  159.             Serial.println();
  160.             input.remove(0);
  161.             value = false;
  162.           }
  163.  
  164.         }
  165.  
  166.         else
  167.         {
  168.           Serial.println("URL CONNECT FAILED");
  169.           Serial.println();
  170.           value = false;
  171.         }
  172.  
  173.       }
  174.  
  175.       else
  176.       {
  177.         Serial.println("GPRS CONNECT FAILED");
  178.         Serial.println();
  179.         value = false;
  180.       }
  181.  
  182.     }
  183.  
  184.     else if (GSM_Network_STS == false)
  185.     {
  186.       value = false;
  187.     }
  188.  
  189.  
  190.   }
  191.  
  192.   if (WiFi.status() == WL_CONNECTED)
  193.   {
  194.     WiFiClient * client = new WiFiClient;
  195.     if (client)
  196.     {
  197.       HTTPClient http;
  198.       if (http.begin( * client, fwurl))
  199.       {
  200.         httpCode = http.GET();
  201.         Serial.print("HTTP_Code Recieved : ");
  202.         Serial.print(httpCode);
  203.         Serial.println();
  204.         delay(1000);
  205.         if (httpCode == HTTP_CODE_OK) // if version received
  206.         {
  207.           payload = http.getString();
  208.           payload = payload.substring(payload.indexOf("$") + 1, payload.indexOf("#"));
  209.  
  210.           Serial.println("Found Firmware Version is: " + payload );
  211.           Serial.println();
  212.  
  213.           if (payload == FirmwareVer)
  214.           {
  215.             Serial.printf("\nDevice is already on the latest Firmware Version:%s\n", payload);
  216.             Serial.println();
  217.             value = false;
  218.           }
  219.  
  220.           else if (payload != FirmwareVer)
  221.           {
  222.             Serial.println("This is a New Firmware Version: " + payload);
  223.             Serial.println();
  224.             value = true;
  225.           }
  226.  
  227.         }
  228.  
  229.         else
  230.         {
  231.           Serial.print("Error in Downloading version file:");
  232.           Serial.println(httpCode);
  233.           Serial.println();
  234.           value = false;
  235.         }
  236.  
  237.         http.end();
  238.       }
  239.       delete client;
  240.     }
  241.  
  242.   }
  243.  
  244.   return value;
  245. }
  246.  
  247. //----------------------------------------------------------------------------------
  248.  
  249. bool DoFirmwareUpdate()
  250. {
  251.   Serial.println("<<<  ATTENTION !!! DO NOT TURN OFF THE DEVICE...  >>>"); Serial.println();
  252.   Serial.println("Updating the Device Firmware Now!"); Serial.println();
  253.   Serial.println("Please Wait untill the Device Restarts"); Serial.println();
  254.   bool value;
  255.   String fwurl = "";
  256.   fwurl = URL_fw_Bin;
  257.   Serial.println(fwurl); Serial.println();
  258.  
  259.   if (WiFi.status() != WL_CONNECTED)
  260.   {
  261.     Network_Check_GSM();
  262.     if (GSM_Network_STS == true)
  263.     {
  264.       Serial2.write("AT+QIACT?\r\n");
  265.       delay(100);
  266.       input = Serial2.readString();
  267.       if (input.indexOf("OK") >= 0)
  268.       {
  269.         Serial.println("GPRS CONNECT SUCCESSFULLY");
  270.         Serial.println();
  271.         input = Serial2.readString();
  272.         input.remove(0);
  273.         Serial2.print("AT+QHTTPURL=79,30\r\n");
  274.         delay(100);
  275.         input = Serial2.readString();
  276.         if (input.indexOf("CONNECT") >= 0)
  277.         {
  278.           Serial2.print(fwurl);
  279.           delay(100);
  280.           input = Serial2.readString();
  281.           if (input.indexOf("OK") >= 0)
  282.           {
  283.             Serial.println("URL CONNECT SUCCESSFULLY");
  284.             Serial.println();
  285.             input = Serial2.readString();
  286.             input.remove(0);
  287.             int count = 0;
  288.             Serial2.write("AT+QHTTPGET=30\r\n");
  289.             input = Serial2.readString();
  290.             while (input.indexOf("+QHTTPGET") < 0)
  291.             {
  292.               Serial.println("WAITING FOR GET COMMAND RESPONSE");
  293.               Serial.println();
  294.               if (count >= 5)
  295.               {
  296.                 break;
  297.               }
  298.               count++;
  299.               input = Serial2.readString();
  300.             }
  301.  
  302.             String GetResponse = input.substring(input.indexOf("+QHTTPGET") + 13, input.indexOf("+QHTTPGET") + 16);
  303.             Serial.print("GET RESPONSE IS:");
  304.             Serial.println(GetResponse);
  305.             Serial.println();
  306.             if (GetResponse == "200")
  307.             {
  308.               Serial.println("GET RESPONSE IS OK");
  309.               Serial.println();
  310.               input = Serial2.readString();
  311.               input.remove(0);
  312.               httpResponseLineCount = 0;
  313.               Serial2.write("AT+QHTTPREAD=30\r\n");
  314.               while (!Serial2.available())
  315.               {
  316.               }
  317.               while (Serial2.available())
  318.               {
  319.                 // read line till /n
  320.                 String line = Serial2.readStringUntil('\n');
  321.                 // remove space, to check if the line is end of headers
  322.                 Serial.print("line:");
  323.                 Serial.println(line);
  324.                 line.trim();
  325.  
  326.                 // if the the line is empty,
  327.                 // this is end of headers
  328.                 // break the while and feed the
  329.                 // remaining `client` to the
  330.                 // Update.writeStream();
  331.                 if (!line.length())
  332.                 {
  333.                   Serial.println("This Line Was empty one times");//headers ended
  334.                   Serial.println("httpResponseLineCount is :" + String(httpResponseLineCount));
  335.                   if (httpResponseLineCount == 1)
  336.                   {
  337.                     Serial.println("This Line Was empty two times");//headers ended
  338.                     Serial.println("Breaking While() Now");
  339.                     httpResponseLineCount = 0;
  340.                     break; // and get the OTA started
  341.                   }
  342.                   httpResponseLineCount ++;
  343.                   //break; // and get the OTA started
  344.                 }
  345.  
  346.                 // Check if the HTTP Response is 200
  347.                 // else break and Exit Update
  348.                 if (line.startsWith("HTTP/1.1"))
  349.                 {
  350.                   if (line.indexOf("200") < 0)
  351.                   {
  352.                     Serial.println("Got a non 200 status code from server. Exiting OTA Update.");
  353.                     break;
  354.                   }
  355.                 }
  356.  
  357.                 // extract headers here
  358.                 // Start with content length
  359.                 if (line.startsWith("Content-Length: "))
  360.                 {
  361.                   contentLength = atol((getHeaderValue(line, "Content-Length: ")).c_str());
  362.                   Serial.println("Got " + String(contentLength) + " bytes from server");
  363.                 }
  364.  
  365.                 // Next, the content type
  366.                 if (line.startsWith("Content-Type: "))
  367.                 {
  368.                   String contentType = getHeaderValue(line, "Content-Type: ");
  369.                   Serial.println("Got " + contentType + " payload.");
  370.                   if (contentType == "application/octet-stream")
  371.                   {
  372.                     isValidContentType = true;
  373.                   }
  374.                 }
  375.  
  376.               }//-------------------------------------while
  377.  
  378.               Serial.println("contentLength : " + String(contentLength) + ", isValidContentType : " + String(isValidContentType));
  379.  
  380.               // check contentLength and content type
  381.               if (contentLength && isValidContentType)
  382.               {
  383.                 // Check if there is enough to OTA Update
  384.                 bool canBegin = Update.begin(contentLength, 0, 2, 1, NULL);
  385.  
  386.                 // If yes, begin
  387.                 if (canBegin)
  388.                 {
  389.                   Serial.println("Begin OTA. This may take 2 - 5 mins to complete. Things might be quite for a while.. Patience!");
  390.                   // No activity would appear on the Serial monitor
  391.                   // So be patient. This may take 2 - 5mins to complete
  392.                   size_t written = Update.writeStream(Serial2);
  393.  
  394.                   if (written == contentLength)
  395.                   {
  396.                     Serial.println("Written : " + String(written) + " successfully");
  397.                   }
  398.                   else
  399.                   {
  400.                     Serial.println("Written only : " + String(written) + "/" + String(contentLength) + ". Retry?" );
  401.                     // retry??
  402.                     // execOTA();
  403.                   }
  404.  
  405.                   if (Update.end())
  406.                   {
  407.                     Serial.println("OTA done!");
  408.                     if (Update.isFinished())
  409.                     {
  410.                       Serial.println("Update successfully completed. Rebooting.");
  411.                       ESP.restart();
  412.                     }
  413.                     else
  414.                     {
  415.                       Serial.println("Update not finished? Something went wrong!");
  416.                     }
  417.                   }
  418.                   else
  419.                   {
  420.                     Serial.println("Error Occurred. Error #: " + String(Update.getError()));
  421.                   }
  422.                 }
  423.                 else
  424.                 {
  425.                   // not enough space to begin OTA
  426.                   // Understand the partitions and
  427.                   // space availability
  428.                   Serial.println("Not enough space to begin OTA");
  429.                   Serial2.flush();
  430.                 }
  431.               }
  432.               else
  433.               {
  434.                 Serial.println("There was no content in the response");
  435.                 Serial2.flush();
  436.               }
  437.  
  438.             }
  439.  
  440.             input = Serial2.readString();
  441.             input.remove(0);
  442.             Serial2.write("AT+QHTTPSTOP\r\n");
  443.             delay(100);
  444.             input = Serial2.readString();
  445.             input.remove(0);
  446.           }
  447.  
  448.           else
  449.           {
  450.             Serial.println("HTTP RESPONSE ERROR");
  451.             Serial.println();
  452.             input.remove(0);
  453.             value = false;
  454.           }
  455.  
  456.         }
  457.  
  458.         else
  459.         {
  460.           Serial.println("URL CONNECT FAILED");
  461.           Serial.println();
  462.           value = false;
  463.         }
  464.  
  465.       }
  466.  
  467.       else
  468.       {
  469.         Serial.println("GPRS CONNECT FAILED");
  470.         Serial.println();
  471.         value = false;
  472.       }
  473.  
  474.       input = Serial2.readString();
  475.       input.remove(0);
  476.       Serial2.write("AT+QIDEACT=1\r\n");
  477.       delay(100);
  478.       input = Serial2.readString();
  479.       input.remove(0);
  480.  
  481.     }
  482.  
  483.     else if (GSM_Network_STS == false)
  484.     {
  485.       value = false;
  486.     }
  487.  
  488.  
  489.   }
  490.  
  491.   if (WiFi.status() == WL_CONNECTED)
  492.   {
  493.     WiFiClient client;
  494.     t_httpUpdate_return ret = httpUpdate.update(client, URL_fw_Bin);
  495.  
  496.     switch (ret)
  497.     {
  498.       case HTTP_UPDATE_FAILED:
  499.         Serial.printf("HTTP_UPDATE_FAILD Error (%d): %s\n", httpUpdate.getLastError(), httpUpdate.getLastErrorString().c_str());
  500.         break;
  501.  
  502.       case HTTP_UPDATE_NO_UPDATES:
  503.         Serial.println("HTTP_UPDATE_NO_UPDATES");
  504.         break;
  505.  
  506.       case HTTP_UPDATE_OK:
  507.         Serial.println("HTTP_UPDATE_OK");
  508.         break;
  509.     }
  510.  
  511.   }
  512.  
  513. }
  514.  
  515. //----------------------------------------------------------------------------------
  516.  
  517. String getHeaderValue(String header, String headerName)
  518. {
  519.   return header.substring(strlen(headerName.c_str()));
  520. }
  521.  
  522. //----------------------------------------------------------------------------------
  523.  
  524.  

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: No registered users and 65 guests