assign new device id on unpair
This commit is contained in:
@@ -41,6 +41,7 @@ include_directories(${PROJECT_NAME}
|
|||||||
|
|
||||||
set(SRCFILES
|
set(SRCFILES
|
||||||
Config.h
|
Config.h
|
||||||
|
NukiDeviceId.cpp
|
||||||
CharBuffer.cpp
|
CharBuffer.cpp
|
||||||
Network.cpp
|
Network.cpp
|
||||||
MqttReceiver.h
|
MqttReceiver.h
|
||||||
|
|||||||
44
NukiDeviceId.cpp
Normal file
44
NukiDeviceId.cpp
Normal 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
22
NukiDeviceId.h
Normal 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;
|
||||||
|
};
|
||||||
@@ -9,14 +9,18 @@
|
|||||||
NukiOpenerWrapper* nukiOpenerInst;
|
NukiOpenerWrapper* nukiOpenerInst;
|
||||||
AccessLevel NukiOpenerWrapper::_accessLevel = AccessLevel::ReadOnly;
|
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),
|
: _deviceName(deviceName),
|
||||||
_nukiOpener(deviceName, id),
|
_deviceId(deviceId),
|
||||||
|
_nukiOpener(deviceName, _deviceId->get()),
|
||||||
_bleScanner(scanner),
|
_bleScanner(scanner),
|
||||||
_network(network),
|
_network(network),
|
||||||
_gpio(gpio),
|
_gpio(gpio),
|
||||||
_preferences(preferences)
|
_preferences(preferences)
|
||||||
{
|
{
|
||||||
|
Log->print("Device id opener: ");
|
||||||
|
Log->println(_deviceId->get());
|
||||||
|
|
||||||
nukiOpenerInst = this;
|
nukiOpenerInst = this;
|
||||||
|
|
||||||
memset(&_lastKeyTurnerState, sizeof(NukiLock::KeyTurnerState), 0);
|
memset(&_lastKeyTurnerState, sizeof(NukiLock::KeyTurnerState), 0);
|
||||||
@@ -300,6 +304,7 @@ void NukiOpenerWrapper::setPin(const uint16_t pin)
|
|||||||
void NukiOpenerWrapper::unpair()
|
void NukiOpenerWrapper::unpair()
|
||||||
{
|
{
|
||||||
_nukiOpener.unPairNuki();
|
_nukiOpener.unPairNuki();
|
||||||
|
_deviceId->assignNewId();
|
||||||
_paired = false;
|
_paired = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -7,11 +7,12 @@
|
|||||||
#include "BleScanner.h"
|
#include "BleScanner.h"
|
||||||
#include "Gpio.h"
|
#include "Gpio.h"
|
||||||
#include "AccessLevel.h"
|
#include "AccessLevel.h"
|
||||||
|
#include "NukiDeviceId.h"
|
||||||
|
|
||||||
class NukiOpenerWrapper : public NukiOpener::SmartlockEventHandler
|
class NukiOpenerWrapper : public NukiOpener::SmartlockEventHandler
|
||||||
{
|
{
|
||||||
public:
|
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();
|
virtual ~NukiOpenerWrapper();
|
||||||
|
|
||||||
void initialize();
|
void initialize();
|
||||||
@@ -70,6 +71,7 @@ private:
|
|||||||
NukiOpener::LockAction lockActionToEnum(const char* str); // char array at least 14 characters
|
NukiOpener::LockAction lockActionToEnum(const char* str); // char array at least 14 characters
|
||||||
|
|
||||||
std::string _deviceName;
|
std::string _deviceName;
|
||||||
|
NukiDeviceId* _deviceId = nullptr;
|
||||||
NukiOpener::NukiOpener _nukiOpener;
|
NukiOpener::NukiOpener _nukiOpener;
|
||||||
BleScanner::Scanner* _bleScanner = nullptr;
|
BleScanner::Scanner* _bleScanner = nullptr;
|
||||||
NetworkOpener* _network = nullptr;
|
NetworkOpener* _network = nullptr;
|
||||||
|
|||||||
@@ -9,14 +9,18 @@
|
|||||||
NukiWrapper* nukiInst;
|
NukiWrapper* nukiInst;
|
||||||
AccessLevel NukiWrapper::_accessLevel = AccessLevel::ReadOnly;
|
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),
|
: _deviceName(deviceName),
|
||||||
|
_deviceId(deviceId),
|
||||||
_bleScanner(scanner),
|
_bleScanner(scanner),
|
||||||
_nukiLock(deviceName, id),
|
_nukiLock(deviceName, _deviceId->get()),
|
||||||
_network(network),
|
_network(network),
|
||||||
_gpio(gpio),
|
_gpio(gpio),
|
||||||
_preferences(preferences)
|
_preferences(preferences)
|
||||||
{
|
{
|
||||||
|
Log->print("Device id lock: ");
|
||||||
|
Log->println(_deviceId->get());
|
||||||
|
|
||||||
nukiInst = this;
|
nukiInst = this;
|
||||||
|
|
||||||
memset(&_lastKeyTurnerState, sizeof(NukiLock::KeyTurnerState), 0);
|
memset(&_lastKeyTurnerState, sizeof(NukiLock::KeyTurnerState), 0);
|
||||||
@@ -286,6 +290,7 @@ void NukiWrapper::setPin(const uint16_t pin)
|
|||||||
void NukiWrapper::unpair()
|
void NukiWrapper::unpair()
|
||||||
{
|
{
|
||||||
_nukiLock.unPairNuki();
|
_nukiLock.unPairNuki();
|
||||||
|
_deviceId->assignNewId();
|
||||||
_paired = false;
|
_paired = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -8,11 +8,12 @@
|
|||||||
#include "Gpio.h"
|
#include "Gpio.h"
|
||||||
#include "AccessLevel.h"
|
#include "AccessLevel.h"
|
||||||
#include "LockActionResult.h"
|
#include "LockActionResult.h"
|
||||||
|
#include "NukiDeviceId.h"
|
||||||
|
|
||||||
class NukiWrapper : public Nuki::SmartlockEventHandler
|
class NukiWrapper : public Nuki::SmartlockEventHandler
|
||||||
{
|
{
|
||||||
public:
|
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();
|
virtual ~NukiWrapper();
|
||||||
|
|
||||||
void initialize(const bool& firstStart);
|
void initialize(const bool& firstStart);
|
||||||
@@ -69,6 +70,7 @@ private:
|
|||||||
NukiLock::LockAction lockActionToEnum(const char* str); // char array at least 14 characters
|
NukiLock::LockAction lockActionToEnum(const char* str); // char array at least 14 characters
|
||||||
|
|
||||||
std::string _deviceName;
|
std::string _deviceName;
|
||||||
|
NukiDeviceId* _deviceId = nullptr;
|
||||||
NukiLock::NukiLock _nukiLock;
|
NukiLock::NukiLock _nukiLock;
|
||||||
BleScanner::Scanner* _bleScanner = nullptr;
|
BleScanner::Scanner* _bleScanner = nullptr;
|
||||||
NetworkLock* _network = nullptr;
|
NetworkLock* _network = nullptr;
|
||||||
|
|||||||
52
main.cpp
52
main.cpp
@@ -13,6 +13,7 @@
|
|||||||
#include "Config.h"
|
#include "Config.h"
|
||||||
#include "RestartReason.h"
|
#include "RestartReason.h"
|
||||||
#include "CharBuffer.h"
|
#include "CharBuffer.h"
|
||||||
|
#include "NukiDeviceId.h"
|
||||||
|
|
||||||
Network* network = nullptr;
|
Network* network = nullptr;
|
||||||
NetworkLock* networkLock = nullptr;
|
NetworkLock* networkLock = nullptr;
|
||||||
@@ -22,6 +23,8 @@ BleScanner::Scanner* bleScanner = nullptr;
|
|||||||
NukiWrapper* nuki = nullptr;
|
NukiWrapper* nuki = nullptr;
|
||||||
NukiOpenerWrapper* nukiOpener = nullptr;
|
NukiOpenerWrapper* nukiOpener = nullptr;
|
||||||
PresenceDetection* presenceDetection = nullptr;
|
PresenceDetection* presenceDetection = nullptr;
|
||||||
|
NukiDeviceId* deviceIdLock = nullptr;
|
||||||
|
NukiDeviceId* deviceIdOpener = nullptr;
|
||||||
Preferences* preferences = nullptr;
|
Preferences* preferences = nullptr;
|
||||||
EthServer* ethServer = nullptr;
|
EthServer* ethServer = nullptr;
|
||||||
Gpio* gpio = nullptr;
|
Gpio* gpio = nullptr;
|
||||||
@@ -112,18 +115,6 @@ void setupTasks()
|
|||||||
xTaskCreatePinnedToCore(presenceDetectionTask, "prdet", 896, NULL, 5, &presenceDetectionTaskHandle, 1);
|
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)
|
void initEthServer(const NetworkDeviceType device)
|
||||||
{
|
{
|
||||||
switch (device)
|
switch (device)
|
||||||
@@ -167,6 +158,17 @@ void setup()
|
|||||||
|
|
||||||
initializeRestartReason();
|
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();
|
CharBuffer::initialize();
|
||||||
|
|
||||||
if(preferences->getInt(preference_restart_timer) != 0)
|
if(preferences->getInt(preference_restart_timer) != 0)
|
||||||
@@ -190,28 +192,6 @@ void setup()
|
|||||||
networkOpener->initialize();
|
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());
|
initEthServer(network->networkDeviceType());
|
||||||
|
|
||||||
bleScanner = new BleScanner::Scanner();
|
bleScanner = new BleScanner::Scanner();
|
||||||
@@ -247,4 +227,6 @@ void setup()
|
|||||||
}
|
}
|
||||||
|
|
||||||
void loop()
|
void loop()
|
||||||
{}
|
{
|
||||||
|
delay(60000);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user