Получение ошибки HTTP_UPDATE_FAILD (-104): неверный код HTTP - PullRequest
0 голосов
/ 10 июля 2020

Я пытаюсь обновить прошивку на ESP32 через OTA. Файл прошивки и версии находится на сервере, защищенном паролем. ESP читает файл версии с сервера, но когда дело доходит до обновления прошивки, он показывает ошибку «Ошибка HTTP_UPDATE_FAILD (-104): Неверный код HTTP». Я новичок в программировании. Может ли кто-нибудь помочь мне в этом. Я использую код

#include <WiFi.h>
#include <AzureIoTHub.h>
#include <AzureIoTProtocol_MQTT.h>
#include <AzureIoTUtility.h>
#include <ArduinoJson.h>
#include <HTTPClient.h>
#include <ESP32httpUpdate.h>
#include "base64.h"

const char* ssid = "----------";
const char* password= "--------";

const char* fwVersionURL = "-------";
const char * updateUrl="-------";
//const char* fingerprint = "f0 12 43 c9 05 91 2b 01 73 a8 37 18 4b 15 d5 0c 43 1a 78 17";

const int FW_VERSION = 1245;

const char* connectionString="HostName=---------------;DeviceId=ESP32-Dev1;SharedAccessKey=------------";
const char* DeviceId= "ESP8266-Dev1";
const int Messagemaxlen= 256;
const int interval= 5000;

static IOTHUB_CLIENT_LL_HANDLE iotHubClientHandle;

static int messageCount = 1;

static bool messagePending = false;
static bool messageSending = true;

String authUsername ="--------";
String authPassword = "--------";
void setup() {
  Serial.begin(115200);
  initWiFi();
  initTime();

HTTPClient httpClient;
httpClient.begin( fwVersionURL );
String auth = base64::encode(authUsername + ":" + authPassword);
httpClient.addHeader("Authorization", "Basic " + auth);
int httpCode = httpClient.GET();
if( httpCode == 200 )
{
  String newFWVersion = httpClient.getString();

  Serial.print( "Current firmware version: " );
  Serial.println( FW_VERSION );
  Serial.print( "Available firmware version: " );
  Serial.println( newFWVersion );

  int newVersion = newFWVersion.toInt();
  if( newVersion > FW_VERSION )
  {
    Serial.println( "Preparing to update. Calling UpdateFirmWare" );
      UpdateFirmWare();
  }
}
  
  //Create AureIOtHubConnectionString
  iotHubClientHandle = IoTHubClient_LL_CreateFromConnectionString(connectionString, MQTT_Protocol);
  if (iotHubClientHandle == NULL)
  {
        Serial.println("Failed on IoTHubClient_CreateFromConnectionString.");
        while (1);
   }
   else // added else block
   {
      Serial.println(" IoTHubClient_CreateFromConnectionString Ceated"); 
   
   }

}

void loop() {
  // put your main code here, to run repeatedly:

   // put your main code here, to run repeatedly:
   //delay(60000);
    
  if (!messagePending && messageSending)
  {
      char messagePayload[Messagemaxlen];
      createMessage(messageCount, messagePayload);
      sendMessage(iotHubClientHandle, messagePayload);
      messageCount++;
      delay(interval);
    }
    IoTHubClient_LL_DoWork(iotHubClientHandle);
    delay(10);   
}


void initWiFi()
{
   Serial.print("Connecting to ");
   Serial.println(ssid);
   WiFi.begin(ssid,password);
   while (WiFi.status() != WL_CONNECTED)
   {
    delay(500);
    Serial.print(".");
   } 

    if(WiFi.status() == WL_CONNECTED)
    {
     Serial.println("");
     Serial.println("WiFi connected");
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());
    }
}

void createMessage(int messageId, char *payload)
{
   time_t now = time(nullptr);
  // delay(60000);
   String sTimeS=ctime(&now);
  /*// get humidity reading
  float h = 30.0;
  // get temperature reading in Celsius
  float t = 50.0;
*/
   
  

    StaticJsonBuffer<Messagemaxlen> jsonBuffer;
    //added new to test te format
    JsonArray &array = jsonBuffer.createArray();
     JsonObject &root = array.createNestedObject();
      root["DeviceId"] = DeviceId;
     root["timestamp"] = sTimeS.substring(0,sTimeS.length()-1);


     
  
    // NAN is not the valid json, change it to NULL
   /* if (std::isnan(t))
    {
        root["temperatureC"] = NULL;
    }
    else
    {
        root["temperatureC"] = t;
      
    }*/
    //values are randomly genarated
    
                root["Temperature"] =-20.98 ;
                
                root["BatteryWaterlevel"] =170.44 ;
                
   

     
    root.printTo(payload, Messagemaxlen);
   
}

static void sendCallback(IOTHUB_CLIENT_CONFIRMATION_RESULT result, void *userContextCallback)
{
    if (IOTHUB_CLIENT_CONFIRMATION_OK == result)
    {
      
        Serial.println("Message sent to Azure IoT Hub.");
        
       }
    else
    {
        
         Serial.println("Failed to send message to Azure IoT Hub.");
    }
    messagePending = false;
}
static void sendMessage(IOTHUB_CLIENT_LL_HANDLE iotHubClientHandle, char *buffer)
{
    IOTHUB_MESSAGE_HANDLE messageHandle = IoTHubMessage_CreateFromByteArray((const unsigned char *)buffer, strlen(buffer));
    if (messageHandle == NULL)
    {
        Serial.println("Unable to create a new IoTHubMessage.");
    }
    else
    {
        
        Serial.printf("Sending message: %s.\r\n", buffer);
        if (IoTHubClient_LL_SendEventAsync(iotHubClientHandle, messageHandle, sendCallback, NULL) != IOTHUB_CLIENT_OK)
        {
            Serial.println("Failed to hand over the message to IoTHubClient.");
        }
        else
        {
            messagePending = true;
           Serial.println("IoTHubClient accepted the message for delivery.");
        }

        IoTHubMessage_Destroy(messageHandle);
    }
}

void initTime()
{
    time_t epochTime;
    configTime(0, 0, "pool.ntp.org", "time.nist.gov");

    while (true)
    {
        epochTime = time(NULL);

        if (epochTime == 0)
        {
            Serial.println("Fetching NTP epoch time failed! Waiting 2 seconds to retry.");
            delay(2000);
        }
        else
        {
            Serial.printf("Fetched NTP epoch time is: %lu.\r\n", epochTime);
            break;
        }
    }
}

void UpdateFirmWare()
{  
    //httpClient.setFingerprint(fingerprint);
    Serial.println( "Preparing to update firmware" );

      t_httpUpdate_return ret = ESPhttpUpdate.update( updateUrl );

      switch(ret) {
        case HTTP_UPDATE_FAILED:
          Serial.printf("HTTP_UPDATE_FAILD Error (%d): %s", ESPhttpUpdate.getLastError(), ESPhttpUpdate.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");
          Serial.println( "Downloaded from  12da29130ec3.ngrok.io and rebootng" );
          break;
      }     

}
...