//file: main.c or main.cpp #include "Arduino.h" #include "WiFi.h" #include #define NUMPIXELS 8 #define PIN_NEOPIXEL_ONBOARD 39 #define PIN_NEOPIXEL 8 #define NEOPIXEL_POWER 38 #define PROTO_ICMP 1 #define PROTO_TCP 6 #define PROTO_UDP 17 enum mode{Disco, Gauge}; enum mode active_mode = Disco; char ssid[] = "37C3-open"; // your network SSID (name) //char pass[] = "Amsterdamrocks!"; // your network password (use for WPA, or use as key for WEP) Adafruit_NeoPixel pixels(NUMPIXELS, PIN_NEOPIXEL, NEO_GRB + NEO_KHZ800); Adafruit_NeoPixel onboard_pixel(1, PIN_NEOPIXEL_ONBOARD, NEO_GRB + NEO_KHZ800); long last_gauge_show = 0; int packets_received = 0; uint32_t gauge_colors[] = { pixels.Color(0, 255, 0), // red pixels.Color(128, 255, 0), pixels.Color(191, 255, 0), pixels.Color(255, 255, 0), // yellow pixels.Color(255, 191, 0), pixels.Color(255, 128, 0), pixels.Color(255, 64, 0), pixels.Color(255, 0, 0) // red }; uint32_t last_tcp_color = pixels.Color(0,0,0); uint32_t last_udp_color = pixels.Color(0,0,0); void ssh_attempt() { printf("Someone connected to SSH!"); pixels.fill(pixels.Color(255, 0, 0)); pixels.show(); delay(200); pixels.clear(); pixels.show(); delay(100); pixels.setPixelColor(4, last_udp_color); pixels.setPixelColor(5, last_udp_color); pixels.setPixelColor(6, last_udp_color); pixels.setPixelColor(0, last_tcp_color); pixels.setPixelColor(1, last_tcp_color); pixels.setPixelColor(2, last_tcp_color); pixels.show(); } void icmp_ping() { pixels.setPixelColor(3, pixels.Color(255, 255, 255)); pixels.setPixelColor(7, pixels.Color(255, 255, 255)); pixels.show(); delay(100); pixels.setPixelColor(3, 0); pixels.setPixelColor(7, 0); pixels.show(); } extern "C" { void log_packet(uint16_t port, u16_t proto) { if (WiFi.status() == WL_CONNECTED) { if (active_mode == Disco) { uint32_t color = pixels.ColorHSV(port); switch (proto) { case PROTO_ICMP: icmp_ping(); break; case PROTO_TCP: // if (port == 22) { // ssh_attempt(); // } else { pixels.setPixelColor(0, color); pixels.setPixelColor(1, color); pixels.setPixelColor(2, color); pixels.show(); last_tcp_color = color; //} break; case PROTO_UDP: pixels.setPixelColor(4, color); pixels.setPixelColor(5, color); pixels.setPixelColor(6, color); pixels.show(); last_udp_color = color; break; } } else if (active_mode == Gauge) { packets_received++; if (millis() - last_gauge_show > 200) { int num_leds = round(log((double)packets_received)); printf("gauge: Packets: %d LEDs: %d", packets_received, num_leds); if (num_leds > NUMPIXELS) {num_leds = NUMPIXELS;} pixels.clear(); for(int i = 0; i < num_leds; i++) { pixels.setPixelColor(i, gauge_colors[i]); } pixels.show(); packets_received = 0; last_gauge_show = millis(); } } } } } extern "C" void app_main() { initArduino(); #if defined(NEOPIXEL_POWER) // If this board has a power control pin, we must set it to output and high // in order to enable the NeoPixels. We put this in an #if defined so it can // be reused for other boards without compilation errors pinMode(NEOPIXEL_POWER, OUTPUT); digitalWrite(NEOPIXEL_POWER, HIGH); #endif pixels.begin(); // INITIALIZE NeoPixel strip object (REQUIRED) onboard_pixel.begin(); // INITIALIZE NeoPixel strip object (REQUIRED) pixels.setBrightness(255); // not so bright onboard_pixel.setBrightness(50); printf("Connecting"); onboard_pixel.fill(onboard_pixel.Color(255, 255, 0)); onboard_pixel.show(); //WiFi.begin(ssid, pass); WiFi.begin(ssid, NULL); while (WiFi.status() != WL_CONNECTED) { delay(500); printf("."); } onboard_pixel.fill(onboard_pixel.Color(0, 255, 0)); onboard_pixel.show(); printf("\nConnected!\n"); printf("SSID: %s\n", WiFi.SSID().c_str()); printf("IP: %s\n", WiFi.localIP().toString().c_str()); printf("MAC: %s", WiFi.macAddress().c_str()); long last_touch = 0; // Arduino-like loop() while(true){ //int capacity = touchRead(8); //if (capacity > 20000) { // long cur_time = millis(); // if (cur_time - last_touch > 500) { // active_mode = mode((active_mode + 1) % (Gauge + 1)); // pixels.clear(); // printf("changed mode: %u!\n", active_mode); // if (active_mode == Gauge) { // last_gauge_show = millis(); // } // last_touch = cur_time; // } //} ; } }