Я пытаюсь обновить прошивку на 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;
}
}