diff --git a/src/driver/drv_bl_shared.c b/src/driver/drv_bl_shared.c
index beced32f8..5932c3a37 100644
--- a/src/driver/drv_bl_shared.c
+++ b/src/driver/drv_bl_shared.c
@@ -45,7 +45,7 @@ const char *mqttNames[OBK_NUM_MEASUREMENTS] = {
"power"
};
-int changeSendAlwaysFrames = 5; // 60;
+int changeSendAlwaysFrames = 60;
void BL09XX_AppendInformationToHTTPIndexPage(http_request_t *request) {
char tmp[128];
diff --git a/src/httpserver/http_fns.c b/src/httpserver/http_fns.c
index 56d1c1713..0cb3d3102 100644
--- a/src/httpserver/http_fns.c
+++ b/src/httpserver/http_fns.c
@@ -527,7 +527,11 @@ int http_fn_index(http_request_t *request) {
hprintf128(request,"
Ping watchdog - %i lost, %i ok!
",
PingWatchDog_GetTotalLost(),PingWatchDog_GetTotalReceived());
- hprintf128(request,"MQTT State: %s
", (Main_HasMQTTConnected()==1)?"connected":"disconnected");
+ hprintf128(request,"MQTT State: %s RES: %d(%s)
", (Main_HasMQTTConnected()==1)?"connected":"disconnected",
+ MQTT_GetConnectResult(), get_error_name(MQTT_GetConnectResult()) );
+ hprintf128(request,"MQTT ErrMsg: %s
", (MQTT_GetStatusMessage()!=NULL)?MQTT_GetStatusMessage():"");
+ hprintf128(request,"MQTT Stats:CONN: %d PUB: %d RECV: %d ERR: %d
", MQTT_GetConnectEvents(),
+ MQTT_GetPublishEventCounter(), MQTT_GetReceivedEventCounter(), MQTT_GetPublishErrorCounter());
// for normal page loads, show the rest of the HTML
if(!http_getArg(request->url,"state",tmpA,sizeof(tmpA))) {
diff --git a/src/mqtt/new_mqtt.c b/src/mqtt/new_mqtt.c
index 4d3430a06..c73d94825 100644
--- a/src/mqtt/new_mqtt.c
+++ b/src/mqtt/new_mqtt.c
@@ -57,6 +57,11 @@ mqtt_client_t* mqtt_client;
static int g_timeSinceLastMQTTPublish = 0;
static int mqtt_initialised = 0;
static int mqtt_connect_events = 0;
+static int mqtt_connect_result = ERR_OK;
+static char *mqtt_status_message = NULL;
+static int mqtt_published_events = 0;
+static int mqtt_publish_errors = 0;
+static int mqtt_received_events = 0;
typedef struct mqtt_callback_tag {
char *topic;
@@ -163,13 +168,34 @@ static void mqtt_connection_cb(mqtt_client_t *client, void *arg, mqtt_connection
int MQTT_GetConnectEvents(void)
{
- return mqtt_connect_events;
+ return mqtt_connect_events;
}
-static const char *get_error_name(int err)
+int MQTT_GetPublishEventCounter(void)
+{
+ return mqtt_published_events;
+}
+
+int MQTT_GetPublishErrorCounter(void)
+{
+ return mqtt_publish_errors;
+}
+
+int MQTT_GetReceivedEventCounter(void)
+{
+ return mqtt_received_events;
+}
+
+int MQTT_GetConnectResult(void)
+{
+ return mqtt_connect_result;
+}
+
+const char *get_error_name(int err)
{
switch(err)
{
+ case ERR_OK: return "ERR_OK";
case ERR_MEM: return "ERR_MEM";
/** Buffer error. */
case ERR_BUF: return "ERR_BUF";
@@ -204,6 +230,12 @@ static const char *get_error_name(int err)
}
return "";
}
+
+char *MQTT_GetStatusMessage(void)
+{
+ return mqtt_status_message;
+}
+
// this can REPLACE callbacks, since we MAY wish to change the root topic....
// in which case we would re-resigster all callbacks?
int MQTT_RegisterCallback( const char *basetopic, const char *subscriptiontopic, int ID, mqtt_callback_fn callback){
@@ -436,6 +468,7 @@ static void mqtt_pub_request_cb(void *arg, err_t result)
if(result != ERR_OK)
{
addLogAdv(LOG_INFO,LOG_FEATURE_MQTT,"Publish result: %d(%s)\n", result, get_error_name(result));
+ mqtt_publish_errors++;
}
}
@@ -504,6 +537,7 @@ static OBK_Publish_Result MQTT_PublishTopicToClient(mqtt_client_t *client, const
addLogAdv(LOG_INFO,LOG_FEATURE_MQTT,"Publish err: %d\n", err);
}
}
+ mqtt_published_events++;
MQTT_Mutex_Free();
return OBK_PUBLISH_OK;
} else {
@@ -542,19 +576,24 @@ static void mqtt_incoming_data_cb(void *arg, const u8_t *data, u16_t len, u8_t f
//const struct mqtt_connect_client_info_t* client_info = (const struct mqtt_connect_client_info_t*)arg;
// if we stored a topic in g_mqtt_request, then we found a matching callback, so use it.
- if (g_mqtt_request.topic[0]) {
+ if (g_mqtt_request.topic[0])
+ {
// note: data is NOT terminated (it may be binary...).
g_mqtt_request.received = data;
g_mqtt_request.receivedLen = len;
- addLogAdv(LOG_INFO,LOG_FEATURE_MQTT,"MQTT in topic %s", g_mqtt_request.topic);
+ addLogAdv(LOG_INFO,LOG_FEATURE_MQTT,"MQTT in topic %s", g_mqtt_request.topic);
+ mqtt_received_events++;
- for (i = 0; i < numCallbacks; i++){
+ for (i = 0; i < numCallbacks; i++)
+ {
char *cbtopic = callbacks[i]->topic;
- if (!strncmp(g_mqtt_request.topic, cbtopic, strlen(cbtopic))){
+ if (!strncmp(g_mqtt_request.topic, cbtopic, strlen(cbtopic)))
+ {
// note - callback must return 1 to say it ate the mqtt, else further processing can be performed.
// i.e. multiple people can get each topic if required.
- if (callbacks[i]->callback(&g_mqtt_request)){
+ if (callbacks[i]->callback(&g_mqtt_request))
+ {
return;
}
}
@@ -564,22 +603,23 @@ static void mqtt_incoming_data_cb(void *arg, const u8_t *data, u16_t len, u8_t f
static void mqtt_incoming_publish_cb(void *arg, const char *topic, u32_t tot_len)
{
- //const char *p;
+ //const char *p;
int i;
// unused - left here as example
//const struct mqtt_connect_client_info_t* client_info = (const struct mqtt_connect_client_info_t*)arg;
- // look for a callback with this URL and method, or HTTP_ANY
+ // look for a callback with this URL and method, or HTTP_ANY
g_mqtt_request.topic[0] = '\0';
- for (i = 0; i < numCallbacks; i++){
- char *cbtopic = callbacks[i]->topic;
- if (strncmp(topic, cbtopic, strlen(cbtopic))){
+ for (i = 0; i < numCallbacks; i++)
+ {
+ char *cbtopic = callbacks[i]->topic;
+ if (strncmp(topic, cbtopic, strlen(cbtopic)))
+ {
strncpy(g_mqtt_request.topic, topic, sizeof(g_mqtt_request.topic) - 1);
g_mqtt_request.topic[sizeof(g_mqtt_request.topic) - 1] = 0;
break;
- }
- }
-
+ }
+ }
addLogAdv(LOG_INFO,LOG_FEATURE_MQTT,"MQTT client in mqtt_incoming_publish_cb topic %s\n",topic);
}
@@ -590,6 +630,7 @@ mqtt_request_cb(void *arg, err_t err)
addLogAdv(LOG_INFO,LOG_FEATURE_MQTT,"MQTT client \"%s\" request cb: err %d\n", client_info->client_id, (int)err);
}
+
static void mqtt_sub_request_cb(void *arg, err_t result)
{
/* Just print the result code here for simplicity,
@@ -694,6 +735,9 @@ static void MQTT_do_connect(mqtt_client_t *client)
if (!mqtt_host[0]){
addLogAdv(LOG_INFO,LOG_FEATURE_MQTT,"mqtt_host empty, not starting mqtt\r\n");
+ if (mqtt_status_message != NULL)
+ free(mqtt_status_message);
+ mqtt_status_message = strdup("mqtt_host empty, not starting mqtt");
return;
}
@@ -719,6 +763,9 @@ static void MQTT_do_connect(mqtt_client_t *client)
memcpy(&mqtt_ip, hostEntry->h_addr_list[0], len);
} else {
addLogAdv(LOG_INFO,LOG_FEATURE_MQTT,"mqtt_host resolves no addresses?\r\n");
+ if (mqtt_status_message != NULL)
+ free(mqtt_status_message);
+ mqtt_status_message = strdup("mqtt_host resolves no addresses?");
return;
}
@@ -734,9 +781,13 @@ static void MQTT_do_connect(mqtt_client_t *client)
&mqtt_ip, mqtt_port,
mqtt_connection_cb, LWIP_CONST_CAST(void*, &mqtt_client_info),
&mqtt_client_info);
+ mqtt_connect_result = res;
if(res != ERR_OK)
{
- addLogAdv(LOG_INFO,LOG_FEATURE_MQTT,"Connect error in mqtt_client_connect - code: %d\n", res);
+ addLogAdv(LOG_INFO,LOG_FEATURE_MQTT,"Connect error in mqtt_client_connect - code: %d (%s)\n", res);
+ if (mqtt_status_message != NULL)
+ free(mqtt_status_message);
+ mqtt_status_message = strdup("mqtt_client_connect connect failed");
if (res == ERR_ISCONN)
{
if (mqtt_client != 0)
@@ -744,11 +795,20 @@ static void MQTT_do_connect(mqtt_client_t *client)
mqtt_disconnect(mqtt_client);
}
}
+ } else {
+ if (mqtt_status_message != NULL)
+ free(mqtt_status_message);
+ mqtt_status_message = NULL;
}
} else {
addLogAdv(LOG_INFO,LOG_FEATURE_MQTT,"mqtt_host %s not found by gethostbyname\r\n", mqtt_host);
+ if (mqtt_status_message != NULL)
+ free(mqtt_status_message);
+ mqtt_status_message = (char*)os_malloc(256);
+ sprintf(mqtt_status_message, "mqtt_host %s not found by gethostbyname", mqtt_host);
}
}
+
OBK_Publish_Result MQTT_PublishMain_StringInt(const char *sChannel, int iv)
{
char valueStr[16];
diff --git a/src/mqtt/new_mqtt.h b/src/mqtt/new_mqtt.h
index c6e2d5774..61acaeac6 100644
--- a/src/mqtt/new_mqtt.h
+++ b/src/mqtt/new_mqtt.h
@@ -67,6 +67,13 @@ typedef int (*mqtt_callback_fn)(mqtt_request_t *request);
// ALL topics currently must start with main device topic root.
// ID is unique and non-zero - so that callbacks can be replaced....
int MQTT_GetConnectEvents(void);
+const char *get_error_name(int err);
+int MQTT_GetConnectResult(void);
+char *MQTT_GetStatusMessage(void);
+int MQTT_GetPublishEventCounter(void);
+int MQTT_GetPublishErrorCounter(void);
+int MQTT_GetReceivedEventCounter(void);
+
int MQTT_RegisterCallback( const char *basetopic, const char *subscriptiontopic, int ID, mqtt_callback_fn callback);
int MQTT_RemoveCallback(int ID);