343 lines
9.4 KiB
C++
343 lines
9.4 KiB
C++
#include <esp_log.h>
|
|
|
|
#include "CommandProcessor.h"
|
|
#include "utilities.h"
|
|
#include "Settings.h"
|
|
#include <WiFi.h>
|
|
|
|
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;
|
|
uint8_t wifi_mac[8];
|
|
esp_read_mac(wifi_mac, ESP_MAC_WIFI_STA);
|
|
if(strToInt(getElementAt(1, p, buffer), value))
|
|
{
|
|
ESP_LOGW(TAG, "new group value: %u", value);
|
|
SETTINGS.device.group_id = value;
|
|
SETTINGS_SAVE;
|
|
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]);
|
|
m_rw.append("|Z|ok");
|
|
strcpy(m_buffer, m_rw.getBuffer());
|
|
return true;
|
|
}
|
|
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]);
|
|
m_rw.append("|Z|fail");
|
|
strcpy(m_buffer, m_rw.getBuffer());
|
|
return false;
|
|
}
|
|
|
|
bool CommandProcessor::cmdSetWorkingId(Parser & p, char * buffer)
|
|
{
|
|
int value = 0;
|
|
uint8_t wifi_mac[8];
|
|
esp_read_mac(wifi_mac, ESP_MAC_WIFI_STA);
|
|
if(strToInt(getElementAt(1, p, buffer), value))
|
|
{
|
|
ESP_LOGW(TAG, "new device working id: %u", value);
|
|
SETTINGS.device.tata_id = value;
|
|
SETTINGS_SAVE;
|
|
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]);
|
|
m_rw.append("|-|ok");
|
|
strcpy(m_buffer, m_rw.getBuffer());
|
|
|
|
return true;
|
|
}
|
|
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]);
|
|
m_rw.append("|-|fail");
|
|
strcpy(m_buffer, m_rw.getBuffer());
|
|
|
|
return false;
|
|
}
|
|
|
|
bool CommandProcessor::cmdRestart(Parser & p, char * buffer)
|
|
{
|
|
esp_restart();
|
|
return true;
|
|
}
|
|
|
|
bool CommandProcessor::cmdDeleteStoredSsids(Parser & p, char * buffer)
|
|
{
|
|
uint8_t wifi_mac[8];
|
|
esp_read_mac(wifi_mac, ESP_MAC_WIFI_STA);
|
|
|
|
ESP_LOGW(TAG, "delete stored ssid's");
|
|
SETTINGS.wifi.num = 0;
|
|
SETTINGS_SAVE;
|
|
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]);
|
|
m_rw.append("|d|ok");
|
|
strcpy(m_buffer, m_rw.getBuffer());
|
|
|
|
return true;
|
|
}
|
|
|
|
bool CommandProcessor::cmdReturnCurrentSsid(Parser & p, char * buffer)
|
|
{
|
|
uint8_t wifi_mac[8];
|
|
esp_read_mac(wifi_mac, ESP_MAC_WIFI_STA);
|
|
|
|
ESP_LOGW(TAG, "return current ssid %s and rssi %d", WiFi.SSID().c_str(), WiFi.RSSI());
|
|
|
|
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]);
|
|
m_rw.append("|");
|
|
|
|
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)
|
|
{
|
|
|
|
uint8_t wifi_mac[8];
|
|
esp_read_mac(wifi_mac, ESP_MAC_WIFI_STA);
|
|
|
|
ESP_LOGI(TAG, "Scanning wifi networks...");
|
|
|
|
int num_networks = WiFi.scanNetworks(false, false, false, 0);
|
|
|
|
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]);
|
|
m_rw.append("|");
|
|
|
|
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)
|
|
{
|
|
|
|
uint8_t wifi_mac[8];
|
|
esp_read_mac(wifi_mac, ESP_MAC_WIFI_STA);
|
|
|
|
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;
|
|
|
|
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]);
|
|
m_rw.append("|W|ok");
|
|
strcpy(m_buffer, m_rw.getBuffer());
|
|
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
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]);
|
|
m_rw.append("|W|fail");
|
|
strcpy(m_buffer, m_rw.getBuffer());
|
|
|
|
return false;
|
|
}
|
|
|
|
bool CommandProcessor::cmdReportAllSettings(Parser & p, char * buffer)
|
|
{
|
|
int64_t up_time = esp_timer_get_time();
|
|
uint8_t wifi_mac[8];
|
|
|
|
//added mac address
|
|
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]);
|
|
m_rw.append("|");
|
|
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)
|
|
{
|
|
uint8_t wifi_mac[8];
|
|
esp_read_mac(wifi_mac, ESP_MAC_WIFI_STA);
|
|
if(p.getElementAt(1, buffer, BUF_LEN))
|
|
{
|
|
ESP_LOGI(TAG, "new mqtt dev id: '%s'", buffer);
|
|
strcpy(SETTINGS.mqtt.device_id, buffer);
|
|
SETTINGS_SAVE;
|
|
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]);
|
|
m_rw.append("|0|ok");
|
|
strcpy(m_buffer, m_rw.getBuffer());
|
|
return true;
|
|
}
|
|
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]);
|
|
m_rw.append("|0|fail");
|
|
strcpy(m_buffer, m_rw.getBuffer());
|
|
return true;
|
|
}
|
|
|
|
bool CommandProcessor::cmdSetTemperatureOffset(Parser & p, char * buffer)
|
|
{
|
|
float value = 0;
|
|
uint8_t wifi_mac[8];
|
|
esp_read_mac(wifi_mac, ESP_MAC_WIFI_STA);
|
|
|
|
if(strToFloat(getElementAt(1, p, buffer), value))
|
|
{
|
|
ESP_LOGW(TAG, "new temp offset: %f", value);
|
|
SETTINGS.sensors.temperature.temp_offset = value;
|
|
SETTINGS_SAVE;
|
|
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]);
|
|
m_rw.append("|9|ok");
|
|
strcpy(m_buffer, m_rw.getBuffer());
|
|
|
|
return true;
|
|
}
|
|
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]);
|
|
m_rw.append("|9|fail");
|
|
strcpy(m_buffer, m_rw.getBuffer());
|
|
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;
|
|
} |