summaryrefslogtreecommitdiff
path: root/platformio/common/libs/mqtt_module_ota/homekit/mqtt
diff options
context:
space:
mode:
Diffstat (limited to 'platformio/common/libs/mqtt_module_ota/homekit/mqtt')
-rw-r--r--platformio/common/libs/mqtt_module_ota/homekit/mqtt/module/ota.cpp160
-rw-r--r--platformio/common/libs/mqtt_module_ota/homekit/mqtt/module/ota.h75
2 files changed, 0 insertions, 235 deletions
diff --git a/platformio/common/libs/mqtt_module_ota/homekit/mqtt/module/ota.cpp b/platformio/common/libs/mqtt_module_ota/homekit/mqtt/module/ota.cpp
deleted file mode 100644
index 4e976cd..0000000
--- a/platformio/common/libs/mqtt_module_ota/homekit/mqtt/module/ota.cpp
+++ /dev/null
@@ -1,160 +0,0 @@
-#include "./ota.h"
-#include <homekit/logging.h>
-#include <homekit/util.h>
-#include <homekit/led.h>
-
-namespace homekit::mqtt {
-
-using homekit::led::mcu_led;
-
-#define MD5_SIZE 16
-
-static const char TOPIC_OTA[] = "ota";
-static const char TOPIC_OTA_RESPONSE[] = "otares";
-
-void MqttOtaModule::onConnect(Mqtt& mqtt) {
- String topic(TOPIC_OTA);
- mqtt.subscribeModule(topic, this);
-}
-
-void MqttOtaModule::tick(Mqtt& mqtt) {
- if (!tickElapsed())
- return;
-}
-
-void MqttOtaModule::handlePayload(Mqtt& mqtt, String& topic, uint16_t packetId, const uint8_t *payload, size_t length, size_t index, size_t total) {
- char md5[33];
- char* md5Ptr = md5;
-
- if (index != 0 && ota.dataPacketId != packetId) {
- PRINTLN("mqtt/ota: non-matching packet id");
- return;
- }
-
- Update.runAsync(true);
-
- if (index == 0) {
- if (length < CONFIG_NODE_SECRET_SIZE + MD5_SIZE) {
- PRINTLN("mqtt/ota: failed to check secret, first packet size is too small");
- return;
- }
-
- if (memcmp((const char*)payload, CONFIG_NODE_SECRET, CONFIG_NODE_SECRET_SIZE) != 0) {
- PRINTLN("mqtt/ota: invalid secret");
- return;
- }
-
- PRINTF("mqtt/ota: starting update, total=%ul\n", total-CONFIG_NODE_SECRET_SIZE);
- for (int i = 0; i < MD5_SIZE; i++) {
- md5Ptr += sprintf(md5Ptr, "%02x", *((unsigned char*)(payload+CONFIG_NODE_SECRET_SIZE+i)));
- }
- md5[32] = '\0';
- PRINTF("mqtt/ota: md5 is %s\n", md5);
- PRINTF("mqtt/ota: first packet is %ul bytes length\n", length);
-
- md5[32] = '\0';
-
- if (Update.isRunning()) {
- Update.end();
- Update.clearError();
- }
-
- if (!Update.setMD5(md5)) {
- PRINTLN("mqtt/ota: setMD5 failed");
- return;
- }
-
- ota.dataPacketId = packetId;
-
- if (!Update.begin(total - CONFIG_NODE_SECRET_SIZE - MD5_SIZE)) {
- ota.clean();
-#ifdef DEBUG
- Update.printError(Serial);
-#endif
- sendResponse(mqtt, OtaResult::UPDATE_ERROR, Update.getError());
- }
-
- ota.written = Update.write(const_cast<uint8_t*>(payload)+CONFIG_NODE_SECRET_SIZE + MD5_SIZE, length-CONFIG_NODE_SECRET_SIZE - MD5_SIZE);
- ota.written += CONFIG_NODE_SECRET_SIZE + MD5_SIZE;
-
- mcu_led->blink(1, 1);
- PRINTF("mqtt/ota: updating %u/%u\n", ota.written, Update.size());
-
- } else {
- if (!Update.isRunning()) {
- PRINTLN("mqtt/ota: update is not running");
- return;
- }
-
- if (index == ota.written) {
- size_t written;
- if ((written = Update.write(const_cast<uint8_t*>(payload), length)) != length) {
- PRINTF("mqtt/ota: error: tried to write %ul bytes, write() returned %ul\n",
- length, written);
- ota.clean();
- Update.end();
- Update.clearError();
- sendResponse(mqtt, OtaResult::WRITE_ERROR);
- return;
- }
- ota.written += length;
-
- mcu_led->blink(1, 1);
- PRINTF("mqtt/ota: updating %u/%u\n",
- ota.written - CONFIG_NODE_SECRET_SIZE - MD5_SIZE,
- Update.size());
- } else {
- PRINTF("mqtt/ota: position is invalid, expected %ul, got %ul\n", ota.written, index);
- ota.clean();
- Update.end();
- Update.clearError();
- }
- }
-
- if (Update.isFinished()) {
- ota.dataPacketId = 0;
-
- if (Update.end()) {
- ota.finished = true;
- ota.publishResultPacketId = sendResponse(mqtt, OtaResult::OK);
- PRINTF("mqtt/ota: ok, otares packet_id=%d\n", ota.publishResultPacketId);
- } else {
- ota.clean();
-
- PRINTF("mqtt/ota: error: %u\n", Update.getError());
-#ifdef DEBUG
- Update.printError(Serial);
-#endif
- Update.clearError();
-
- sendResponse(mqtt, OtaResult::UPDATE_ERROR, Update.getError());
- }
- }
-}
-
-uint16_t MqttOtaModule::sendResponse(Mqtt& mqtt, OtaResult status, uint8_t error_code) const {
- MqttOtaResponsePayload resp{
- .status = status,
- .error_code = error_code
- };
- return mqtt.publish(TOPIC_OTA_RESPONSE, reinterpret_cast<uint8_t*>(&resp), sizeof(resp));
-}
-
-void MqttOtaModule::onDisconnect(Mqtt& mqtt, espMqttClientTypes::DisconnectReason reason) {
- if (ota.readyToRestart) {
- restartTimer.once(1, restart);
- } else if (ota.started()) {
- PRINTLN("mqtt: update was in progress, canceling..");
- ota.clean();
- Update.end();
- Update.clearError();
- }
-}
-
-void MqttOtaModule::handleOnPublish(uint16_t packetId) {
- if (ota.finished && packetId == ota.publishResultPacketId) {
- ota.readyToRestart = true;
- }
-}
-
-}
diff --git a/platformio/common/libs/mqtt_module_ota/homekit/mqtt/module/ota.h b/platformio/common/libs/mqtt_module_ota/homekit/mqtt/module/ota.h
deleted file mode 100644
index df4f7ce..0000000
--- a/platformio/common/libs/mqtt_module_ota/homekit/mqtt/module/ota.h
+++ /dev/null
@@ -1,75 +0,0 @@
-#ifndef HOMEKIT_LIB_MQTT_MODULE_OTA_H
-#define HOMEKIT_LIB_MQTT_MODULE_OTA_H
-
-#include <stdint.h>
-#include <Ticker.h>
-#include <homekit/mqtt/module.h>
-
-namespace homekit::mqtt {
-
-enum class OtaResult: uint8_t {
- OK = 0,
- UPDATE_ERROR = 1,
- WRITE_ERROR = 2,
-};
-
-struct OtaStatus {
- uint16_t dataPacketId;
- uint16_t publishResultPacketId;
- bool finished;
- bool readyToRestart;
- size_t written;
-
- OtaStatus()
- : dataPacketId(0)
- , publishResultPacketId(0)
- , finished(false)
- , readyToRestart(false)
- , written(0)
- {}
-
- inline void clean() {
- dataPacketId = 0;
- publishResultPacketId = 0;
- finished = false;
- readyToRestart = false;
- written = 0;
- }
-
- inline bool started() const {
- return dataPacketId != 0;
- }
-};
-
-struct MqttOtaResponsePayload {
- OtaResult status;
- uint8_t error_code;
-} __attribute__((packed));
-
-
-class MqttOtaModule: public MqttModule {
-private:
- OtaStatus ota;
- Ticker restartTimer;
-
- uint16_t sendResponse(Mqtt& mqtt, OtaResult status, uint8_t error_code = 0) const;
-
-public:
- MqttOtaModule() : MqttModule(0, true, true) {}
-
- void onConnect(Mqtt& mqtt) override;
- void onDisconnect(Mqtt& mqtt, espMqttClientTypes::DisconnectReason reason) override;
-
- void tick(Mqtt& mqtt) override;
-
- void handlePayload(Mqtt& mqtt, String& topic, uint16_t packetId, const uint8_t *payload, size_t length, size_t index, size_t total) override;
- void handleOnPublish(uint16_t packetId) override;
-
- inline bool isReadyToRestart() const {
- return ota.readyToRestart;
- }
-};
-
-}
-
-#endif //HOMEKIT_LIB_MQTT_MODULE_OTA_H