#include #include "CommandProcessor.h" #include "utilities.h" #include "Settings.h" #include const char * TAG = "CommandProcessor"; CommandProcessor::CommandProcessor(AppIF & app) : m_app(app), m_rw(512) { } #define BUF_LEN 128 char * getElementAt(int el, Parser & p, char * buffer) { buffer[0] = 0; p.getElementAt(el, buffer, BUF_LEN); return buffer; } bool CommandProcessor::cmdSetGroupId(Parser & p, char * buffer) { int value = 0; if(strToInt(getElementAt(1, p, buffer), value)) { ESP_LOGW(TAG, "new group value: %u", value); SETTINGS.device.group_id = value; SETTINGS_SAVE; strcpy(m_buffer, "Z|ok"); return true; } strcpy(m_buffer, "Z|fail"); return false; } bool CommandProcessor::cmdSetWorkingId(Parser & p, char * buffer) { int value = 0; if(strToInt(getElementAt(1, p, buffer), value)) { ESP_LOGW(TAG, "new device working id: %u", value); SETTINGS.device.tata_id = value; SETTINGS_SAVE; strcpy(m_buffer, "-|ok"); return true; } strcpy(m_buffer, "-|fail"); return false; } bool CommandProcessor::cmdRestart(Parser & p, char * buffer) { esp_restart(); return true; } bool CommandProcessor::cmdDeleteStoredSsids(Parser & p, char * buffer) { ESP_LOGW(TAG, "delete stored ssid's"); SETTINGS.wifi.num = 0; SETTINGS_SAVE; strcpy(m_buffer, "d|ok"); return true; } bool CommandProcessor::cmdReturnCurrentSsid(Parser & p, char * buffer) { ESP_LOGW(TAG, "return current ssid %s and rssi %d", WiFi.SSID().c_str(), WiFi.RSSI()); m_rw.reset(); m_rw.appendf("a|%s,%d", WiFi.SSID().c_str(), WiFi.RSSI()); ESP_LOGI(TAG, "'%s'", m_rw.getBuffer()); // "a|gumball,-42" strcpy(m_buffer, m_rw.getBuffer()); return true; } bool CommandProcessor::cmdReturnVisibleNetworks(Parser & p, char * buffer) { ESP_LOGI(TAG, "Scanning wifi networks..."); int num_networks = WiFi.scanNetworks(false, false, false, 0); m_rw.reset(); m_rw.appendf("w|%d|", num_networks); for(int n = 0; n < num_networks; n++) { m_rw.append(WiFi.SSID(n).c_str()); m_rw.append(","); m_rw.appendf("%d", WiFi.RSSI(n)); if(n < num_networks - 1) m_rw.append("|"); } ESP_LOGI(TAG, "'%s'", m_rw.getBuffer()); // "w|4|gumball,-40|miro,-79|903noe,-84|TheGoodPlace-2.4,-93" strcpy(m_buffer, m_rw.getBuffer()); return true; } bool CommandProcessor::cmdAddNetwork(Parser & p, char * buffer) { if(p.getElementAt(1, buffer, BUF_LEN)) { ESP_LOGI(TAG, "ssid/pwd: '%s'", buffer); char ssid[36], pwd[36]; Parser pp(buffer, ","); if(pp.getElementAt(0, ssid, sizeof(ssid))) { ESP_LOGI(TAG, "ssid: %s", ssid); if(pp.getElementAt(1, pwd, sizeof(pwd))) { ESP_LOGI(TAG, "pwd: %s", pwd); if(SETTINGS.wifi.num < SETTINGS_NUM_WIFI_ENTRIES - 1) { int ix = SETTINGS.wifi.num; strcpy(SETTINGS.wifi.entry[ix].ssid, ssid); strcpy(SETTINGS.wifi.entry[ix].pwd, pwd); SETTINGS.wifi.num = ix + 1; SETTINGS_SAVE; strcpy(m_buffer, "W|ok"); return true; } } } } strcpy(m_buffer, "W|fail"); return false; } bool CommandProcessor::cmdReportAllSettings(Parser & p, char * buffer) { int64_t up_time = esp_timer_get_time(); m_rw.reset(); m_rw.appendf("-,%u", SETTINGS.device.tata_id); //wid m_rw.append("|"); m_rw.appendf("Z,%u", SETTINGS.device.group_id); //group id m_rw.append("|"); m_rw.appendf("0,%s", SETTINGS.mqtt.device_id); //client id mwtt client id(text) m_rw.append("|"); m_rw.appendf("2,%u", up_time/1000000); //time since reboot (seconds) m_rw.append("|"); m_rw.append("5,"); for(int n = 0; n < SETTINGS.wifi.num; n++) { m_rw.append(SETTINGS.wifi.entry[n].ssid); m_rw.append("\t"); m_rw.append(SETTINGS.wifi.entry[n].pwd); if(n < SETTINGS.wifi.num - 1) m_rw.append("\n"); } m_rw.append("|"); m_rw.appendf("9,%.3f", SETTINGS.sensors.temperature.temp_offset); //temp offset strcpy(m_buffer, m_rw.getBuffer()); return true; } bool CommandProcessor::cmdSetMqttDevId(Parser & p, char * buffer) { if(p.getElementAt(1, buffer, BUF_LEN)) { ESP_LOGI(TAG, "new mqtt dev id: '%s'", buffer); strcpy(SETTINGS.mqtt.device_id, buffer); SETTINGS_SAVE; strcpy(m_buffer, "0|ok"); return true; } strcpy(m_buffer, "0|fail"); return true; } bool CommandProcessor::cmdSetTemperatureOffset(Parser & p, char * buffer) { float value = 0; if(strToFloat(getElementAt(1, p, buffer), value)) { ESP_LOGW(TAG, "new temp offset: %f", value); SETTINGS.sensors.temperature.temp_offset = value; SETTINGS_SAVE; strcpy(m_buffer, "9|ok"); return true; } strcpy(m_buffer, "9|fail"); return false; } bool CommandProcessor::cmdAuth(Parser & p, char * buffer) { int value = 0; if(strToInt(getElementAt(1, p, buffer), value)) { if(value == 7856) { m_authenticated = true; m_auth_time = millis(); ESP_LOGW(TAG, "Authenticated for 10s"); strcpy(m_buffer, "pin|ok"); return true; } } return false; } bool CommandProcessor::cmdReadFullMac(Parser & p, char * buffer) { uint8_t wifi_mac[8]; esp_read_mac(wifi_mac, ESP_MAC_WIFI_STA); m_rw.reset(); m_rw.appendf("mac,%02x%02x%02x%02x%02x%02x", wifi_mac[0], wifi_mac[1], wifi_mac[2], wifi_mac[3], wifi_mac[4], wifi_mac[5]); strcpy(m_buffer, m_rw.getBuffer()); return true; } #define COMMAND_START if(false){} #define COMMAND(command, function) else if(strcmp(command, getElementAt(0, p, temp)) == 0) function(p, temp) #define COMMAND_END else strcpy(m_buffer, "error"); char * CommandProcessor::process(const char * data, uint32_t len) { ESP_LOGI(TAG, "%s", data); Parser p((char *)data, "|"); char temp[BUF_LEN]; if(strcmp("pin", getElementAt(0, p, temp)) == 0) { cmdAuth(p, temp); return m_buffer; } if(millis() - m_auth_time > 10000) { ESP_LOGI(TAG, "nut autorized"); m_buffer[0] = 0; return m_buffer; } m_auth_time = millis(); COMMAND_START COMMAND("mac", cmdReadFullMac); COMMAND("Z", cmdSetGroupId); COMMAND("0", cmdSetMqttDevId); COMMAND("-", cmdSetWorkingId); COMMAND("s", cmdRestart); COMMAND("d", cmdDeleteStoredSsids); COMMAND("a", cmdReturnCurrentSsid); COMMAND("w", cmdReturnVisibleNetworks); COMMAND("W", cmdAddNetwork); COMMAND("r", cmdReportAllSettings); COMMAND("9", cmdSetTemperatureOffset); COMMAND_END; if(!m_authenticated) m_buffer[0] = 0; return m_buffer; }