From e7311d54f3e0762e907d002cbcb692c0131b79d7 Mon Sep 17 00:00:00 2001 From: Thorsten von Eicken Date: Sun, 20 Sep 2015 21:30:44 -0700 Subject: [PATCH] misc mqtt tweaks --- Makefile | 4 ++-- esp-link/cgimqtt.c | 9 ++------- esp-link/cgiwifi.c | 3 ++- esp-link/main.c | 29 +++++++++++++++++----------- esp-link/mqtt_client.c | 43 +++++++++++++++++++++++------------------- esp-link/status.c | 2 +- 6 files changed, 49 insertions(+), 41 deletions(-) diff --git a/Makefile b/Makefile index 3e83e64..3602680 100644 --- a/Makefile +++ b/Makefile @@ -31,8 +31,8 @@ ESPPORT ?= /dev/ttyUSB0 ESPBAUD ?= 460800 # The Wifi station configuration can be hard-coded here, which makes esp-link come up in STA+AP -# mode trying to connect to the specified AP. It will only switch to STA-only a few seconds after -# actually connecting the AP. +# mode trying to connect to the specified AP *only* if the flash wireless settings are empty! +# This happens on a full serial flash and avoids having to hunt for the AP... # STA_SSID ?= # STA_PASS ?= diff --git a/esp-link/cgimqtt.c b/esp-link/cgimqtt.c index 877f976..d4f7100 100644 --- a/esp-link/cgimqtt.c +++ b/esp-link/cgimqtt.c @@ -119,12 +119,7 @@ int ICACHE_FLASH_ATTR cgiMqttSet(HttpdConnData *connData) { os_printf("MQTT server settings changed, enable=%d\n", flashConfig.mqtt_enable); #endif MQTT_Free(&mqttClient); // safe even if not connected - MQTT_Init(&mqttClient, flashConfig.mqtt_host, flashConfig.mqtt_port, 0, - flashConfig.mqtt_timeout, flashConfig.mqtt_clientid, - flashConfig.mqtt_username, flashConfig.mqtt_password, - flashConfig.mqtt_keepalive); - if (flashConfig.mqtt_enable && strlen(flashConfig.mqtt_host) > 0) - MQTT_Connect(&mqttClient); + mqtt_client_init(); // if just enable changed we just need to bounce the client } else if (mqtt_en_chg > 0) { @@ -174,4 +169,4 @@ int ICACHE_FLASH_ATTR cgiMqtt(HttpdConnData *connData) { return HTTPD_CGI_DONE; } } -#endif // MQTT \ No newline at end of file +#endif // MQTT diff --git a/esp-link/cgiwifi.c b/esp-link/cgiwifi.c index 7292447..81929ea 100644 --- a/esp-link/cgiwifi.c +++ b/esp-link/cgiwifi.c @@ -110,6 +110,7 @@ static void ICACHE_FLASH_ATTR wifiHandleEventCb(System_Event_t *evt) { void ICACHE_FLASH_ATTR wifiAddStateChangeCb(WifiStateChangeCb cb) { for (int i = 0; i < 4; i++) { + if (wifi_state_change_cb[i] == cb) return; if (wifi_state_change_cb[i] == NULL) { wifi_state_change_cb[i] = cb; return; @@ -599,7 +600,7 @@ int ICACHE_FLASH_ATTR cgiWiFiConnStatus(HttpdConnData *connData) { len += os_sprintf(buff+len, "\"x\":0}\n"); #ifdef CGIWIFI_DBG - os_printf(" -> %s\n", buff); + //os_printf(" -> %s\n", buff); #endif httpdSend(connData, buff, len); return HTTPD_CGI_DONE; diff --git a/esp-link/main.c b/esp-link/main.c index 7c20d04..023021d 100644 --- a/esp-link/main.c +++ b/esp-link/main.c @@ -52,7 +52,7 @@ HttpdBuiltInUrl builtInUrls[] = { { "/console/baud", ajaxConsoleBaud, NULL }, { "/console/text", ajaxConsole, NULL }, //Enable the line below to protect the WiFi configuration with an username/password combo. - // {"/wifi/*", authBasic, myPassFn}, + // {"/wifi/*", authBasic, myPassFn}, { "/wifi", cgiRedirect, "/wifi/wifi.html" }, { "/wifi/", cgiRedirect, "/wifi/wifi.html" }, { "/wifi/info", cgiWifiInfo, NULL }, @@ -119,18 +119,25 @@ void user_init(void) { os_printf("Flash config restore %s\n", restoreOk ? "ok" : "*FAILED*"); #if defined(STA_SSID) && defined(STA_PASS) - struct station_config stconf; - wifi_station_get_config(&stconf); - - os_strncpy((char*)stconf.ssid, VERS_STR(STA_SSID), 32); - os_strncpy((char*)stconf.password, VERS_STR(STA_PASS), 64); + int x = wifi_get_opmode() & 0x3; + if (x == 2) { + // we only force the STA settings when a full flash of the module has been made, which + // resets the wifi settings not to have anything configured + struct station_config stconf; + wifi_station_get_config(&stconf); + + if (os_strlen((char*)stconf.ssid) == 0 && os_strlen((char*)stconf.password) == 0) { + os_strncpy((char*)stconf.ssid, VERS_STR(STA_SSID), 32); + os_strncpy((char*)stconf.password, VERS_STR(STA_PASS), 64); #ifdef CGIWIFI_DBG - os_printf("Wifi pre-config trying to connect to AP %s pw %s\n", - (char*)stconf.ssid, (char*)stconf.password); + os_printf("Wifi pre-config trying to connect to AP %s pw %s\n", + (char*)stconf.ssid, (char*)stconf.password); #endif - wifi_set_opmode(3); // sta+ap, will switch to sta-only 15 secs after connecting - stconf.bssid_set = 0; - wifi_station_set_config(&stconf); + wifi_set_opmode(3); // sta+ap, will switch to sta-only 15 secs after connecting + stconf.bssid_set = 0; + wifi_station_set_config(&stconf); + } + } #endif // Status LEDs diff --git a/esp-link/mqtt_client.c b/esp-link/mqtt_client.c index cca4254..3969530 100644 --- a/esp-link/mqtt_client.c +++ b/esp-link/mqtt_client.c @@ -10,9 +10,12 @@ #define DBG_MQTTCLIENT(format, ...) do { } while(0) #endif -MQTT_Client mqttClient; +MQTT_Client mqttClient; // main mqtt client used by esp-link + +#ifdef BRUNNELS char* statusTopicStr; static char* onlineMsgStr; +#endif static MqttCallback connected_cb; static MqttCallback disconnected_cb; @@ -21,10 +24,12 @@ static MqttDataCallback data_cb; void ICACHE_FLASH_ATTR mqttConnectedCb(uint32_t *args) { - MQTT_Client* client = (MQTT_Client*)args; DBG_MQTTCLIENT("MQTT Client: Connected\n"); - MQTT_Subscribe(client, "system/time", 0); + //MQTT_Client* client = (MQTT_Client*)args; + //MQTT_Subscribe(client, "system/time", 0); // handy for testing +#ifdef BRUNNELS MQTT_Publish(client, "announce/all", onlineMsgStr, 0, 0); +#endif if (connected_cb) connected_cb(args); } @@ -49,6 +54,7 @@ void ICACHE_FLASH_ATTR mqttDataCb(uint32_t *args, const char* topic, uint32_t topic_len, const char *data, uint32_t data_len) { // MQTT_Client* client = (MQTT_Client*)args; +#ifdef MQTTCLIENT_DBG char *topicBuf = (char*)os_zalloc(topic_len + 1); char *dataBuf = (char*)os_zalloc(data_len + 1); @@ -58,9 +64,10 @@ mqttDataCb(uint32_t *args, const char* topic, uint32_t topic_len, const char *da os_memcpy(dataBuf, data, data_len); dataBuf[data_len] = 0; - DBG_MQTTCLIENT("MQTT Client: Received topic: %s, data: %s\n", topicBuf, dataBuf); + os_printf("MQTT Client: Received topic: %s, data: %s\n", topicBuf, dataBuf); os_free(topicBuf); os_free(dataBuf); +#endif if (data_cb) data_cb(args, topic, topic_len, data, data_len); @@ -70,7 +77,7 @@ void ICACHE_FLASH_ATTR wifiStateChangeCb(uint8_t status) { if (flashConfig.mqtt_enable) { - if (status == wifiGotIP && mqttClient.connState != TCP_CONNECTING) { + if (status == wifiGotIP && mqttClient.connState != TCP_CONNECTING) { MQTT_Connect(&mqttClient); } else if (status == wifiIsDisconnected && mqttClient.connState == TCP_CONNECTING) { @@ -82,21 +89,16 @@ wifiStateChangeCb(uint8_t status) void ICACHE_FLASH_ATTR mqtt_client_init() { - if (flashConfig.mqtt_enable) { - MQTT_Init(&mqttClient, flashConfig.mqtt_host, flashConfig.mqtt_port, 0, flashConfig.mqtt_timeout, - flashConfig.mqtt_clientid, flashConfig.mqtt_username, flashConfig.mqtt_password, - flashConfig.mqtt_keepalive); + MQTT_Init(&mqttClient, flashConfig.mqtt_host, flashConfig.mqtt_port, 0, flashConfig.mqtt_timeout, + flashConfig.mqtt_clientid, flashConfig.mqtt_username, flashConfig.mqtt_password, + flashConfig.mqtt_keepalive); - if (flashConfig.mqtt_status_enable) { // removed client_id concat for now until a better solution is devised // statusTopicStr = (char*)os_zalloc(strlen(flashConfig.mqtt_clientid) + strlen(flashConfig.mqtt_status_topic) + 2); // os_strcpy(statusTopicStr, flashConfig.mqtt_clientid); // os_strcat(statusTopicStr, "/"); - statusTopicStr = (char*)os_zalloc(strlen(flashConfig.mqtt_status_topic) + 1); - os_strcpy(statusTopicStr, flashConfig.mqtt_status_topic); - } - +#ifdef BRUNNELS char* onlineMsg = " is online"; onlineMsgStr = (char*)os_zalloc(strlen(flashConfig.mqtt_clientid) + strlen(onlineMsg) + 1); os_strcpy(onlineMsgStr, flashConfig.mqtt_clientid); @@ -112,12 +114,15 @@ mqtt_client_init() os_strcpy(lwtMsgStr, flashConfig.mqtt_clientid); os_strcat(lwtMsgStr, lwt); MQTT_InitLWT(&mqttClient, lwtMsgStr, offlineMsg, 0, 0); +#endif - MQTT_OnConnected(&mqttClient, mqttConnectedCb); - MQTT_OnDisconnected(&mqttClient, mqttDisconnectedCb); - MQTT_OnPublished(&mqttClient, mqttPublishedCb); - MQTT_OnData(&mqttClient, mqttDataCb); - } + MQTT_OnConnected(&mqttClient, mqttConnectedCb); + MQTT_OnDisconnected(&mqttClient, mqttDisconnectedCb); + MQTT_OnPublished(&mqttClient, mqttPublishedCb); + MQTT_OnData(&mqttClient, mqttDataCb); + + if (flashConfig.mqtt_enable && strlen(flashConfig.mqtt_host) > 0) + MQTT_Connect(&mqttClient); wifiAddStateChangeCb(wifiStateChangeCb); } diff --git a/esp-link/status.c b/esp-link/status.c index a1ca389..a49726f 100644 --- a/esp-link/status.c +++ b/esp-link/status.c @@ -37,7 +37,7 @@ static void ICACHE_FLASH_ATTR mqttStatusCb(void *v) { char buf[128]; mqttStatusMsg(buf); - MQTT_Publish(&mqttClient, statusTopicStr, buf, 1, 0); + MQTT_Publish(&mqttClient, flashConfig.mqtt_status_topic, buf, 1, 0); }