Skip to content

Commit 2e82d0a

Browse files
committed
Merge branch 'bugfix/ota_long_url' into 'master'
esp_rmaker_ota: Changes to support longer OTA URLs See merge request app-frameworks/esp-rainmaker!160
2 parents 56d9e43 + d7a1cf3 commit 2e82d0a

File tree

3 files changed

+87
-6
lines changed

3 files changed

+87
-6
lines changed

components/esp_rainmaker/src/mqtt/esp_rmaker_mqtt.c

Lines changed: 72 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,13 +57,19 @@ esp_rmaker_mqtt_data_t *mqtt_data;
5757
const int MQTT_CONNECTED_EVENT = BIT1;
5858
static EventGroupHandle_t mqtt_event_group;
5959

60+
typedef struct {
61+
char *data;
62+
char *topic;
63+
} esp_rmaker_mqtt_long_data_t;
64+
6065
static void esp_rmaker_mqtt_subscribe_callback(const char *topic, int topic_len, const char *data, int data_len)
6166
{
6267
esp_rmaker_mqtt_subscription_t **subscriptions = mqtt_data->subscriptions;
6368
int i;
6469
for (i = 0; i < MAX_MQTT_SUBSCRIPTIONS; i++) {
6570
if (subscriptions[i]) {
66-
if (strncmp(topic, subscriptions[i]->topic, topic_len) == 0) {
71+
if ((strncmp(topic, subscriptions[i]->topic, topic_len) == 0)
72+
&& (topic_len == strlen(subscriptions[i]->topic))) {
6773
subscriptions[i]->cb(subscriptions[i]->topic, (void *)data, data_len, subscriptions[i]->priv);
6874
}
6975
}
@@ -141,6 +147,53 @@ esp_err_t esp_rmaker_mqtt_publish(const char *topic, void *data, size_t data_len
141147
return ESP_OK;
142148
}
143149

150+
static esp_rmaker_mqtt_long_data_t *esp_rmaker_mqtt_free_long_data(esp_rmaker_mqtt_long_data_t *long_data)
151+
{
152+
if (long_data) {
153+
if (long_data->topic) {
154+
free(long_data->topic);
155+
}
156+
if (long_data->data) {
157+
free(long_data->data);
158+
}
159+
free(long_data);
160+
}
161+
return NULL;
162+
}
163+
164+
static esp_rmaker_mqtt_long_data_t *esp_rmaker_mqtt_manage_long_data(esp_rmaker_mqtt_long_data_t *long_data,
165+
esp_mqtt_event_handle_t event)
166+
{
167+
if (event->topic) {
168+
/* This is new data. Free any earlier data, if present. */
169+
esp_rmaker_mqtt_free_long_data(long_data);
170+
long_data = calloc(1, sizeof(esp_rmaker_mqtt_long_data_t));
171+
if (!long_data) {
172+
ESP_LOGE(TAG, "Could not allocate memory for esp_rmaker_mqtt_long_data_t");
173+
return NULL;
174+
}
175+
long_data->data = calloc(1, event->total_data_len);
176+
if (!long_data->data) {
177+
ESP_LOGE(TAG, "Could not allocate %d bytes for received data.", event->total_data_len);
178+
return esp_rmaker_mqtt_free_long_data(long_data);
179+
}
180+
long_data->topic = strndup(event->topic, event->topic_len);
181+
if (!long_data->topic) {
182+
ESP_LOGE(TAG, "Could not allocate %d bytes for received topic.", event->topic_len);
183+
return esp_rmaker_mqtt_free_long_data(long_data);
184+
}
185+
}
186+
if (long_data) {
187+
memcpy(long_data->data + event->current_data_offset, event->data, event->data_len);
188+
189+
if ((event->current_data_offset + event->data_len) == event->total_data_len) {
190+
esp_rmaker_mqtt_subscribe_callback(long_data->topic, strlen(long_data->topic),
191+
long_data->data, event->total_data_len);
192+
return esp_rmaker_mqtt_free_long_data(long_data);
193+
}
194+
}
195+
return long_data;
196+
}
144197

145198
static esp_err_t mqtt_event_handler(esp_mqtt_event_handle_t event)
146199
{
@@ -168,12 +221,27 @@ static esp_err_t mqtt_event_handler(esp_mqtt_event_handle_t event)
168221
case MQTT_EVENT_PUBLISHED:
169222
ESP_LOGD(TAG, "MQTT_EVENT_PUBLISHED, msg_id=%d", event->msg_id);
170223
break;
171-
case MQTT_EVENT_DATA:
224+
case MQTT_EVENT_DATA: {
172225
ESP_LOGD(TAG, "MQTT_EVENT_DATA");
173-
ESP_LOGD(TAG, "TOPIC=%.*s\r\n", event->topic_len, event->topic);
226+
static esp_rmaker_mqtt_long_data_t *long_data;
227+
/* Topic can be NULL, for data longer than the MQTT buffer */
228+
if (event->topic) {
229+
ESP_LOGD(TAG, "TOPIC=%.*s\r\n", event->topic_len, event->topic);
230+
}
174231
ESP_LOGD(TAG, "DATA=%.*s\r\n", event->data_len, event->data);
175-
esp_rmaker_mqtt_subscribe_callback(event->topic, event->topic_len, event->data, event->data_len);
232+
if (event->data_len == event->total_data_len) {
233+
/* If long_data still exists, it means there was some issue getting the
234+
* long data, and so, it needs to be freed up.
235+
*/
236+
if (long_data) {
237+
long_data = esp_rmaker_mqtt_free_long_data(long_data);
238+
}
239+
esp_rmaker_mqtt_subscribe_callback(event->topic, event->topic_len, event->data, event->data_len);
240+
} else {
241+
long_data = esp_rmaker_mqtt_manage_long_data(long_data, event);
242+
}
176243
break;
244+
}
177245
case MQTT_EVENT_ERROR:
178246
ESP_LOGE(TAG, "MQTT_EVENT_ERROR");
179247
break;

components/esp_rainmaker/src/ota/esp_rmaker_ota.c

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
static const char *TAG = "esp_rmaker_ota";
2929

3030
#define OTA_REBOOT_TIMER_SEC 10
31+
#define DEF_HTTP_BUFFER_SIZE 1024
3132

3233
extern const char esp_rmaker_ota_def_cert[] asm("_binary_ota_server_crt_start");
3334
const char *ESP_RMAKER_OTA_DEFAULT_SERVER_CERT = esp_rmaker_ota_def_cert;
@@ -128,13 +129,20 @@ static esp_err_t esp_rmaker_ota_default_cb(esp_rmaker_ota_handle_t ota_handle, e
128129
if (!ota_data->url) {
129130
return ESP_FAIL;
130131
}
132+
int buffer_size_tx = DEF_HTTP_BUFFER_SIZE;
133+
/* In case received url is longer, we will increase the tx buffer size
134+
* to accomodate the longer url and other headers.
135+
*/
136+
if (strlen(ota_data->url) > buffer_size_tx) {
137+
buffer_size_tx = strlen(ota_data->url) + 128;
138+
}
131139
esp_err_t ota_finish_err = ESP_OK;
132140
esp_http_client_config_t config = {
133141
.url = ota_data->url,
134142
.cert_pem = ota_data->server_cert,
135143
.timeout_ms = 5000,
136-
.buffer_size = 1024,
137-
.buffer_size_tx = 1024
144+
.buffer_size = DEF_HTTP_BUFFER_SIZE,
145+
.buffer_size_tx = buffer_size_tx
138146
};
139147
config.skip_cert_common_name_check = true;
140148
#ifdef CONFIG_ESP_RMAKER_SKIP_COMMON_NAME_CHECK

components/esp_rainmaker/src/ota/esp_rmaker_ota_using_topics.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,19 +107,22 @@ static void ota_url_handler(const char *topic, void *payload, size_t payload_len
107107
char *url = NULL, *ota_job_id = NULL;
108108
int ret = json_parse_start(&jctx, (char *)payload, (int) payload_len);
109109
if (ret != 0) {
110+
ESP_LOGE(TAG, "Invalid JSON received: %s", (char *)payload);
110111
esp_rmaker_ota_report_status(ota_handle, OTA_STATUS_FAILED, "Aborted. JSON Payload error");
111112
ota->ota_in_progress = false;
112113
return;
113114
}
114115
int len = 0;
115116
ret = json_obj_get_strlen(&jctx, "ota_job_id", &len);
116117
if (ret != ESP_OK) {
118+
ESP_LOGE(TAG, "Aborted. OTA Updated ID not found in JSON");
117119
esp_rmaker_ota_report_status(ota_handle, OTA_STATUS_FAILED, "Aborted. OTA Updated ID not found in JSON");
118120
goto end;
119121
}
120122
len++; /* Increment for NULL character */
121123
ota_job_id = calloc(1, len);
122124
if (!ota_job_id) {
125+
ESP_LOGE(TAG, "Aborted. OTA Updated ID memory allocation failed");
123126
esp_rmaker_ota_report_status(ota_handle, OTA_STATUS_FAILED, "Aborted. OTA Updated ID memory allocation failed");
124127
goto end;
125128
}
@@ -129,12 +132,14 @@ static void ota_url_handler(const char *topic, void *payload, size_t payload_len
129132
len = 0;
130133
ret = json_obj_get_strlen(&jctx, "url", &len);
131134
if (ret != ESP_OK) {
135+
ESP_LOGE(TAG, "Aborted. URL not found in JSON");
132136
esp_rmaker_ota_report_status(ota_handle, OTA_STATUS_FAILED, "Aborted. URL not found in JSON");
133137
goto end;
134138
}
135139
len++; /* Increment for NULL character */
136140
url = calloc(1, len);
137141
if (!url) {
142+
ESP_LOGE(TAG, "Aborted. URL memory allocation failed");
138143
esp_rmaker_ota_report_status(ota_handle, OTA_STATUS_FAILED, "Aborted. URL memory allocation failed");
139144
goto end;
140145
}

0 commit comments

Comments
 (0)