diff --git a/src/beacon_array.h b/src/beacon_array.h new file mode 100644 index 00000000..8c000930 --- /dev/null +++ b/src/beacon_array.h @@ -0,0 +1,5 @@ +std::array::iterator it; + +std::array beacons = {0x000000000000, 0x000000000000, + 0x000000000000, 0x000000000000, + 0x000000000000}; diff --git a/src/configmanager.cpp b/src/configmanager.cpp index 00005e4a..4ff40a84 100644 --- a/src/configmanager.cpp +++ b/src/configmanager.cpp @@ -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); @@ -307,14 +312,21 @@ void loadConfig() { if (nvs_get_i8(my_handle, "gpsmode", &flash8) == ESP_OK) { cfg.gpsmode = flash8; - ESP_LOGI(TAG, "GPSmode = %d", flash8); + ESP_LOGI(TAG, "GPS mode = %d", flash8); } else { - ESP_LOGI(TAG, "GPSmode set to default %d", cfg.gpsmode); + ESP_LOGI(TAG, "GPS mode set to default %d", cfg.gpsmode); + 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() diff --git a/src/globals.h b/src/globals.h index 5548116f..36884737 100644 --- a/src/globals.h +++ b/src/globals.h @@ -8,7 +8,7 @@ #include // 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; diff --git a/src/macsniff.cpp b/src/macsniff.cpp index 18f743d7..6c3a6e26 100644 --- a/src/macsniff.cpp +++ b/src/macsniff.cpp @@ -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", diff --git a/src/main.cpp b/src/main.cpp index cd36452e..7212462d 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -45,10 +45,10 @@ portMUX_TYPE timerMux = portMUX_INITIALIZER_UNLOCKED; // sync main loop and ISR when modifying IRQ // handler shared variables -std::set macs; // associative container holds total of unique MAC +std::set 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 diff --git a/src/paxcounter.conf b/src/paxcounter.conf index ab6d96fe..3758dd9f 100644 --- a/src/paxcounter.conf +++ b/src/paxcounter.conf @@ -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%] diff --git a/src/payload.cpp b/src/payload.cpp index 5769644f..192e4af5 100644 --- a/src/payload.cpp +++ b/src/payload.cpp @@ -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; diff --git a/src/payload.h b/src/payload.h index 1fb9ba12..4672733f 100644 --- a/src/payload.h +++ b/src/payload.h @@ -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 diff --git a/src/rcommand.cpp b/src/rcommand.cpp index f6183855..cecc3a66 100644 --- a/src/rcommand.cpp +++ b/src/rcommand.cpp @@ -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) {