diff --git a/LICENSE b/LICENSE index 82a5eca3..aa52acab 100644 --- a/LICENSE +++ b/LICENSE @@ -228,13 +228,13 @@ under this Licence: Most source files in this repository are made available under the Eclipse Public License v1.0. The examples which use a more liberal license. Some of the AES code is available under the LGPL. Refer to each individual source file for more details." ------------------------------------------------------------------------------------------------ -blecount.cpp +blescan.cpp -Parts of blecount.cpp were derived or taken from +Parts of blescan.cpp were derived or taken from nkolban esp32 snippets -BLE Scan -https://github.com/nkolban/esp32-snippets/tree/master/cpp_utils/tests/BLETests/Arduino/BLE_scan +BLE GAP DUMP +https://github.com/nkolban/esp32-snippets/tree/master/BLE/scanner under this Licence: diff --git a/platformio.ini b/platformio.ini index 7f05eab7..f5faf74d 100644 --- a/platformio.ini +++ b/platformio.ini @@ -26,15 +26,11 @@ monitor_baud = 115200 upload_speed = 921600 lib_deps = U8g2 - ESP32 BLE Arduino@0.4.9 build_flags = ;set log level, we need build_flag for this, otherwise we can't use ESP_LOGx in arduino framework -DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_INFO ; -DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_VERBOSE ; -DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_NONE -;needed for ESP32 BLE Ardunio v0.4.9 - -fexceptions - -std=c++11 ;override lora settings from LMiC library in lmic/config.h and use main.h instead -D_lmic_config_h_ -Dheltec_wifi_lora_32 @@ -53,15 +49,11 @@ upload_speed = 921600 ;upload_port = COM15 lib_deps = U8g2 - ESP32 BLE Arduino@0.4.9 build_flags = ;set log level, we need build_flag for this, otherwise we can't use ESP_LOGx in arduino framework -DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_INFO ; -DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_VERBOSE ; -DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_NONE -;needed for ESP32 BLE Ardunio v0.4.9 - -fexceptions - -std=c++11 ;override lora settings from LMiC library in lmic/config.h and use main.h instead -Dttgov1 -D_lmic_config_h_ @@ -79,15 +71,11 @@ monitor_baud = 115200 upload_speed = 921600 lib_deps = U8g2 - ESP32 BLE Arduino@0.4.9 build_flags = ;set log level, we need build_flag for this, otherwise we can't use ESP_LOGx in arduino framework -DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_INFO ; -DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_VERBOSE ; -DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_NONE -;needed for ESP32 BLE Ardunio v0.4.9 - -fexceptions - -std=c++11 ;override lora settings from LMiC library in lmic/config.h and use main.h instead -D_lmic_config_h_ -Dttgov2 @@ -104,16 +92,12 @@ monitor_baud = 115200 upload_speed = 921600 lib_deps = U8g2@>2.21.7 - ESP32 BLE Arduino@0.4.9 SmartLeds build_flags = ;set log level, we need build_flag for this, otherwise we can't use ESP_LOGx in arduino framework -DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_INFO ; -DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_VERBOSE ; -DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_NONE -;needed for ESP32 BLE Ardunio v0.4.9 - -fexceptions - -std=c++11 ;override lora settings from LMiC library in lmic/config.h and use main.h instead -Dlopy -D_lmic_config_h_ @@ -130,16 +114,12 @@ monitor_baud = 115200 upload_speed = 921600 lib_deps = U8g2@>2.21.7 - ESP32 BLE Arduino@0.4.9 SmartLeds build_flags = ;set log level, we need build_flag for this, otherwise we can't use ESP_LOGx in arduino framework -DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_INFO ; -DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_VERBOSE ; -DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_NONE -;needed for ESP32 BLE Ardunio v0.4.9 - -fexceptions - -std=c++11 ;override lora settings from LMiC library in lmic/config.h and use main.h instead -D_lmic_config_h_ -Dlopy4 @@ -156,16 +136,12 @@ monitor_baud = 115200 upload_speed = 256000 lib_deps = U8g2 - ESP32 BLE Arduino@0.4.9 SmartLeds build_flags = ;set log level, we need build_flag for this, otherwise we can't use ESP_LOGx in arduino framework -DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_INFO ; -DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_VERBOSE ; -DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_NONE -;needed for ESP32 BLE Ardunio v0.4.9 - -fexceptions - -std=c++11 ;override lora settings from LMiC library in lmic/config.h and use main.h instead -D_lmic_config_h_ -Dlolin32lite_lora @@ -182,16 +158,12 @@ monitor_baud = 115200 upload_speed = 921600 lib_deps = U8g2 - ESP32 BLE Arduino@0.4.9 SmartLeds build_flags = ;set log level, we need build_flag for this, otherwise we can't use ESP_LOGx in arduino framework -DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_INFO ; -DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_VERBOSE ; -DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_NONE -;needed for ESP32 BLE Ardunio v0.4.9 - -fexceptions - -std=c++11 ;override lora settings from LMiC library in lmic/config.h and use main.h instead -D_lmic_config_h_ -Dlolin32_lora diff --git a/src/blecsan.cpp b/src/blecsan.cpp index 29924507..51dab5c5 100644 --- a/src/blecsan.cpp +++ b/src/blecsan.cpp @@ -1,3 +1,5 @@ +#ifdef BLECOUNTER + /* code snippets taken from https://github.com/nkolban/esp32-snippets/tree/master/BLE/scanner */ @@ -10,6 +12,9 @@ https://github.com/nkolban/esp32-snippets/tree/master/BLE/scanner #include #include +// defined in macsniff.cpp +bool mac_add(uint8_t *paddr, int8_t rssi, bool sniff_type); + #define BT_BD_ADDR_STR "%02x:%02x:%02x:%02x:%02x:%02x" #define BT_BD_ADDR_HEX(addr) addr[0], addr[1], addr[2], addr[3], addr[4], addr[5] @@ -21,7 +26,7 @@ static const char *bt_dev_type_to_string(esp_bt_dev_type_t type); static void gap_callback_handler(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param); // local Tag for logging -static const char *TAG = "paxcnt"; +static const char *TAG = "bt_loop"; static void gap_callback_handler(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param) { @@ -74,6 +79,32 @@ static void gap_callback_handler(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_pa ESP_LOGI(TAG, "num_resps : %d", p->scan_rst.num_resps); + /* to be done here: + #ifdef VENDORFILTER + + filter BLE devices using their advertisements to get filter alternative to vendor OUI + if vendorfiltering is on, we ... + - want to count: mobile phones and tablets + - don't want to count: beacons, peripherals (earphones, headsets, printers), cars and machines + see + https://github.com/nkolban/ESP32_BLE_Arduino/blob/master/src/BLEAdvertisedDevice.cpp + + http://www.libelium.com/products/meshlium/smartphone-detection/ + + https://www.question-defense.com/2013/01/12/bluetooth-cod-bluetooth-class-of-deviceclass-of-service-explained + + https://www.bluetooth.com/specifications/assigned-numbers/baseband + + "The Class of Device (CoD) in case of Bluetooth which allows us to differentiate the type of + device (smartphone, handsfree, computer, LAN/network AP). With this parameter we can + differentiate among pedestrians and vehicles." + + #endif + */ + + // add this device and show new count total if it was not previously added + mac_add((uint8_t *) p->scan_rst.bda, p->scan_rst.rssi, MAC_SNIFF_BLE); + if ( p->scan_rst.search_evt == ESP_GAP_SEARCH_INQ_CMPL_EVT) { // Scan is done. @@ -310,4 +341,6 @@ end: ESP_LOGI(TAG, "Terminating BT logging task"); vTaskDelete(NULL); -} // bt_loop \ No newline at end of file +} // bt_loop + +#endif // BLECOUNTER \ No newline at end of file diff --git a/src/macsniff.cpp b/src/macsniff.cpp index 08e79d8c..0664f179 100644 --- a/src/macsniff.cpp +++ b/src/macsniff.cpp @@ -2,13 +2,6 @@ // Basic Config #include "globals.h" -#ifdef BLECOUNTER - #include - //#include - //#include - //#include -#endif - #ifdef VENDORFILTER #include #include @@ -20,7 +13,6 @@ static const char *TAG = "macsniff"; static wifi_country_t wifi_country = {.cc=WIFI_MY_COUNTRY, .schan=WIFI_CHANNEL_MIN, .nchan=WIFI_CHANNEL_MAX, .policy=WIFI_COUNTRY_POLICY_MANUAL}; -uint16_t currentScanDevice = 0; uint16_t salt; uint16_t salt_reset(void) { @@ -46,31 +38,41 @@ bool mac_add(uint8_t *paddr, int8_t rssi, bool sniff_type) { if ( (sniff_type==MAC_SNIFF_BLE) || std::find(vendors.begin(), vendors.end(), vendor2int) != vendors.end() ) { #endif - // salt and hash MAC, and if new unique one, store identifier in container and increment counter on display - // https://en.wikipedia.org/wiki/MAC_Address_Anonymization + // salt and hash MAC, and if new unique one, store identifier in container and increment counter on display + // https://en.wikipedia.org/wiki/MAC_Address_Anonymization - addr2int += (uint32_t) salt; // add 16-bit salt to pseudo MAC - snprintf(buff, sizeof(buff), "%08X", addr2int); // convert unsigned 32-bit salted MAC to 8 digit hex string - hashedmac = rokkit(&buff[3], 5); // hash MAC last string value, use 5 chars to fit hash in uint16_t container - auto newmac = macs.insert(hashedmac); // add hashed MAC to total container if new unique - added = newmac.second ? true:false; // true if hashed MAC is unique in container + addr2int += (uint32_t) salt; // add 16-bit salt to pseudo MAC + snprintf(buff, sizeof(buff), "%08X", addr2int); // convert unsigned 32-bit salted MAC to 8 digit hex string + hashedmac = rokkit(&buff[3], 5); // hash MAC last string value, use 5 chars to fit hash in uint16_t container + auto newmac = macs.insert(hashedmac); // add hashed MAC to total container if new unique + added = newmac.second ? true:false; // true if hashed MAC is unique in container - // Insert only if it was not found on global count - if (added) { - if (sniff_type == MAC_SNIFF_WIFI ) { - rgb_set_color(COLOR_GREEN); - wifis.insert(hashedmac); // add hashed MAC to wifi container if new unique - } - #ifdef BLECOUNTER + // Insert only if it was not found on global count + if (added) { + + char buff[16]; + snprintf(buff, sizeof(buff), "PAX:%-4d", (int) macs.size()); // convert 16-bit MAC counter to decimal counter value + u8x8.draw2x2String(0, 0, buff); // display number on unique macs total Wifi + BLE + + if (sniff_type == MAC_SNIFF_WIFI ) { + rgb_set_color(COLOR_GREEN); + wifis.insert(hashedmac); // add hashed MAC to wifi container + u8x8.setCursor(0,4); + u8x8.printf("WIFI: %-4d", (int) wifis.size()); + } + #ifdef BLECOUNTER else if (sniff_type == MAC_SNIFF_BLE ) { rgb_set_color(COLOR_MAGENTA); - bles.insert(hashedmac); // add hashed MAC to BLE container if new unique + bles.insert(hashedmac); // add hashed MAC to BLE container + u8x8.setCursor(0,3); + u8x8.printf("BLE: %-4d", (int) bles.size()); } - #endif - // Not sure user will have time to see the LED - // TBD do light off further in the code - rgb_set_color(COLOR_NONE); - } + #endif + + // Not sure user will have time to see the LED + // TBD do light off further in the code + rgb_set_color(COLOR_NONE); + } ESP_LOGI(TAG, "%s RSSI %ddBi -> MAC %s -> Hash %04X -> WiFi:%d BLE:%d %s", sniff_type==MAC_SNIFF_WIFI ? "WiFi":"BLE ", @@ -94,65 +96,6 @@ bool mac_add(uint8_t *paddr, int8_t rssi, bool sniff_type) { return added; // function returns bool if a new and unique Wifi or BLE mac was counted (true) or not (false) } -#ifdef BLECOUNTER - -class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks { - void onResult(BLEAdvertisedDevice advertisedDevice) { - int lastcount = (int) macs.size(); - uint8_t *p = (uint8_t *) advertisedDevice.getAddress().getNative(); - - /* to be done here: - #ifdef VENDORFILTER - - filter BLE devices using their advertisements to get filter alternative to vendor OUI - if vendorfiltering is on, we ... - - want to count: mobile phones and tablets - - don't want to count: beacons, peripherals (earphones, headsets, printers), cars and machines - see - https://github.com/nkolban/ESP32_BLE_Arduino/blob/master/src/BLEAdvertisedDevice.cpp - - http://www.libelium.com/products/meshlium/smartphone-detection/ - - https://www.question-defense.com/2013/01/12/bluetooth-cod-bluetooth-class-of-deviceclass-of-service-explained - - https://www.bluetooth.com/specifications/assigned-numbers/baseband - - "The Class of Device (CoD) in case of Bluetooth which allows us to differentiate the type of - device (smartphone, handsfree, computer, LAN/network AP). With this parameter we can - differentiate among pedestrians and vehicles." - - #endif - */ - - // Current devices seen on this scan session - currentScanDevice++; - u8x8.setCursor(11,3); - u8x8.printf("%-4d", currentScanDevice); - // add this device and show new count total if it was not previously added - if ( mac_add(p, advertisedDevice.getRSSI(), MAC_SNIFF_BLE) ) { - char buff[16]; - snprintf(buff, sizeof(buff), "PAX:%-4d", (int) macs.size()); // convert 16-bit MAC counter to decimal counter value - u8x8.draw2x2String(0, 0, buff); // display number on unique macs total Wifi + BLE - } - } -}; - -void BLECount() { - ESP_LOGI(TAG, "BLE scan started"); - currentScanDevice = 0; // Set 0 seen device on this scan session - u8x8.drawString(0,3,"Scanning->"); - BLEDevice::init(""); // we don't want to be seen by a name - BLEScanResults foundDevices; // instance for getting count - BLEScan* pBLEScan = BLEDevice::getScan(); //create new scan - pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks()); - pBLEScan->setActiveScan(false); // An active scan would mean that we will wish unneeeded scan responses - pBLEScan->setWindow(BLESCANWINDOW); - pBLEScan->setInterval(BLESCANINTERVAL); - pBLEScan->start(cfg.blescantime); // note: this is a blocking call - ESP_LOGI(TAG, "BLE scan done, seen %d device(s)", foundDevices.getCount()); -} -#endif - void wifi_sniffer_init(void) { wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); cfg.nvs_enable = 0; // we don't need any wifi settings from NVRAM diff --git a/src/macsniff.h b/src/macsniff.h index 9fa2496b..441ab157 100644 --- a/src/macsniff.h +++ b/src/macsniff.h @@ -19,10 +19,7 @@ typedef struct { uint8_t payload[0]; /* network data ended with 4 bytes csum (CRC32) */ } wifi_ieee80211_packet_t; -extern uint16_t currentScanDevice; - uint16_t salt_reset(void); -void BLECount(); void wifi_sniffer_init(void); void wifi_sniffer_set_channel(uint8_t channel); void wifi_sniffer_packet_handler(void *buff, wifi_promiscuous_pkt_type_t type); diff --git a/src/main.cpp b/src/main.cpp index 8728dbc9..e44c0cd4 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -215,9 +215,7 @@ void lorawan_loop(void * pvParameters) { void antenna_select(const int8_t _ant); #endif -#ifdef BLECOUNTER - void BLECount(void); -#else +#ifndef BLECOUNTER bool btstop = btStop(); #endif @@ -276,19 +274,7 @@ void sniffer_loop(void * pvParameters) { snprintf(buff, sizeof(buff), "PAX:%d", (int) macs.size()); // convert 16-bit MAC counter to decimal counter value u8x8.draw2x2String(0, 0, buff); // display number on unique macs total - - #ifdef BLECOUNTER - // We just state out of BLE scanning - u8x8.setCursor(0,3); - if (currentScanDevice) { - u8x8.printf("BLE: %-4d %-4d", (int) bles.size(), currentScanDevice); - } else { - u8x8.printf("BLE: %-4d", (int) bles.size()); - } - #endif - - u8x8.setCursor(0,4); - u8x8.printf("WIFI: %-4d", (int) wifis.size()); + u8x8.setCursor(11,4); u8x8.printf("ch:%02i", channel); u8x8.setCursor(0,5); @@ -340,12 +326,14 @@ void sniffer_loop(void * pvParameters) { } // end of send data cycle else { + /* #ifdef BLECOUNTER if (nloop % (WIFI_CHANNEL_MAX * cfg.blescancycle) == 0 ) // once after cfg.blescancycle Wifi scans, do a BLE scan if (cfg.blescan) { // execute BLE count if BLE function is enabled BLECount(); // start BLE scan, this is a blocking call } #endif + */ } // end of channel rotation loop } // end of infinite wifi scan loop } @@ -493,6 +481,13 @@ void setup() { // initialize display init_display(PROGNAME, PROGVERSION); u8x8.setPowerSave(!cfg.screenon); // set display off if disabled + u8x8.draw2x2String(0, 0, "PAX:0"); + u8x8.setCursor(0,4); + u8x8.printf("WIFI: 0"); + #ifdef BLECOUNTER + u8x8.setCursor(0,3); + u8x8.printf("BLE: 0"); + #endif u8x8.setCursor(0,5); u8x8.printf(!cfg.rssilimit ? "RLIM: off" : "RLIM: %d", cfg.rssilimit); u8x8.drawString(0,6,"Join Wait "); @@ -516,16 +511,20 @@ salt_reset(); // get new 16bit for salting hashes xTaskCreatePinnedToCore(lorawan_loop, "loratask", 2048, ( void * ) 1, ( 5 | portPRIVILEGE_BIT ), NULL, 0); ESP_LOGI(TAG, "Starting Wifi task on core 0"); xTaskCreatePinnedToCore(wifi_sniffer_loop, "wifisniffer", 4096, ( void * ) 1, 1, NULL, 0); - ESP_LOGI(TAG, "Starting Bluetooth task on core 0"); - xTaskCreatePinnedToCore(bt_loop, "btscan", 2048, NULL, 5, NULL, 0); + #ifdef BLECOUNTER + ESP_LOGI(TAG, "Starting Bluetooth task on core 0"); + xTaskCreatePinnedToCore(bt_loop, "btscan", 2048, NULL, 5, NULL, 0); + #endif // to come here: code for switching off core 1 #else // run wifi task on core 0 and lora task on core 1 and bt task on core 1 ESP_LOGI(TAG, "Starting Lora task on core 1"); xTaskCreatePinnedToCore(lorawan_loop, "loratask", 2048, ( void * ) 1, ( 5 | portPRIVILEGE_BIT ), NULL, 1); ESP_LOGI(TAG, "Starting Wifi task on core 0"); xTaskCreatePinnedToCore(sniffer_loop, "wifisniffer", 4096, ( void * ) 1, 1, NULL, 0); - ESP_LOGI(TAG, "Starting Bluetooth task on core 1"); - xTaskCreatePinnedToCore(bt_loop, "btscan", 2048, NULL, 5, NULL, 1); + #ifdef BLECOUNTER + ESP_LOGI(TAG, "Starting Bluetooth task on core 1"); + xTaskCreatePinnedToCore(bt_loop, "btscan", 2048, NULL, 5, NULL, 1); + #endif #endif // Finally: kickoff first sendjob and join, then send initial payload "0000" diff --git a/src/main.h b/src/main.h index a532af16..f7273bdd 100644 --- a/src/main.h +++ b/src/main.h @@ -1,7 +1,7 @@ #pragma once // program version - note: increment version after modifications to configData_t struct!! -#define PROGVERSION "1.2.95" // use max 10 chars here! +#define PROGVERSION "1.2.96" // use max 10 chars here! #define PROGNAME "PAXCNT" // Verbose enables serial output @@ -9,7 +9,7 @@ // set this to include BLE counting and vendor filter functions #define VENDORFILTER 1 // comment out if you want to count things, not people -//#define BLECOUNTER 1 // comment out if you don't want BLE count +#define BLECOUNTER 1 // comment out if you don't want BLE count // BLE scan parameters #define BLESCANCYCLE 2 // BLE scan once after each wifi scans