mirror of
https://github.com/esphome/esphome.git
synced 2025-09-29 16:42:19 +01:00
OTA 2 which confirm each written chunk (#6066)
Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
This commit is contained in:
@@ -12,32 +12,34 @@ import time
|
||||
from esphome.core import EsphomeError
|
||||
from esphome.helpers import is_ip_address, resolve_ip_address
|
||||
|
||||
RESPONSE_OK = 0
|
||||
RESPONSE_REQUEST_AUTH = 1
|
||||
RESPONSE_OK = 0x00
|
||||
RESPONSE_REQUEST_AUTH = 0x01
|
||||
|
||||
RESPONSE_HEADER_OK = 64
|
||||
RESPONSE_AUTH_OK = 65
|
||||
RESPONSE_UPDATE_PREPARE_OK = 66
|
||||
RESPONSE_BIN_MD5_OK = 67
|
||||
RESPONSE_RECEIVE_OK = 68
|
||||
RESPONSE_UPDATE_END_OK = 69
|
||||
RESPONSE_SUPPORTS_COMPRESSION = 70
|
||||
RESPONSE_HEADER_OK = 0x40
|
||||
RESPONSE_AUTH_OK = 0x41
|
||||
RESPONSE_UPDATE_PREPARE_OK = 0x42
|
||||
RESPONSE_BIN_MD5_OK = 0x43
|
||||
RESPONSE_RECEIVE_OK = 0x44
|
||||
RESPONSE_UPDATE_END_OK = 0x45
|
||||
RESPONSE_SUPPORTS_COMPRESSION = 0x46
|
||||
RESPONSE_CHUNK_OK = 0x47
|
||||
|
||||
RESPONSE_ERROR_MAGIC = 128
|
||||
RESPONSE_ERROR_UPDATE_PREPARE = 129
|
||||
RESPONSE_ERROR_AUTH_INVALID = 130
|
||||
RESPONSE_ERROR_WRITING_FLASH = 131
|
||||
RESPONSE_ERROR_UPDATE_END = 132
|
||||
RESPONSE_ERROR_INVALID_BOOTSTRAPPING = 133
|
||||
RESPONSE_ERROR_WRONG_CURRENT_FLASH_CONFIG = 134
|
||||
RESPONSE_ERROR_WRONG_NEW_FLASH_CONFIG = 135
|
||||
RESPONSE_ERROR_ESP8266_NOT_ENOUGH_SPACE = 136
|
||||
RESPONSE_ERROR_ESP32_NOT_ENOUGH_SPACE = 137
|
||||
RESPONSE_ERROR_NO_UPDATE_PARTITION = 138
|
||||
RESPONSE_ERROR_MD5_MISMATCH = 139
|
||||
RESPONSE_ERROR_UNKNOWN = 255
|
||||
RESPONSE_ERROR_MAGIC = 0x80
|
||||
RESPONSE_ERROR_UPDATE_PREPARE = 0x81
|
||||
RESPONSE_ERROR_AUTH_INVALID = 0x82
|
||||
RESPONSE_ERROR_WRITING_FLASH = 0x83
|
||||
RESPONSE_ERROR_UPDATE_END = 0x84
|
||||
RESPONSE_ERROR_INVALID_BOOTSTRAPPING = 0x85
|
||||
RESPONSE_ERROR_WRONG_CURRENT_FLASH_CONFIG = 0x86
|
||||
RESPONSE_ERROR_WRONG_NEW_FLASH_CONFIG = 0x87
|
||||
RESPONSE_ERROR_ESP8266_NOT_ENOUGH_SPACE = 0x88
|
||||
RESPONSE_ERROR_ESP32_NOT_ENOUGH_SPACE = 0x89
|
||||
RESPONSE_ERROR_NO_UPDATE_PARTITION = 0x8A
|
||||
RESPONSE_ERROR_MD5_MISMATCH = 0x8B
|
||||
RESPONSE_ERROR_UNKNOWN = 0xFF
|
||||
|
||||
OTA_VERSION_1_0 = 1
|
||||
OTA_VERSION_2_0 = 2
|
||||
|
||||
MAGIC_BYTES = [0x6C, 0x26, 0xF7, 0x5C, 0x45]
|
||||
|
||||
@@ -203,7 +205,8 @@ def perform_ota(
|
||||
send_check(sock, MAGIC_BYTES, "magic bytes")
|
||||
|
||||
_, version = receive_exactly(sock, 2, "version", RESPONSE_OK)
|
||||
if version != OTA_VERSION_1_0:
|
||||
_LOGGER.debug("Device support OTA version: %s", version)
|
||||
if version not in (OTA_VERSION_1_0, OTA_VERSION_2_0):
|
||||
raise OTAError(f"Unsupported OTA version {version}")
|
||||
|
||||
# Features
|
||||
@@ -279,6 +282,8 @@ def perform_ota(
|
||||
|
||||
try:
|
||||
sock.sendall(chunk)
|
||||
if version >= OTA_VERSION_2_0:
|
||||
receive_exactly(sock, 1, "chunk OK", RESPONSE_CHUNK_OK)
|
||||
except OSError as err:
|
||||
sys.stderr.write("\n")
|
||||
raise OTAError(f"Error sending data: {err}") from err
|
||||
|
Reference in New Issue
Block a user