assign new device id on unpair

This commit is contained in:
technyon
2023-05-06 18:28:14 +02:00
parent ca004171c3
commit 1155dc47c6
8 changed files with 105 additions and 42 deletions

View File

@@ -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

44
NukiDeviceId.cpp Normal file
View File

@@ -0,0 +1,44 @@
#include <cstring>
#include <Arduino.h>
#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;
}

22
NukiDeviceId.h Normal file
View File

@@ -0,0 +1,22 @@
#pragma once
#include <cstdint>
#include <Preferences.h>
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;
};

View File

@@ -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;
}

View File

@@ -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;

View File

@@ -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;
}

View File

@@ -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;

View File

@@ -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()
{}
{
delay(60000);
}