diff --git a/README.md b/README.md index a0d62858..49e701bf 100644 --- a/README.md +++ b/README.md @@ -98,7 +98,7 @@ Note: all settings are stored in NVRAM and will be reloaded when device starts. 1 ... 255 used for wifi scan radius (greater values increase wifi scan radius, values 50...110 make sense) 0 = Wifi rssi limiter disabled [default] - + 0x02 set counter mode 0 = cyclic unconfirmed, mac counter reset after each wifi scan cycle, data is sent only once [default] @@ -177,7 +177,7 @@ Note: all settings are stored in NVRAM and will be reloaded when device starts. 0x80 get device configuration - device answers with it's current configuration: +device answers with it's current configuration. The configuration is a C structure declared in file [globals.h](src/globals.h#L23-L38) with the following definition: byte 1: Lora SF (7..12) byte 2: Lora TXpower (2..15) @@ -202,7 +202,18 @@ Note: all settings are stored in NVRAM and will be reloaded when device starts. 0x82 get device cpu temperature bytes 1-3: chip temperature in celsius (little endian format) - + +# RGB Led color description + +Description of the RGB LED color (Lopy and Lolin32 only): + +- Yellow quick blink + - LoRaWAN join +- Blue blink + - LoRaWAN transmit (including receive windows) +- Magenta each blink + - BLE Scan, seen a device (new or not) + # License Copyright 2018 Oliver Brandmueller diff --git a/platformio.ini b/platformio.ini index 5afa8b70..4a4ef2f7 100644 --- a/platformio.ini +++ b/platformio.ini @@ -10,10 +10,10 @@ ; ---> SELECT TARGET PLATFORM HERE! <--- [platformio] -;env_default = heltec_wifi_lora_32 +env_default = heltec_wifi_lora_32 ;env_default = ttgov1 ;env_default = ttgov2 -env_default = lopy +;env_default = lopy ;env_default = lopy4 ;env_default = lolin32lite_lora ;env_default = lolin32_lora diff --git a/src/globals.h b/src/globals.h index 1ef61705..56d6b669 100644 --- a/src/globals.h +++ b/src/globals.h @@ -13,9 +13,11 @@ #include #include +// LED controls #ifdef HAS_RGB_LED -#include + #include #endif + #include "rgb_led.h" #include "macsniff.h" diff --git a/src/hal/lolin32_lora.h b/src/hal/lolin32_lora.h index 2b44d105..168f5da8 100644 --- a/src/hal/lolin32_lora.h +++ b/src/hal/lolin32_lora.h @@ -31,3 +31,7 @@ #define OLED_RST U8X8_PIN_NONE // Not reset pin #define OLED_SDA 21 // ESP32 GPIO21 (Pin21) -- OLED SDA #define OLED_SCL 22 // ESP32 GPIO22 (Pin22) -- OLED SCL + +// I2C config for Microchip 24AA02E64 DEVEUI unique address +#define MCP_24AA02E64_I2C_ADDRESS 0x50 // I2C address for the 24AA02E64 +#define MCP_24AA02E64_MAC_ADDRESS 0xF8 // Memory adress of unique deveui 64 bits diff --git a/src/hal/lolin32lite_lora.h b/src/hal/lolin32lite_lora.h index c9ce785b..d631ccc0 100644 --- a/src/hal/lolin32lite_lora.h +++ b/src/hal/lolin32lite_lora.h @@ -30,3 +30,7 @@ #define OLED_RST U8X8_PIN_NONE // Not reset pin #define OLED_SDA 14 // ESP32 GPIO14 (Pin14) -- OLED SDA #define OLED_SCL 12 // ESP32 GPIO12 (Pin12) -- OLED SCL + +// I2C config for Microchip 24AA02E64 DEVEUI unique address +#define MCP_24AA02E64_I2C_ADDRESS 0x50 // I2C address for the 24AA02E64 +#define MCP_24AA02E64_MAC_ADDRESS 0xF8 // Memory adress of unique deveui 64 bits diff --git a/src/macsniff.cpp b/src/macsniff.cpp index 453c55f9..773915be 100644 --- a/src/macsniff.cpp +++ b/src/macsniff.cpp @@ -85,11 +85,14 @@ class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks { void onResult(BLEAdvertisedDevice advertisedDevice) { uint8_t *p = (uint8_t *) advertisedDevice.getAddress().getNative(); + rgb_set_color(COLOR_MAGENTA); // Current devices seen on this scan session currentScanDevice++; mac_add(p, advertisedDevice.getRSSI(), MAC_SNIFF_BLE); u8x8.setCursor(12,3); u8x8.printf("%d", currentScanDevice); + rgb_set_color(COLOR_NONE); + } }; diff --git a/src/main.cpp b/src/main.cpp index 8e7d9fad..d808640b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -29,7 +29,7 @@ Refer to LICENSE.txt file in repository for more details. #include // OLED driver -#include +#include // includes if needed for other on board i2c components // LMIC-Arduino LoRaWAN Stack #include "loraconf.h" @@ -259,7 +259,6 @@ void wifi_sniffer_loop(void * pvParameters) { channel = (channel % WIFI_CHANNEL_MAX) + 1; // rotates variable channel 1..WIFI_CHANNEL_MAX wifi_sniffer_set_channel(channel); ESP_LOGI(TAG, "Wifi set channel %d", channel); - u8x8.setCursor(0,5); u8x8.printf(!cfg.rssilimit ? "RLIM: off" : "RLIM: %4i", cfg.rssilimit); u8x8.setCursor(11,5); @@ -283,13 +282,14 @@ void wifi_sniffer_loop(void * pvParameters) { bles.clear(); // clear BLE macs counter #endif salt = random(65536); // get new 16bit random for salting hashes - u8x8.clearLine(0); u8x8.clearLine(1); // clear Display counter + u8x8.clearLine(0); u8x8.clearLine(1); // clear Display counter } // wait until payload is sent, while wifi scanning and mac counting task continues lorawait = 0; while(LMIC.opmode & OP_TXRXPEND) { - if(!lorawait) u8x8.drawString(0,6,"LoRa wait "); + if(!lorawait) + u8x8.drawString(0,6,"LoRa wait "); lorawait++; // in case sending really fails: reset and rejoin network if( (lorawait % MAXLORARETRY ) == 0) { @@ -303,11 +303,12 @@ void wifi_sniffer_loop(void * pvParameters) { u8x8.clearLine(6); if (cfg.screenon && cfg.screensaver) { - vTaskDelay(2000/portTICK_PERIOD_MS); // pause for displaying results - } - yield(); - u8x8.setPowerSave(1 && cfg.screensaver); // set display off if screensaver is enabled + vTaskDelay(2000/portTICK_PERIOD_MS); // pause for displaying results + yield(); + u8x8.setPowerSave(1 && cfg.screensaver); // set display off if screensaver is enabled + } } // 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 @@ -345,6 +346,8 @@ void init_display(const char *Productname, const char *Version) { u8x8.begin(); u8x8.setFont(u8x8_font_chroma48medium8_r); #ifdef HAS_DISPLAY + u8x8.begin(); + u8x8.setFont(u8x8_font_chroma48medium8_r); uint8_t buf[32]; u8x8.clear(); u8x8.setFlipMode(0); @@ -392,9 +395,9 @@ void init_display(const char *Productname, const char *Version) { void setup() { - // disable brownout detection + // disable brownout detection #ifdef DISABLE_BROWNOUT - // Register with brownout is at address DR_REG_RTCCNTL_BASE + 0xd4 + // register with brownout is at address DR_REG_RTCCNTL_BASE + 0xd4 (*((volatile uint32_t *)ETS_UNCACHED_ADDR((DR_REG_RTCCNTL_BASE+0xd4)))) = 0; #endif @@ -411,10 +414,10 @@ void setup() { ESP_LOGI(TAG, "Starting %s %s", PROGNAME, PROGVERSION); rgb_set_color(COLOR_NONE); - // system event handler for wifi task, needed for wifi_sniffer_init() + // initialize system event handler for wifi task, needed for wifi_sniffer_init() esp_event_loop_init(NULL, NULL); - // Print chip information on startup + // print chip information on startup if in verbose mode #ifdef VERBOSE esp_chip_info_t chip_info; esp_chip_info(&chip_info); @@ -427,16 +430,16 @@ void setup() { ESP_LOGI(TAG, "ESP32 SDK: %s", ESP.getSdkVersion()); #endif - // Read settings from NVRAM + // read settings from NVRAM loadConfig(); // includes initialize if necessary - // initialize hardware + // initialize led if needed #ifdef HAS_LED - // initialize LED pinMode(HAS_LED, OUTPUT); digitalWrite(HAS_LED, LOW); #endif + // initialize button handling if needed #ifdef HAS_BUTTON #ifdef BUTTON_PULLUP // install button interrupt (pullup mode) @@ -449,31 +452,56 @@ void setup() { #endif #endif - // initialize wifi antenna + // initialize wifi antenna if needed #ifdef HAS_ANTENNA_SWITCH antenna_init(); #endif - // initialize salt value using esp_random() called by random() in arduino-esp32 core - salt = random(65536); // get new 16bit random for salting hashes + // read DEVEUI from Microchip 24AA02E64 2Kb serial eeprom if present +#ifdef MCP_24AA02E64_I2C_ADDRESS + uint8_t i2c_ret; + // Init this before OLED, we just need to get value then we're done with i2c bus + Wire.begin(OLED_SDA, OLED_SDA, 100000); + Wire.beginTransmission(MCP_24AA02E64_I2C_ADDRESS); + Wire.write(MCP_24AA02E64_MAC_ADDRESS); + i2c_ret = Wire.endTransmission(); + // check if device seen on i2c bus + if (i2c_ret == 0) { + char deveui[24]; + uint8_t data; + Wire.beginTransmission(MCP_24AA02E64_I2C_ADDRESS); + while (Wire.available()) { + data = Wire.read(); + sprintf(deveui+strlen(deveui), "%02X ", data) ; + } + i2c_ret = Wire.endTransmission(); + ESP_LOGI(TAG, "Serial EEPROM 24AA02E64 found, read DEVEUI %s", deveui); + } else { + ESP_LOGI(TAG, "Serial EEPROM 24AA02E64 not found ret=%d", i2c_ret); + } +#endif // MCP 24AA02E64 - // initialize display +// initialize display init_display(PROGNAME, PROGVERSION); u8x8.setPowerSave(!cfg.screenon); // set display off if disabled u8x8.setCursor(0,5); u8x8.printf(!cfg.rssilimit ? "RLIM: off" : "RLIM: %4i", cfg.rssilimit); u8x8.drawString(0,6,"Join Wait "); - // output LoRaWAN keys to console +// output LoRaWAN keys to console #ifdef VERBOSE printKeys(); -#endif // VERBOSE +#endif - os_init(); // setup LMIC - os_setCallback(&initjob, lora_init); // setup initial job & join network - wifi_sniffer_init(); // setup wifi in monitor mode and start MAC counting +os_init(); // setup LMIC +os_setCallback(&initjob, lora_init); // setup initial job & join network +wifi_sniffer_init(); // setup wifi in monitor mode and start MAC counting + +// initialize salt value using esp_random() called by random() in arduino-esp32 core +// note: do this *after* wifi has started, since gets it's seed from RF noise +salt = random(65536); // get new 16bit random for salting hashes - // Start FreeRTOS tasks +// Start FreeRTOS tasks #if CONFIG_FREERTOS_UNICORE // run all tasks on core 0 and switch off core 1 ESP_LOGI(TAG, "Starting Lora task on core 0"); xTaskCreatePinnedToCore(lorawan_loop, "loratask", 2048, ( void * ) 1, ( 5 | portPRIVILEGE_BIT ), NULL, 0); @@ -487,9 +515,9 @@ void setup() { xTaskCreatePinnedToCore(wifi_sniffer_loop, "wifisniffer", 4096, ( void * ) 1, 1, NULL, 0); #endif - // Kickoff first sendjob, use payload "0000" - uint8_t mydata[] = "0000"; - do_send(&sendjob); +// Finally: kickoff first sendjob and join, then send initial payload "0000" +uint8_t mydata[] = "0000"; +do_send(&sendjob); } /* end Aruino SETUP ------------------------------------------------------------ */ diff --git a/src/main.h b/src/main.h index 94c49006..dafa8329 100644 --- a/src/main.h +++ b/src/main.h @@ -1,5 +1,5 @@ // program version - note: increment version after modifications to configData_t struct!! -#define PROGVERSION "1.2.88" // use max 10 chars here! +#define PROGVERSION "1.2.9" // use max 10 chars here! #define PROGNAME "PAXCNT" // Verbose enables serial output @@ -10,7 +10,7 @@ #define BLECOUNTER 1 // comment out if you don't want BLE count // BLE scan time -#define BLESCANTIME 15 // [seconds] +#define BLESCANTIME 10 // [seconds] #define BLESCANCYCLE 2 // BLE scan once after each wifi scans // WiFi Sniffer cycle interval