diff --git a/include/mqtt_config.h b/include/mqtt_config.h index 2c9d403..e259a2a 100644 --- a/include/mqtt_config.h +++ b/include/mqtt_config.h @@ -84,11 +84,16 @@ #endif #endif +#ifdef CONFIG_OUTBOX_EXPIRED_TIMEOUT_MS +#define OUTBOX_EXPIRED_TIMEOUT_MS CONFIG_OUTBOX_EXPIRED_TIMEOUT_MS +#else +#define OUTBOX_EXPIRED_TIMEOUT_MS (30*1000) +#endif #define MQTT_ENABLE_SSL CONFIG_MQTT_TRANSPORT_SSL #define MQTT_ENABLE_WS CONFIG_MQTT_TRANSPORT_WEBSOCKET #define MQTT_ENABLE_WSS CONFIG_MQTT_TRANSPORT_WEBSOCKET_SECURE -#define OUTBOX_EXPIRED_TIMEOUT_MS (30*1000) + #define OUTBOX_MAX_SIZE (4*1024) #endif diff --git a/mqtt_client.c b/mqtt_client.c index f718949..e1a3b67 100644 --- a/mqtt_client.c +++ b/mqtt_client.c @@ -1333,6 +1333,14 @@ static void esp_mqtt_task(void *pv) break; } + //Delete message after OUTBOX_EXPIRED_TIMEOUT_MS miliseconds + int deleted = outbox_delete_expired(client->outbox, platform_tick_get_ms(), OUTBOX_EXPIRED_TIMEOUT_MS); + client->mqtt_state.pending_msg_count -= deleted; + + if (client->mqtt_state.pending_msg_count < 0) { + client->mqtt_state.pending_msg_count = 0; + } + // resend all non-transmitted messages first outbox_item_handle_t item = outbox_dequeue(client->outbox, QUEUED, NULL); if (item) { @@ -1373,13 +1381,6 @@ static void esp_mqtt_task(void *pv) client->state = MQTT_STATE_INIT; } - //Delete message after 30 seconds - int deleted = outbox_delete_expired(client->outbox, platform_tick_get_ms(), OUTBOX_EXPIRED_TIMEOUT_MS); - client->mqtt_state.pending_msg_count -= deleted; - if (client->mqtt_state.pending_msg_count < 0) { - client->mqtt_state.pending_msg_count = 0; - } - // outbox_cleanup(client->outbox, OUTBOX_MAX_SIZE); break; case MQTT_STATE_WAIT_TIMEOUT: @@ -1630,6 +1631,18 @@ int esp_mqtt_client_publish(esp_mqtt_client_handle_t client, const char *topic, /* Skip sending if not connected (rely on resending) */ if (client->state != MQTT_STATE_CONNECTED) { ESP_LOGD(TAG, "Publish: client is not connected"); + if (qos > 0) { + ret = pending_msg_id; + } + + //Delete message after OUTBOX_EXPIRED_TIMEOUT_MS miliseconds + int deleted = outbox_delete_expired(client->outbox, platform_tick_get_ms(), OUTBOX_EXPIRED_TIMEOUT_MS); + client->mqtt_state.pending_msg_count -= deleted; + + if (client->mqtt_state.pending_msg_count < 0) { + client->mqtt_state.pending_msg_count = 0; + } + goto cannot_publish; }