diff --git a/main/BleService.cpp b/main/BleService.cpp index 2a5ccaf..2e77789 100644 --- a/main/BleService.cpp +++ b/main/BleService.cpp @@ -24,7 +24,7 @@ void BleService::start() uint8_t wifi_mac[8]; esp_read_mac(wifi_mac, ESP_MAC_WIFI_STA); - sprintf(m_name, "WP_%02x%02x%02x", wifi_mac[3], wifi_mac[4], wifi_mac[5]); + sprintf(m_name, "WP_%s_%02x%02x%02x", SETTINGS.mqtt.device_id, wifi_mac[3], wifi_mac[4], wifi_mac[5]); NimBLEDevice::init(m_name); NimBLEDevice::setMTU(512); @@ -73,7 +73,10 @@ void BleService::onWrite(NimBLECharacteristic* pCharacteristic) { m_app.getCommandProcessor()->take(); char * buffer = m_app.getCommandProcessor()->process(pCharacteristic->getValue().c_str(), pCharacteristic->getDataLength()); - pCharacteristic->setValue((uint8_t*)buffer, strlen(buffer)); - pCharacteristic->notify(); + if(buffer != nullptr && strlen(buffer) != 0) + { + pCharacteristic->setValue((uint8_t*)buffer, strlen(buffer)); + pCharacteristic->notify(); + } m_app.getCommandProcessor()->give(); } diff --git a/main/BleService.h b/main/BleService.h index 4e6e3c5..a625986 100644 --- a/main/BleService.h +++ b/main/BleService.h @@ -13,7 +13,7 @@ class BleService : public NimBLEServerCallbacks, NimBLECharacteristicCallbacks protected: App & m_app; - char m_name[32]; + char m_name[75]; NimBLEServer * m_server = nullptr; NimBLEService * m_service = nullptr; diff --git a/main/CommandProcessor.cpp b/main/CommandProcessor.cpp index ca090c6..5c4e50d 100644 --- a/main/CommandProcessor.cpp +++ b/main/CommandProcessor.cpp @@ -198,6 +198,34 @@ bool CommandProcessor::cmdSetTemperatureOffset(Parser & p, char * buffer) 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"); @@ -209,7 +237,23 @@ char * CommandProcessor::process(const char * data, uint32_t len) 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); @@ -222,5 +266,8 @@ char * CommandProcessor::process(const char * data, uint32_t len) COMMAND("9", cmdSetTemperatureOffset); COMMAND_END; + if(!m_authenticated) + m_buffer[0] = 0; + return m_buffer; } \ No newline at end of file diff --git a/main/CommandProcessor.h b/main/CommandProcessor.h index f2e393e..111c6af 100644 --- a/main/CommandProcessor.h +++ b/main/CommandProcessor.h @@ -10,6 +10,8 @@ protected: Mutex m_mutex; ReaderWriter m_rw; char m_buffer[512]; + bool m_authenticated = false; + uint32_t m_auth_time = 0; public: CommandProcessor(AppIF & app); @@ -28,4 +30,6 @@ protected: bool cmdReportAllSettings(Parser & p, char * buffer); bool cmdSetTemperatureOffset(Parser & p, char * buffer); bool cmdSetMqttDevId(Parser & p, char * buffer); + bool cmdAuth(Parser & p, char * buffer); + bool cmdReadFullMac(Parser & p, char * buffer); }; \ No newline at end of file diff --git a/main/ProvisionSoftAP.h b/main/ProvisionSoftAP.h index 6e0d822..b651474 100755 --- a/main/ProvisionSoftAP.h +++ b/main/ProvisionSoftAP.h @@ -15,7 +15,7 @@ #include "ReaderWriter.h" #include "Settings.h" -#define INACTIVE_TIMER (2*60*1000*1000) +#define INACTIVE_TIMER (5*60*1000*1000) class ProvisionSoftAP { diff --git a/main/Settings.cpp b/main/Settings.cpp index 39f7b1f..78f75a0 100644 --- a/main/Settings.cpp +++ b/main/Settings.cpp @@ -95,5 +95,5 @@ void Settings::setDefaults() m_data->sensors.temperature.temp_offset = 0; - strcpy(m_data->mqtt.device_id, "client1-authn-ID"); + strcpy(m_data->mqtt.device_id, "0"); } \ No newline at end of file