diff --git a/CMakeLists.txt b/CMakeLists.txt index b939c42..69960ad 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -41,6 +41,7 @@ include_directories(${PROJECT_NAME} set(SRCFILES Config.h + NukiDeviceId.cpp CharBuffer.cpp Network.cpp MqttReceiver.h @@ -87,7 +88,7 @@ set(SRCFILES lib/BleScanner/src/BleScanner.cpp lib/MqttLogger/src/MqttLogger.cpp lib/AsyncTCP/src/AsyncTCP.cpp -) + ) file(GLOB_RECURSE SRCFILESREC lib/NimBLE-Arduino/src/*.c diff --git a/NukiDeviceId.cpp b/NukiDeviceId.cpp new file mode 100644 index 0000000..a6e6ecc --- /dev/null +++ b/NukiDeviceId.cpp @@ -0,0 +1,44 @@ +#include +#include +#include "NukiDeviceId.h" +#include "PreferencesKeys.h" + +NukiDeviceId::NukiDeviceId(Preferences* preferences, const std::string& preferencesId) +: _preferences(preferences), + _preferencesId(preferencesId) +{ + _deviceId = _preferences->getUInt(_preferencesId.c_str()); + + if(_deviceId == 0) + { + assignNewId(); + } +} + +uint32_t NukiDeviceId::get() +{ + return _deviceId; +} + +void NukiDeviceId::assignId(const uint32_t& id) +{ + _deviceId = id; + _preferences->putUInt(_preferencesId.c_str(), id); +} + +void NukiDeviceId::assignNewId() +{ + assignId(getRandomId()); +} + +uint32_t NukiDeviceId::getRandomId() +{ + uint8_t rnd[4]; + for(int i=0; i<4; i++) + { + rnd[i] = random(255); + } + uint32_t deviceId; + memcpy(&deviceId, &rnd, sizeof(deviceId)); + return deviceId; +} diff --git a/NukiDeviceId.h b/NukiDeviceId.h new file mode 100644 index 0000000..296f04a --- /dev/null +++ b/NukiDeviceId.h @@ -0,0 +1,22 @@ +#pragma once + +#include +#include + +class NukiDeviceId +{ +public: + NukiDeviceId(Preferences* preferences, const std::string& preferencesId); + + uint32_t get(); + + void assignId(const uint32_t& id); + void assignNewId(); + +private: + uint32_t getRandomId(); + + Preferences* _preferences; + const std::string _preferencesId; + uint32_t _deviceId = 0; +}; \ No newline at end of file diff --git a/NukiOpenerWrapper.cpp b/NukiOpenerWrapper.cpp index d99557e..e649e90 100644 --- a/NukiOpenerWrapper.cpp +++ b/NukiOpenerWrapper.cpp @@ -9,14 +9,18 @@ NukiOpenerWrapper* nukiOpenerInst; AccessLevel NukiOpenerWrapper::_accessLevel = AccessLevel::ReadOnly; -NukiOpenerWrapper::NukiOpenerWrapper(const std::string& deviceName, uint32_t id, BleScanner::Scanner* scanner, NetworkOpener* network, Gpio* gpio, Preferences* preferences) +NukiOpenerWrapper::NukiOpenerWrapper(const std::string& deviceName, NukiDeviceId* deviceId, BleScanner::Scanner* scanner, NetworkOpener* network, Gpio* gpio, Preferences* preferences) : _deviceName(deviceName), - _nukiOpener(deviceName, id), + _deviceId(deviceId), + _nukiOpener(deviceName, _deviceId->get()), _bleScanner(scanner), _network(network), _gpio(gpio), _preferences(preferences) { + Log->print("Device id opener: "); + Log->println(_deviceId->get()); + nukiOpenerInst = this; memset(&_lastKeyTurnerState, sizeof(NukiLock::KeyTurnerState), 0); @@ -300,6 +304,7 @@ void NukiOpenerWrapper::setPin(const uint16_t pin) void NukiOpenerWrapper::unpair() { _nukiOpener.unPairNuki(); + _deviceId->assignNewId(); _paired = false; } diff --git a/NukiOpenerWrapper.h b/NukiOpenerWrapper.h index c0e1345..125bb7e 100644 --- a/NukiOpenerWrapper.h +++ b/NukiOpenerWrapper.h @@ -7,11 +7,12 @@ #include "BleScanner.h" #include "Gpio.h" #include "AccessLevel.h" +#include "NukiDeviceId.h" class NukiOpenerWrapper : public NukiOpener::SmartlockEventHandler { public: - NukiOpenerWrapper(const std::string& deviceName, uint32_t id, BleScanner::Scanner* scanner, NetworkOpener* network, Gpio* gpio, Preferences* preferences); + NukiOpenerWrapper(const std::string& deviceName, NukiDeviceId* deviceId, BleScanner::Scanner* scanner, NetworkOpener* network, Gpio* gpio, Preferences* preferences); virtual ~NukiOpenerWrapper(); void initialize(); @@ -70,6 +71,7 @@ private: NukiOpener::LockAction lockActionToEnum(const char* str); // char array at least 14 characters std::string _deviceName; + NukiDeviceId* _deviceId = nullptr; NukiOpener::NukiOpener _nukiOpener; BleScanner::Scanner* _bleScanner = nullptr; NetworkOpener* _network = nullptr; diff --git a/NukiWrapper.cpp b/NukiWrapper.cpp index 84d5254..c52f977 100644 --- a/NukiWrapper.cpp +++ b/NukiWrapper.cpp @@ -9,14 +9,18 @@ NukiWrapper* nukiInst; AccessLevel NukiWrapper::_accessLevel = AccessLevel::ReadOnly; -NukiWrapper::NukiWrapper(const std::string& deviceName, uint32_t id, BleScanner::Scanner* scanner, NetworkLock* network, Gpio* gpio, Preferences* preferences) +NukiWrapper::NukiWrapper(const std::string& deviceName, NukiDeviceId* deviceId, BleScanner::Scanner* scanner, NetworkLock* network, Gpio* gpio, Preferences* preferences) : _deviceName(deviceName), + _deviceId(deviceId), _bleScanner(scanner), - _nukiLock(deviceName, id), + _nukiLock(deviceName, _deviceId->get()), _network(network), _gpio(gpio), _preferences(preferences) { + Log->print("Device id lock: "); + Log->println(_deviceId->get()); + nukiInst = this; memset(&_lastKeyTurnerState, sizeof(NukiLock::KeyTurnerState), 0); @@ -286,6 +290,7 @@ void NukiWrapper::setPin(const uint16_t pin) void NukiWrapper::unpair() { _nukiLock.unPairNuki(); + _deviceId->assignNewId(); _paired = false; } diff --git a/NukiWrapper.h b/NukiWrapper.h index f15c72c..78b51d8 100644 --- a/NukiWrapper.h +++ b/NukiWrapper.h @@ -8,11 +8,12 @@ #include "Gpio.h" #include "AccessLevel.h" #include "LockActionResult.h" +#include "NukiDeviceId.h" class NukiWrapper : public Nuki::SmartlockEventHandler { public: - NukiWrapper(const std::string& deviceName, uint32_t id, BleScanner::Scanner* scanner, NetworkLock* network, Gpio* gpio, Preferences* preferences); + NukiWrapper(const std::string& deviceName, NukiDeviceId* deviceId, BleScanner::Scanner* scanner, NetworkLock* network, Gpio* gpio, Preferences* preferences); virtual ~NukiWrapper(); void initialize(const bool& firstStart); @@ -69,6 +70,7 @@ private: NukiLock::LockAction lockActionToEnum(const char* str); // char array at least 14 characters std::string _deviceName; + NukiDeviceId* _deviceId = nullptr; NukiLock::NukiLock _nukiLock; BleScanner::Scanner* _bleScanner = nullptr; NetworkLock* _network = nullptr; diff --git a/main.cpp b/main.cpp index 844f09b..46863b7 100644 --- a/main.cpp +++ b/main.cpp @@ -13,6 +13,7 @@ #include "Config.h" #include "RestartReason.h" #include "CharBuffer.h" +#include "NukiDeviceId.h" Network* network = nullptr; NetworkLock* networkLock = nullptr; @@ -22,6 +23,8 @@ BleScanner::Scanner* bleScanner = nullptr; NukiWrapper* nuki = nullptr; NukiOpenerWrapper* nukiOpener = nullptr; PresenceDetection* presenceDetection = nullptr; +NukiDeviceId* deviceIdLock = nullptr; +NukiDeviceId* deviceIdOpener = nullptr; Preferences* preferences = nullptr; EthServer* ethServer = nullptr; Gpio* gpio = nullptr; @@ -112,18 +115,6 @@ void setupTasks() xTaskCreatePinnedToCore(presenceDetectionTask, "prdet", 896, NULL, 5, &presenceDetectionTaskHandle, 1); } -uint32_t getRandomId() -{ - uint8_t rnd[4]; - for(int i=0; i<4; i++) - { - rnd[i] = random(255); - } - uint32_t deviceId; - memcpy(&deviceId, &rnd, sizeof(deviceId)); - return deviceId; -} - void initEthServer(const NetworkDeviceType device) { switch (device) @@ -167,6 +158,17 @@ void setup() initializeRestartReason(); + + uint32_t devIdOpener = preferences->getUInt(preference_device_id_opener); + + deviceIdLock = new NukiDeviceId(preferences, preference_device_id_lock); + deviceIdOpener = new NukiDeviceId(preferences, preference_device_id_opener); + + if(deviceIdLock->get() != 0 && devIdOpener == 0) + { + deviceIdOpener->assignId(deviceIdLock->get()); + } + CharBuffer::initialize(); if(preferences->getInt(preference_restart_timer) != 0) @@ -190,28 +192,6 @@ void setup() networkOpener->initialize(); } - uint32_t deviceIdLock = preferences->getUInt(preference_device_id_lock); - uint32_t deviceIdOpener = preferences->getUInt(preference_device_id_opener); - - delay(1000); - Serial.print("### "); - Serial.print(deviceIdLock); - Serial.print(" | "); - Serial.println(deviceIdOpener); - - if(deviceIdLock == 0 && deviceIdOpener == 0) - { - deviceIdLock = getRandomId(); - preferences->putUInt(preference_device_id_lock, deviceIdLock); - deviceIdOpener = getRandomId(); - preferences->putUInt(preference_device_id_opener, deviceIdOpener); - } - else if(deviceIdLock != 0 && deviceIdOpener == 0) - { - deviceIdOpener = deviceIdLock; - preferences->putUInt(preference_device_id_opener, deviceIdOpener); - } - initEthServer(network->networkDeviceType()); bleScanner = new BleScanner::Scanner(); @@ -247,4 +227,6 @@ void setup() } void loop() -{} \ No newline at end of file +{ + delay(60000); +} \ No newline at end of file