From 39c68d7d7fbbf80be052966cd8352972ad8e5c0b Mon Sep 17 00:00:00 2001 From: Verkehrsrot Date: Mon, 11 Nov 2019 12:28:31 +0100 Subject: [PATCH 1/3] new feature: rcmd 0x17 wifi sniffer on/off --- README.md | 5 +++++ include/globals.h | 1 + include/rcommand.h | 1 + include/wifiscan.h | 1 + platformio.ini | 8 ++++---- src/configmanager.cpp | 13 +++++++++++++ src/rcommand.cpp | 16 ++++++++++++---- src/wifiscan.cpp | 20 ++++++++++++++++---- 8 files changed, 53 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 4504b72b..e7337789 100644 --- a/README.md +++ b/README.md @@ -422,6 +422,11 @@ Note: all settings are stored in NVRAM and will be reloaded when device starts. 0 = battery data off [default] 1 = battery data on, sends voltage on port 8 +0x17 set Wifi scanner + + 0 = disabled + 1 = enabled [default] + 0x80 get device configuration Device answers with it's current configuration on Port 3. diff --git a/include/globals.h b/include/globals.h index aaecfceb..43902886 100644 --- a/include/globals.h +++ b/include/globals.h @@ -72,6 +72,7 @@ typedef struct { uint8_t wifichancycle; // wifi channel switch cycle [seconds/100] uint8_t blescantime; // BLE scan cycle duration [seconds] uint8_t blescan; // 0=disabled, 1=enabled + uint8_t wifiscan; // 0=disabled, 1=enabled uint8_t wifiant; // 0=internal, 1=external (for LoPy/LoPy4) uint8_t vendorfilter; // 0=disabled, 1=enabled uint8_t rgblum; // RGB Led luminosity (0..100%) diff --git a/include/rcommand.h b/include/rcommand.h index b3205256..2f6ae64f 100644 --- a/include/rcommand.h +++ b/include/rcommand.h @@ -8,6 +8,7 @@ #include "lorawan.h" #endif #include "macsniff.h" +#include "wifiscan.h" #include #include "cyclic.h" #include "timekeeper.h" diff --git a/include/wifiscan.h b/include/wifiscan.h index 35c42e06..340208cb 100644 --- a/include/wifiscan.h +++ b/include/wifiscan.h @@ -8,6 +8,7 @@ #include "hash.h" void wifi_sniffer_init(void); +void switch_wifi_sniffer (uint8_t state); static void IRAM_ATTR wifi_sniffer_packet_handler(void *buff, wifi_promiscuous_pkt_type_t type); void switchWifiChannel(TimerHandle_t xTimer); diff --git a/platformio.ini b/platformio.ini index 97e33211..eac7d350 100644 --- a/platformio.ini +++ b/platformio.ini @@ -7,11 +7,11 @@ ; ---> SELECT THE TARGET PLATFORM HERE! <--- [board] -halfile = generic.h +;halfile = generic.h ;halfile = ebox.h ;halfile = eboxtube.h ;halfile = ecopower.h -;halfile = heltec.h +halfile = heltec.h ;halfile = heltecv2.h ;halfile = ttgov1.h ;halfile = ttgov2.h @@ -43,7 +43,7 @@ description = Paxcounter is a device for metering passenger flows in realtime. I [common] ; for release_version use max. 10 chars total, use any decimal format like "a.b.c" -release_version = 1.9.71 +release_version = 1.9.8 ; DEBUG LEVEL: For production run set to 0, otherwise device will leak RAM while running! ; 0=None, 1=Error, 2=Warn, 3=Info, 4=Debug, 5=Verbose debug_level = 3 @@ -51,7 +51,7 @@ extra_scripts = pre:build.py otakeyfile = ota.conf lorakeyfile = loraconf.h lmicconfigfile = lmic_config.h -platform_espressif32 = espressif32@1.11.0 +platform_espressif32 = espressif32@1.11.1 monitor_speed = 115200 upload_speed = 115200 lib_deps_lora = diff --git a/src/configmanager.cpp b/src/configmanager.cpp index 0fd6ca39..9e7fb508 100644 --- a/src/configmanager.cpp +++ b/src/configmanager.cpp @@ -29,6 +29,7 @@ void defaultConfig() { BLESCANINTERVAL / 10; // BT channel scan cycle [seconds/100], default 1 (= 10ms) cfg.blescan = BLECOUNTER; // 0=disabled, 1=enabled + cfg.wifiscan = WIFICOUNTER; // 0=disabled, 1=enabled cfg.wifiant = 0; // 0=internal, 1=external (for LoPy/LoPy4) cfg.vendorfilter = VENDORFILTER; // 0=disabled, 1=enabled cfg.rgblum = RGBLUMINOSITY; // RGB Led luminosity (0..100%) @@ -136,6 +137,10 @@ void saveConfig() { flash8 != cfg.blescan) nvs_set_i8(my_handle, "blescanmode", cfg.blescan); + if (nvs_get_i8(my_handle, "wifiscanmode", &flash8) != ESP_OK || + flash8 != cfg.wifiscan) + nvs_set_i8(my_handle, "wifiscanmode", cfg.wifiscan); + if (nvs_get_i8(my_handle, "wifiant", &flash8) != ESP_OK || flash8 != cfg.wifiant) nvs_set_i8(my_handle, "wifiant", cfg.wifiant); @@ -321,6 +326,14 @@ void loadConfig() { saveConfig(); } + if (nvs_get_i8(my_handle, "wifiscanmode", &flash8) == ESP_OK) { + cfg.wifiscan = flash8; + ESP_LOGI(TAG, "WIFIscanmode = %d", flash8); + } else { + ESP_LOGI(TAG, "WIFIscanmode set to default %d", cfg.wifiscan); + saveConfig(); + } + if (nvs_get_i16(my_handle, "rssilimit", &flash16) == ESP_OK) { cfg.rssilimit = flash16; ESP_LOGI(TAG, "rssilimit = %d", flash16); diff --git a/src/rcommand.cpp b/src/rcommand.cpp index 293e9fae..3f3093de 100644 --- a/src/rcommand.cpp +++ b/src/rcommand.cpp @@ -224,6 +224,13 @@ void set_blescan(uint8_t val[]) { } } +void set_wifiscan(uint8_t val[]) { + ESP_LOGI(TAG, "Remote command: set WIFI scanner to %s", + val[0] ? "on" : "off"); + cfg.wifiscan = val[0] ? 1 : 0; + switch_wifi_sniffer(cfg.wifiscan); +} + void set_wifiant(uint8_t val[]) { ESP_LOGI(TAG, "Remote command: set Wifi antenna to %s", val[0] ? "external" : "internal"); @@ -348,10 +355,11 @@ static cmd_t table[] = { {0x11, set_monitor, 1, true}, {0x12, set_beacon, 7, false}, {0x13, set_sensor, 2, true}, {0x14, set_payloadmask, 1, true}, {0x15, set_bme, 1, true}, {0x16, set_batt, 1, true}, - {0x80, get_config, 0, false}, {0x81, get_status, 0, false}, - {0x83, get_batt, 0, false}, {0x84, get_gps, 0, false}, - {0x85, get_bme, 0, false}, {0x86, get_time, 0, false}, - {0x87, set_time, 0, false}, {0x99, set_flush, 0, false}}; + {0x17, set_wifiscan, 1, true}, {0x80, get_config, 0, false}, + {0x81, get_status, 0, false}, {0x83, get_batt, 0, false}, + {0x84, get_gps, 0, false}, {0x85, get_bme, 0, false}, + {0x86, get_time, 0, false}, {0x87, set_time, 0, false}, + {0x99, set_flush, 0, false}}; static const uint8_t cmdtablesize = sizeof(table) / sizeof(table[0]); // number of commands in command table diff --git a/src/wifiscan.cpp b/src/wifiscan.cpp index d24116fc..3839bf06 100644 --- a/src/wifiscan.cpp +++ b/src/wifiscan.cpp @@ -29,8 +29,8 @@ typedef struct { } wifi_ieee80211_packet_t; // using IRAM_:ATTR here to speed up callback function -static IRAM_ATTR void wifi_sniffer_packet_handler(void *buff, - wifi_promiscuous_pkt_type_t type) { +static IRAM_ATTR void +wifi_sniffer_packet_handler(void *buff, wifi_promiscuous_pkt_type_t type) { const wifi_promiscuous_pkt_t *ppkt = (wifi_promiscuous_pkt_t *)buff; const wifi_ieee80211_packet_t *ipkt = @@ -72,7 +72,6 @@ void wifi_sniffer_init(void) { esp_wifi_set_storage(WIFI_STORAGE_RAM)); // we don't need NVRAM ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_NULL)); ESP_ERROR_CHECK(esp_wifi_set_ps(WIFI_PS_NONE)); // no modem power saving - ESP_ERROR_CHECK(esp_wifi_start()); // must be started to be able to switch ch ESP_ERROR_CHECK(esp_wifi_set_promiscuous_filter(&filter)); // set frame filter ESP_ERROR_CHECK(esp_wifi_set_promiscuous_rx_cb(&wifi_sniffer_packet_handler)); ESP_ERROR_CHECK(esp_wifi_set_promiscuous(true)); // now switch on monitor mode @@ -81,6 +80,19 @@ void wifi_sniffer_init(void) { WifiChanTimer = xTimerCreate("WifiChannelTimer", pdMS_TO_TICKS(cfg.wifichancycle * 10), pdTRUE, (void *)0, switchWifiChannel); + switch_wifi_sniffer(1); +} + +void switch_wifi_sniffer(uint8_t state) { assert(WifiChanTimer); - xTimerStart(WifiChanTimer, 0); + if ((state ? 1 : 0) == 1) { + // switch wifi sniffer on + xTimerStart(WifiChanTimer, 0); + esp_wifi_set_promiscuous(true); + } else { + // switch wifi sniffer off + xTimerStop(WifiChanTimer, 0); + esp_wifi_set_promiscuous(false); + macs_wifi = 0; // clear WIFI counter + } } \ No newline at end of file From f2821fe3b4a166b41e6236c7a344125d5bb9c277 Mon Sep 17 00:00:00 2001 From: Verkehrsrot Date: Mon, 11 Nov 2019 15:22:55 +0100 Subject: [PATCH 2/3] fix WIFICOUNTER=0 guru failure (issue #481) --- src/main.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index bf41a823..f1452fb1 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -364,16 +364,15 @@ void setup() { // start wifi in monitor mode and start channel rotation timer ESP_LOGI(TAG, "Starting Wifi..."); wifi_sniffer_init(); +#else + // switch off wifi + esp_wifi_deinit(); +#endif + // initialize salt value using esp_random() called by random() in // arduino-esp32 core. Note: do this *after* wifi has started, since // function gets it's seed from RF noise get_salt(); // get new 16bit for salting hashes -#else - // switch off wifi - WiFi.mode(WIFI_OFF); - esp_wifi_stop(); - esp_wifi_deinit(); -#endif // start state machine ESP_LOGI(TAG, "Starting Interrupt Handler..."); From c826240d94d565d217f1f87edf8edd20f6f1ba38 Mon Sep 17 00:00:00 2001 From: Verkehrsrot Date: Mon, 11 Nov 2019 15:23:41 +0100 Subject: [PATCH 3/3] Wifi/BLE counter display logic improved --- src/display.cpp | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/display.cpp b/src/display.cpp index 05808f3c..2ac23091 100644 --- a/src/display.cpp +++ b/src/display.cpp @@ -218,12 +218,27 @@ void draw_page(time_t t, uint8_t page) { case 0: // line 3: wifi + bluetooth counters - dp_printf(0, 3, FONT_SMALL, 0, "WIFI:%-5d", macs_wifi); -#if (BLECOUNTER) +#if ((WIFICOUNTER) && (BLECOUNTER)) + if (cfg.wifiscan) + dp_printf(0, 3, FONT_SMALL, 0, "WIFI:%-5d", macs_wifi); + else + dp_printf(0, 3, FONT_SMALL, 0, "%s", "WIFI:off"); if (cfg.blescan) dp_printf(66, 3, FONT_SMALL, 0, "BLTH:%-5d", macs_ble); else dp_printf(66, 3, FONT_SMALL, 0, "%s", "BLTH:off"); +#elif ((WIFICOUNTER) && (!BLECOUNTER)) + if (cfg.wifiscan) + dp_printf(0, 3, FONT_SMALL, 0, "WIFI:%-5d", macs_wifi); + else + dp_printf(0, 3, FONT_SMALL, 0, "%s", "WIFI:off"); +#elif ((!WIFICOUNTER) && (BLECOUNTER)) + if (cfg.blescan) + dp_printf(0, 3, FONT_SMALL, 0, "BLTH:%-5d", macs_ble); + else + dp_printf(0, 3, FONT_SMALL, 0, "%s", "BLTH:off"); +#else + dp_printf(0, 3, FONT_SMALL, 0, "%s", "Sniffer disabled"); #endif // line 4: Battery + GPS status + Wifi channel