diff --git a/src/mqtt/hasp_mqtt.h b/src/mqtt/hasp_mqtt.h index 18f007ea..5760bede 100644 --- a/src/mqtt/hasp_mqtt.h +++ b/src/mqtt/hasp_mqtt.h @@ -13,16 +13,24 @@ #define __FlashStringHelper char #endif +enum hasp_mqtt_error_t { + MQTT_ERR_OK = 0, + MQTT_ERR_DISABLED = -1, + MQTT_ERR_NO_CONN = -2, + MQTT_ERR_SUB_FAIL = -3, + MQTT_ERR_PUB_FAIL = -4, + MQTT_ERR_UNKNOWN = -128 +}; + void mqttSetup(); void mqttLoop(); void mqttEvery5Seconds(bool wifiIsConnected); void mqttStart(); void mqttStop(); -void mqtt_send_object_state(uint8_t pageid, uint8_t btnid, char* payload); -void mqtt_send_state(const __FlashStringHelper* subtopic, const char* payload); - -bool mqttPublish(const char* topic, const char* payload, size_t len, bool retain); +int mqtt_send_object_state(uint8_t pageid, uint8_t btnid, const char* payload); +int mqtt_send_state(const char* subtopic, const char* payload); +int mqttPublish(const char* topic, const char* payload, size_t len, bool retain); bool mqttIsConnected(); diff --git a/src/mqtt/hasp_mqtt_paho_async.cpp b/src/mqtt/hasp_mqtt_paho_async.cpp index d8b94f2b..be17e3f9 100644 --- a/src/mqtt/hasp_mqtt_paho_async.cpp +++ b/src/mqtt/hasp_mqtt_paho_async.cpp @@ -343,7 +343,7 @@ void mqtt_send_state(const __FlashStringHelper* subtopic, const char* payload) mqttPublish(tmp_topic, payload, false); } -void mqtt_send_object_state(uint8_t pageid, uint8_t btnid, char* payload) +void mqtt_send_object_state(uint8_t pageid, uint8_t btnid, const char* payload) { char tmp_topic[strlen(mqttNodeTopic) + 20]; snprintf_P(tmp_topic, sizeof(tmp_topic), PSTR("%sstate/p%ub%u"), mqttNodeTopic, pageid, btnid); diff --git a/src/mqtt/hasp_mqtt_paho_single.cpp b/src/mqtt/hasp_mqtt_paho_single.cpp index bcdbdcb0..a1e45b66 100644 --- a/src/mqtt/hasp_mqtt_paho_single.cpp +++ b/src/mqtt/hasp_mqtt_paho_single.cpp @@ -106,7 +106,7 @@ int disc_finished = 0; int subscribed = 0; int connected = 0; -bool mqttPublish(const char* topic, const char* payload, size_t len, bool retain); +int mqttPublish(const char* topic, const char* payload, size_t len, bool retain); /* ===== Paho event callbacks ===== */ @@ -207,30 +207,28 @@ void mqtt_subscribe(void* context, const char* topic) /* ===== Local HASP MQTT functions ===== */ -bool mqttPublish(const char* topic, const char* payload, size_t len, bool retain) +int mqttPublish(const char* topic, const char* payload, size_t len, bool retain) { - if(mqttIsConnected()) { - MQTTClient_message pubmsg = MQTTClient_message_initializer; - MQTTClient_deliveryToken token; + if(!mqttIsConnected()) return MQTT_ERR_NO_CONN; - pubmsg.payload = (char*)payload; - pubmsg.payloadlen = len; // (int)strlen(payload); - pubmsg.qos = QOS; - pubmsg.retained = retain; + MQTTClient_message pubmsg = MQTTClient_message_initializer; + MQTTClient_deliveryToken token; - MQTTClient_publishMessage(mqtt_client, topic, &pubmsg, &token); - int rc = MQTTClient_waitForCompletion(mqtt_client, token, TIMEOUT); + pubmsg.payload = (char*)payload; + pubmsg.payloadlen = len; // (int)strlen(payload); + pubmsg.qos = QOS; + pubmsg.retained = retain; - if(rc != MQTTCLIENT_SUCCESS) { - LOG_ERROR(TAG_MQTT_PUB, F(D_MQTT_FAILED " '%s' => %s"), topic, payload); - } else { - LOG_TRACE(TAG_MQTT_PUB, F("'%s' => %s OK"), topic, payload); - return true; - } + MQTTClient_publishMessage(mqtt_client, topic, &pubmsg, &token); + int rc = MQTTClient_waitForCompletion(mqtt_client, token, TIMEOUT); + + if(rc != MQTTCLIENT_SUCCESS) { + LOG_ERROR(TAG_MQTT_PUB, F(D_MQTT_FAILED " '%s' => %s"), topic, payload); + return MQTT_ERR_PUB_FAIL; } else { - LOG_ERROR(TAG_MQTT, F(D_MQTT_NOT_CONNECTED)); + LOG_TRACE(TAG_MQTT_PUB, F("'%s' => %s OK"), topic, payload); + return MQTT_ERR_OK; } - return false; } // static bool mqttPublish(const char* topic, const char* payload, bool retain) @@ -245,19 +243,19 @@ bool mqttIsConnected() return connected == 1; } -void mqtt_send_state(const __FlashStringHelper* subtopic, const char* payload) +int mqtt_send_state(const __FlashStringHelper* subtopic, const char* payload) { char tmp_topic[strlen(mqttNodeTopic) + 20]; // printf(("%sstate/%s\n"), mqttNodeTopic, subtopic); snprintf_P(tmp_topic, sizeof(tmp_topic), ("%sstate/%s"), mqttNodeTopic, subtopic); - mqttPublish(tmp_topic, payload, strlen(payload), false); + return mqttPublish(tmp_topic, payload, strlen(payload), false); } -void mqtt_send_object_state(uint8_t pageid, uint8_t btnid, char* payload) +int mqtt_send_object_state(uint8_t pageid, uint8_t btnid, char* payload) { char tmp_topic[strlen(mqttNodeTopic) + 20]; snprintf_P(tmp_topic, sizeof(tmp_topic), PSTR("%sstate/p%ub%u"), mqttNodeTopic, pageid, btnid); - mqttPublish(tmp_topic, payload, strlen(payload), false); + return mqttPublish(tmp_topic, payload, strlen(payload), false); } static void onConnect(void* context) diff --git a/src/mqtt/hasp_mqtt_pubsubclient.cpp b/src/mqtt/hasp_mqtt_pubsubclient.cpp index 73afab25..05a795cb 100644 --- a/src/mqtt/hasp_mqtt_pubsubclient.cpp +++ b/src/mqtt/hasp_mqtt_pubsubclient.cpp @@ -89,25 +89,21 @@ char mqttGroupName[16] = MQTT_GROUPNAME; uint16_t mqttPort = MQTT_PORT; PubSubClient mqttClient(mqttNetworkClient); -bool mqttPublish(const char* topic, const char* payload, size_t len, bool retain) +int mqttPublish(const char* topic, const char* payload, size_t len, bool retain) { - if(mqttIsConnected()) { - if(mqttClient.beginPublish(topic, len, retain)) { - mqttClient.write((uint8_t*)payload, len); - mqttClient.endPublish(); + if(!mqttEnabled) return MQTT_ERR_DISABLED; + if(!mqttClient.connected()) return MQTT_ERR_NO_CONN; - LOG_TRACE(TAG_MQTT_PUB, F("%s => %s"), topic, payload); - return true; - } else { - LOG_ERROR(TAG_MQTT_PUB, F(D_MQTT_FAILED " %s => %s"), topic, payload); - } - } else { - LOG_ERROR(TAG_MQTT, F(D_MQTT_NOT_CONNECTED)); + if(mqttClient.beginPublish(topic, len, retain)) { + mqttClient.write((uint8_t*)payload, len); + mqttClient.endPublish(); + return MQTT_ERR_OK; } - return false; + + return MQTT_ERR_PUB_FAIL; } -static bool mqttPublish(const char* topic, const char* payload, bool retain) +int mqttPublish(const char* topic, const char* payload, bool retain) { return mqttPublish(topic, payload, strlen(payload), retain); } @@ -132,18 +128,18 @@ void mqtt_send_lwt(bool online) bool res = mqttPublish(tmp_topic, tmp_payload, len, true); } -void mqtt_send_object_state(uint8_t pageid, uint8_t btnid, char* payload) +void mqtt_send_object_state(uint8_t pageid, uint8_t btnid, const char* payload) { char tmp_topic[strlen(mqttNodeTopic) + 16]; snprintf_P(tmp_topic, sizeof(tmp_topic), PSTR("%sstate/" HASP_OBJECT_NOTATION), mqttNodeTopic, pageid, btnid); mqttPublish(tmp_topic, payload, false); } -void mqtt_send_state(const __FlashStringHelper* subtopic, const char* payload) +int mqtt_send_state(const char* subtopic, const char* payload) { char tmp_topic[strlen(mqttNodeTopic) + 20]; snprintf_P(tmp_topic, sizeof(tmp_topic), PSTR("%sstate/%s"), mqttNodeTopic, subtopic); - mqttPublish(tmp_topic, payload, false); + return mqttPublish(tmp_topic, payload, false); } ////////////////////////////////////////////////////////////////////////////////////////////////////