beacon monitor mode implemented (EXPERIMENTAL, untested yet)
This commit is contained in:
parent
cc141bcb67
commit
a030918f91
5
src/beacon_array.h
Normal file
5
src/beacon_array.h
Normal file
@ -0,0 +1,5 @@
|
||||
std::array<uint32_t, 5>::iterator it;
|
||||
|
||||
std::array<uint32_t, 5> beacons = {0x000000000000, 0x000000000000,
|
||||
0x000000000000, 0x000000000000,
|
||||
0x000000000000};
|
@ -30,6 +30,7 @@ void defaultConfig() {
|
||||
cfg.vendorfilter = 1; // 0=disabled, 1=enabled
|
||||
cfg.rgblum = RGBLUMINOSITY; // RGB Led luminosity (0..100%)
|
||||
cfg.gpsmode = 1; // 0=disabled, 1=enabled
|
||||
cfg.monitormode = 0; // 0=disabled, 1=enabled
|
||||
|
||||
strncpy(cfg.version, PROGVERSION, sizeof(cfg.version) - 1);
|
||||
}
|
||||
@ -138,6 +139,10 @@ void saveConfig() {
|
||||
flash8 != cfg.gpsmode)
|
||||
nvs_set_i8(my_handle, "gpsmode", cfg.gpsmode);
|
||||
|
||||
if (nvs_get_i8(my_handle, "monitormode", &flash8) != ESP_OK ||
|
||||
flash8 != cfg.monitormode)
|
||||
nvs_set_i8(my_handle, "monitormode", cfg.monitormode);
|
||||
|
||||
if (nvs_get_i16(my_handle, "rssilimit", &flash16) != ESP_OK ||
|
||||
flash16 != cfg.rssilimit)
|
||||
nvs_set_i16(my_handle, "rssilimit", cfg.rssilimit);
|
||||
@ -313,8 +318,15 @@ void loadConfig() {
|
||||
saveConfig();
|
||||
}
|
||||
|
||||
if (nvs_get_i8(my_handle, "monitormode", &flash8) == ESP_OK) {
|
||||
cfg.monitormode = flash8;
|
||||
ESP_LOGI(TAG, "Monitor mode = %d", flash8);
|
||||
} else {
|
||||
ESP_LOGI(TAG, "Monitor mode set to default %d", cfg.monitormode);
|
||||
saveConfig();
|
||||
}
|
||||
|
||||
nvs_close(my_handle);
|
||||
ESP_LOGI(TAG, "Done");
|
||||
|
||||
}
|
||||
} // loadConfig()
|
||||
|
@ -8,7 +8,7 @@
|
||||
#include <esp32-hal-log.h>
|
||||
|
||||
// attn: increment version after modifications to configData_t truct!
|
||||
#define PROGVERSION "1.3.94" // use max 10 chars here!
|
||||
#define PROGVERSION "1.3.95" // use max 10 chars here!
|
||||
#define PROGNAME "PAXCNT"
|
||||
|
||||
// std::set for unified array functions
|
||||
@ -33,6 +33,7 @@ typedef struct {
|
||||
uint8_t vendorfilter; // 0=disabled, 1=enabled
|
||||
uint8_t rgblum; // RGB Led luminosity (0..100%)
|
||||
uint8_t gpsmode; // 0=disabled, 1=enabled
|
||||
uint8_t monitormode; // 0=disabled, 1=enabled
|
||||
char version[10]; // Firmware version
|
||||
} configData_t;
|
||||
|
||||
|
@ -6,6 +6,9 @@
|
||||
#include "vendor_array.h"
|
||||
#endif
|
||||
|
||||
#include "beacon_array.h"
|
||||
#include "senddata.h"
|
||||
|
||||
// Local logging tag
|
||||
static const char TAG[] = "wifi";
|
||||
|
||||
@ -27,12 +30,21 @@ uint16_t reset_salt(void) {
|
||||
return salt;
|
||||
}
|
||||
|
||||
uint8_t isBeacon(uint32_t mac) {
|
||||
it = std::find(beacons.begin(), beacons.end(), mac);
|
||||
if (it != beacons.end())
|
||||
return std::distance(beacons.begin(), it);
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool mac_add(uint8_t *paddr, int8_t rssi, bool sniff_type) {
|
||||
|
||||
char buff[16]; // temporary buffer for printf
|
||||
bool added = false;
|
||||
uint32_t addr2int, vendor2int; // temporary buffer for MAC and Vendor OUI
|
||||
uint16_t hashedmac; // temporary buffer for generated hash value
|
||||
uint8_t beacon = 0; // beacon number in test monitor mode
|
||||
|
||||
// only last 3 MAC Address bytes are used for MAC address anonymization
|
||||
// but since it's uint32 we take 4 bytes to avoid 1st value to be 0
|
||||
@ -51,6 +63,16 @@ bool mac_add(uint8_t *paddr, int8_t rssi, bool sniff_type) {
|
||||
// and increment counter on display
|
||||
// https://en.wikipedia.org/wiki/MAC_Address_Anonymization
|
||||
|
||||
// in test monitor mode check if MAC is a known beacon
|
||||
if (cfg.monitormode) {
|
||||
beacon = isBeacon(addr2int);
|
||||
if (beacon) {
|
||||
payload.reset();
|
||||
payload.addAlarm(rssi, beacon);
|
||||
senddata(BEACONPORT);
|
||||
}
|
||||
};
|
||||
|
||||
addr2int += (uint32_t)salt; // add 16-bit salt to pseudo MAC
|
||||
snprintf(
|
||||
buff, sizeof(buff), "%08X",
|
||||
|
@ -45,10 +45,10 @@ portMUX_TYPE timerMux =
|
||||
portMUX_INITIALIZER_UNLOCKED; // sync main loop and ISR when modifying IRQ
|
||||
// handler shared variables
|
||||
|
||||
std::set<uint16_t> macs; // associative container holds total of unique MAC
|
||||
std::set<uint16_t> macs; // associative container holding unique MAC
|
||||
// adress hashes (Wifi + BLE)
|
||||
|
||||
// initialize payload ncoder
|
||||
// initialize payload encoder
|
||||
PayloadConvert payload(PAYLOAD_BUFFER_SIZE);
|
||||
|
||||
// local Tag for logging
|
||||
|
@ -55,6 +55,7 @@
|
||||
#define BUTTONPORT 5 // Port on which device sends button pressed signal
|
||||
#define LPP1PORT 1 // Port for Cayenne LPP 1.0 dynamic sensor encoding
|
||||
#define LPP2PORT 2 // Port for Cayenne LPP 2.0 packed sensor encoding
|
||||
#define BEACONPORT 6 // Port on which device sends beacon alarms
|
||||
|
||||
// Some hardware settings
|
||||
#define RGBLUMINOSITY 30 // RGB LED luminosity [default = 30%]
|
||||
|
@ -26,6 +26,11 @@ void PayloadConvert::addCount(uint16_t value1, uint16_t value2) {
|
||||
buffer[cursor++] = lowByte(value2);
|
||||
}
|
||||
|
||||
void PayloadConvert::addAlarm(int8_t rssi, uint8_t msg) {
|
||||
buffer[cursor++] = rssi;
|
||||
buffer[cursor++] = msg;
|
||||
}
|
||||
|
||||
void PayloadConvert::addConfig(configData_t value) {
|
||||
buffer[cursor++] = value.lorasf;
|
||||
buffer[cursor++] = value.txpower;
|
||||
@ -99,6 +104,11 @@ void PayloadConvert::addCount(uint16_t value1, uint16_t value2) {
|
||||
writeUint16(value2);
|
||||
}
|
||||
|
||||
void PayloadConvert::addAlarm(int8_t rssi, uint8_t msg) {
|
||||
writeUint8(rssi);
|
||||
writeUint8(msg);
|
||||
}
|
||||
|
||||
void PayloadConvert::addConfig(configData_t value) {
|
||||
writeUint8(value.lorasf);
|
||||
writeUint8(value.txpower);
|
||||
@ -207,6 +217,19 @@ void PayloadConvert::addCount(uint16_t value1, uint16_t value2) {
|
||||
buffer[cursor++] = lowByte(value2);
|
||||
}
|
||||
|
||||
void PayloadConvert::addAlarm(int8_t rssi, uint8_t msg) {
|
||||
#if (PAYLOAD_ENCODER == 3)
|
||||
buffer[cursor++] = LPP_ALARM_CHANNEL;
|
||||
#endif
|
||||
buffer[cursor++] = LPP_PRESENCE;
|
||||
buffer[cursor++] = msg;
|
||||
#if (PAYLOAD_ENCODER == 3)
|
||||
buffer[cursor++] = LPP_MSG_CHANNEL;
|
||||
#endif
|
||||
buffer[cursor++] = LPP_ANALOG_INPUT;
|
||||
buffer[cursor++] = rssi;
|
||||
}
|
||||
|
||||
void PayloadConvert::addConfig(configData_t value) {
|
||||
#if (PAYLOAD_ENCODER == 3)
|
||||
buffer[cursor++] = LPP_ADR_CHANNEL;
|
||||
|
@ -11,6 +11,8 @@
|
||||
#define LPP_BUTTON_CHANNEL 24
|
||||
#define LPP_ADR_CHANNEL 25
|
||||
#define LPP_TEMP_CHANNEL 26
|
||||
#define LPP_ALARM_CHANNEL 27
|
||||
#define LPP_MSG_CHANNEL 28
|
||||
#endif
|
||||
|
||||
// MyDevices CayenneLPP types
|
||||
@ -20,6 +22,7 @@
|
||||
#define LPP_DIGITAL_OUTPUT 1 // 1 byte
|
||||
#define LPP_ANALOG_INPUT 2 // 2 bytes, 0.01 signed
|
||||
#define LPP_LUMINOSITY 101 // 2 bytes, 1 lux unsigned
|
||||
#define LPP_Presence 102 // 1 byte
|
||||
|
||||
class PayloadConvert {
|
||||
|
||||
@ -33,6 +36,7 @@ public:
|
||||
void addCount(uint16_t value1, uint16_t value2);
|
||||
void addConfig(configData_t value);
|
||||
void addStatus(uint16_t voltage, uint64_t uptime, float cputemp);
|
||||
void addAlarm(int8_t rssi, uint8_t message);
|
||||
#ifdef HAS_GPS
|
||||
void addGPS(gpsStatus_t value);
|
||||
#endif
|
||||
|
@ -170,7 +170,7 @@ void set_display(uint8_t val) {
|
||||
};
|
||||
|
||||
void set_gps(uint8_t val) {
|
||||
ESP_LOGI(TAG, "Remote command: set GPS to %s", val ? "on" : "off");
|
||||
ESP_LOGI(TAG, "Remote command: set GPS mode to %s", val ? "on" : "off");
|
||||
switch (val) {
|
||||
case 1:
|
||||
cfg.gpsmode = val;
|
||||
@ -181,6 +181,18 @@ void set_gps(uint8_t val) {
|
||||
}
|
||||
};
|
||||
|
||||
void set_monitor(uint8_t val) {
|
||||
ESP_LOGI(TAG, "Remote command: set Monitor mode to %s", val ? "on" : "off");
|
||||
switch (val) {
|
||||
case 1:
|
||||
cfg.monitormode = val;
|
||||
break;
|
||||
default:
|
||||
cfg.monitormode = 0;
|
||||
break;
|
||||
}
|
||||
};
|
||||
|
||||
void set_lorasf(uint8_t val) {
|
||||
#ifdef HAS_LORA
|
||||
ESP_LOGI(TAG, "Remote command: set LoRa SF to %d", val);
|
||||
@ -312,8 +324,8 @@ cmd_t table[] = {{0x01, set_rssi, true}, {0x02, set_countmode, true},
|
||||
{0x0b, set_wifichancycle, true}, {0x0c, set_blescantime, true},
|
||||
{0x0d, set_vendorfilter, false}, {0x0e, set_blescan, true},
|
||||
{0x0f, set_wifiant, true}, {0x10, set_rgblum, true},
|
||||
{0x80, get_config, false}, {0x81, get_status, false},
|
||||
{0x84, get_gps, false}};
|
||||
{0x11, set_monitor, true}, {0x80, get_config, false},
|
||||
{0x81, get_status, false}, {0x84, get_gps, false}};
|
||||
|
||||
// check and execute remote command
|
||||
void rcommand(uint8_t cmd, uint8_t arg) {
|
||||
|
Loading…
Reference in New Issue
Block a user