macsbug

Just another WordPress.com site

PacketMonitor32 with M5STACK

with 7 comments

PacketMonitor32 を M5STACK に移植しました。      2018.01.11 , 2018.03.28 rev 1

PacketMonitor とは 選択したWiFiチャンネルにあるデバイスの トラフィックを表示します。
表示は [ Channel ], [ RSSI (平均) ], [ Packet per Second ], [ death packets ], [ SD Card enabled ]
ボタンをクリックすると、監視している WiFiチャンネル (1-14 ch) が変更されます。
トラフィックをキャプチャする為の SDカードのサポートがあります。

M5STACK ( ESP32 + 320×240 TFT + SD Slot + Speaker + SW + BAT ):$35
M5STACK は Micro SD を入れるだけで使用できます。

LOLIN32 Pro ( ESP32-WROVER + SD Slot ):$10.78
0.96″ 128×64 OLED SSD1306 を追加しました。

TTGO T2 ( ESP-WROOM-32 + 0.95″ 96×64 Color OLED + SD Slot ):$13.55
Color OLED と SD Slot 付きです。Color OLED は小型ですが綺麗です。

PacketMonitor32spacehuhn氏により作成されたもので ハードの構成は
D-duino-32 SD + 128×64 OLED SSD1306 + micro SD card です。
spacehuhn氏に感謝致します。


マイクロSDカード:
1. 条件:16MB , FAT32 フォーマット , CLASS 10:高速なSDである事。
2. カードを取り出してボードを稼働させたい場合は「SD」が表示されなくなるまで
_ ボタンを2秒間押し続けます。
_ ボードが起動するたびに SDのルートフォルダに新しい.pcapファイルが作成されます。
_ これらのファイルは 「Wireshark 」で開くことができます。
_ 全てのパケットを常に保存することはできません。
_ 保存できるパケットが増えれば、パケットは廃棄されます。


移植:
1. ディスプレー :SSD1306 のドライバーを ILI9341 の記述に変更しました。
_ 例:display — M5.Lcd。変数の配置変更。
_ グラフ表示:ディスプレーの大きさに合わせて サイズを変更しました。
_ 例:display..drawString — M5.Lcd.drawString 。変数の配置変更。
_ 例:display..drawLine —— M5.Lcd.drawLine 。 変数の配置変更。

2. SD MMC:SD の記述に変更しました。( MMC を理解していません )
_ 例:SD_MMC — SD
_ M5STACK SDの配線
_  GPIO23=MOSI(CMD),19=MISO(D0), GPIO18=CLK, GPIO4=CS(CD/D3)

3. 条件:Packet は 毎秒の為、表示や 特にSDが高速である事が重要です。
_ シリアルモニターに「24546 bytes written for 86 ms」とか表示されます。
_ SPIの通信方式や SDの速度、ESP32ボードの構成により異なります。
_ 1秒間に行う動作:パケット受信 と 表示 と SDへの書込み。
_ SDへの書込時間が短い事が必要です。

書き込み データー:
_ 書き込みデーターの容量:1回に 約25KB です。
_ 書き込み速度:66 〜 92msec。約50sec に一度 500 〜 1000msec が起きます。


動作内容:
1. パケットの検出。
2. ディスプレーの表示。
3. SD へ書き込み。
_ 1秒間に パケット検出、ディスプレー表示、SD書き込み が行われます。
_ ディスプレーの表示 と SD へ書き込み が高速である事が 望まれます。
_ スケッチの中で
_ SD への書き込み速度が 450msec とかになると 書き込まれません。
_ テクニック:初期設定で SPIの速度「 SD.begin(sd_ss, SPI, 20000000);」
_  にする。SPI.begin 設定の前に SPI.end(); で SDを確実に設定します。
_  SPI は 通常 4MHz ですが 例として「SD.begin(sd_ss, SPI, 24000000);」
_  で 24MHz に設定し高速になります。

SD書き込み速度:シリアルモニターで観測。
_ 書込み速度が速い程 Packet のモニターに時間を使用する事が出来ます。
_ たまにSDへの書込み速度が低下する場所があります。
_ M5STACK は 約150msec。
_ LOLIN32 Pro は 約50msec。ただし不安定です。
_ TTGO T2 は 約50msec。

Wireshark を使用した 解析表示の例:


課題:
1. スケッチの書き方で速度が変わります。特に SDの setup の設定です。
_ SPI の設定が複数ある場合、SPI.end(); が必要です。
2. LOLIN32 Pro は SD の認識でロスする場合があり リトライで対応しています。
3. 速度や間欠部は 課題です。


参考:
1. acketMonitor32 Interface Explaination:表示とボタンの説明。
2. spacehuhn / PacketMonitor32
3. spacehuhn / ESP8266 PakcketMonitor
4. tindle:WiFi Packet Monitor V3 (Preflashed D-duino-32 SD)
5. Aliexpress:DSTIKE Store:WiFi Packet Monitor V3(Preflashed D-duino-32 SD)
6. YouTube:PacketMonitor32
7. M5STACK Pinout


感想:
1. PacketMonitor32 を作成された spacehuhn氏のリストは奥深く
_ 私には 理解できない高度なレベルの記述が多々あります。
_ よって 知りえる程度でスケッチを変更しました。
_ 特に感心したのは グラフと横スクロール の方法です。
_ この方法をマスターすると素晴らしい表現が出来るかと思います。
2. SD と SDMMC:
_ SD式の信号は D3/CD, MOSI(CMD), CLK, MISO/D0
_ で 4本配線の回路になっています
_ SDMMC式の信号は D2, C2/D3, MOSI/CMD, CLK, MISO(D0), D1
_ で 6本配線の回路になっています
_ 6本配線は 「D-Duino32 SD」と「魔法の大鍋氏のESP32ボード」があります。
_ 魔法の大鍋氏は製作時に ESP社の基本に基づき作られました。
_ PacketMonitor32 のボードは SDMMC回路のボードと思われます。
_ LOLIN32 Pro の回路は SDMMC接続の回路になっています。
_ D2=GPIO12, C2/D3=13, MOSI/CMD=15, CLK=14, MISO(D0)=2,D1=4
_ です。
_ M5STACK は SD 回路です。
_ TTGO T2 は SD 回路です。
_ 他の SD 付きの ESP32 ボードは SD式で構成されています。
2. SD CARD:
_ 使用した SD は マイクロSD 16G FAT32 Class 10 です。
_ SD を理解していなく 又 手持ちにある SD は マイクロSDです。
_ ESP32 のライブラリーに SD と SDMMC のサンプルがあります。
_ これは マイクロSDで動作します。(意味が解っていないかも)
_ PacketMonitor32 のスケッチは SDMMC を使用しています。
_ この SDMMC の記述では書込みエラーがでて使用できません。
_ SDMMC の記述を SD に変更して動くようにしました。
3. 画面の大きさ:
_ 小さい画面の場合、スクロール等の工夫が必要でプログラムが負担です。
_ M5STACK の画面は大きく 縦側に数値を表示し見やすくなりました。
_ 工夫すると見栄えの良い物ができますし高機能になります。
4. アクリル台:
_ ダイソー:L型 カードスタンド です。6.5 x4cm。2個で100円。


スケッチ:PacketMonitor32 of M5STACK.

訂正事項:77行目の M5.Lcd.drawString( “Made with <_3 by”, 24, 44);
_ の 「<_3 」は「 _ 」 を取り除いて「<3」に変更してください。
_ 装置がネットに接続されいますと 画面に素晴らしい文字が表示されます。
_ 205行目の「:D_ *」は「_ 」 を取り除いて「:D *」にしてください。emojiです。
補足:フォント “Free_Fonts.h” をスケッチ内に入れておきます。
補足:LOLIN32 Pro と TTGO T2 のリストは省略致します。

// PacketMonitor32 of M5STACK : 2018.01.11 macsbug
// spacehuhn/PacketMonitor32 : 
//  https://github.com/spacehuhn/PacketMonitor32/
// DISPLAY: Channel,RSSI,Packet per Second,deauth packets,SD Card enabled
// Button : click to change channel hold to dis/enable SD
// SD : GPIO4=CS(CD/D3), 23=MOSI(CMD), 18=CLK, 19=MISO(D0)
//--------------------------------------------------------------------
#include <M5Stack.h>
#include "Free_Fonts.h"
#include <SPI.h>
#include "freertos/FreeRTOS.h"
#include "esp_wifi.h"
#include "esp_wifi_types.h"
#include "esp_system.h"
#include "esp_event.h"
#include "esp_event_loop.h"
#include "nvs_flash.h"
#include <stdio.h>
#include <string>
#include <cstddef>
#include <Preferences.h>
#define MAX_CH 14     // 1-14ch(1-11 US,1-13 EU and 1-14 Japan)
#define SNAP_LEN 2324 // max len of each recieved packet
#define BUTTON_PIN 39 // button to change the channel
#define MAX_X 315     // 128
#define MAX_Y 230     //  51
#if CONFIG_FREERTOS_UNICORE
#define RUNNING_CORE 0
#else
#define RUNNING_CORE 1
#endif
#include "Buffer.h"
#include "FS.h"
#include "SD.h"
enum { sd_sck = 18, sd_miso = 19, sd_mosi = 23, sd_ss = 4 };
esp_err_t event_handler(void* ctx,system_event_t* event){return ESP_OK;}
/* ===== run-time variables ===== */
Buffer sdBuffer;
Preferences preferences;
bool useSD = false;
bool buttonPressed = false;
bool buttonEnabled = true;
uint32_t lastDrawTime;
uint32_t lastButtonTime;
uint32_t tmpPacketCounter;
uint32_t pkts[MAX_X]; // here the packets per second will be saved
uint32_t deauths = 0; // deauth frames per second
unsigned int ch = 1;  // current 802.11 channel
int rssiSum;

// ===== main program ================================================
void setup() {
  // Serial ----------------------------------------------------------
  Serial.begin(115200);
  // System & WiFi ---------------------------------------------------
  nvs_flash_init();
  tcpip_adapter_init();
  wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
  ESP_ERROR_CHECK(esp_event_loop_init(event_handler, NULL));
  ESP_ERROR_CHECK(esp_wifi_init(&cfg));
  //ESP_ERROR_CHECK(esp_wifi_set_country(WIFI_COUNTRY_EU));
  ESP_ERROR_CHECK(esp_wifi_set_storage(WIFI_STORAGE_RAM));
  ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_NULL));
  ESP_ERROR_CHECK(esp_wifi_start());
  esp_wifi_set_channel(ch, WIFI_SECOND_CHAN_NONE);
  // display -------------------------------------------------------
  M5.begin();
  dacWrite(25, 0); // Speaker OFF
  M5.Lcd.fillScreen(TFT_BLACK);
  M5.Lcd.setTextColor(WHITE, BLACK);
  M5.Lcd.setTextSize(1);
  M5.Lcd.setRotation(0);
  /* show start screen */
  M5.Lcd.fillScreen(BLACK);
  M5.Lcd.setFreeFont(FM12);
  M5.Lcd.drawString( "PacketMonitor32", 6, 24);
  M5.Lcd.drawString( "Made with <_3 by", 24, 44);
  M5.Lcd.drawString( "@Spacehuhn", 29, 64);
  delay(3000);
  M5.Lcd.fillScreen(BLACK);
  M5.Lcd.setFreeFont(FM9);
  int s = 10, a = 0;
  M5.Lcd.setTextColor( WHITE, BLACK);  // Pkts Scale
  for ( int ypos = MAX_Y; ypos > 120; ypos = ypos - s ){
    M5.Lcd.setTextDatum(MR_DATUM);
    M5.Lcd.drawString(String( MAX_Y - ypos ),30, ypos - 1 - a);
    a = a + 10;
  }
  M5.Lcd.setFreeFont(FM9);
  M5.Lcd.setTextDatum(TL_DATUM);
  M5.Lcd.fillRect(0, 0, 320, 20, BLUE);
  // SD card ---------------------------------------------------------
  SPI.end();
  SPI.begin(sd_sck, sd_miso, sd_mosi, sd_ss); 
  SD.begin(sd_ss, SPI, 24000000);
  if(!SD.begin(sd_ss,SPI)){
    Serial.println("Card Mount Failed");return;
  }
  sdBuffer = Buffer();
  if (setupSD()){sdBuffer.open(&SD);Serial.println(" SD CHECK OPEN");
  }
  // I/O -----------------------------------------------------------
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  // second core ----------------------------------------------------
  xTaskCreatePinnedToCore(
    coreTask,               /* Function to implement the task */
    "coreTask",             /* Name of the task */
    2500,                   /* Stack size in words */
    NULL,                   /* Task input parameter */
    0,                      /* Priority of the task */
    NULL,                   /* Task handle. */
    RUNNING_CORE);          /* Core where the task should run */
  // start Wifi sniffer ---------------------------------------------
  esp_wifi_set_promiscuous_rx_cb(&wifi_promiscuous);
  esp_wifi_set_promiscuous(true);
}
// ===== main program ================================================
void loop() {
  vTaskDelay(portMAX_DELAY);
  
}
// ===== functions ===================================================
double getMultiplicator() {
  uint32_t maxVal = 1;
  for (int i = 0; i < MAX_X; i++) {
    if (pkts[i] > maxVal) maxVal = pkts[i];
  }
  if (maxVal > MAX_Y) return (double)MAX_Y / (double)maxVal;
  else return 1;
}
// ===== functions ===================================================
void setChannel(int newChannel) {
  ch = newChannel;
  if (ch > MAX_CH || ch < 1) ch = 1;
  preferences.begin("packetmonitor32", false);
  preferences.putUInt("channel", ch);
  preferences.end();
  esp_wifi_set_promiscuous(false);
  esp_wifi_set_channel(ch, WIFI_SECOND_CHAN_NONE);
  esp_wifi_set_promiscuous_rx_cb(&wifi_promiscuous);
  esp_wifi_set_promiscuous(true);
}
// ===== functions ===================================================
bool setupSD() {
  if (!SD.begin(sd_ss, SPI)) {
    Serial.println("Card Mount Failed"); return false;
  }
  uint8_t cardType = SD.cardType();
  if (cardType == CARD_NONE) {
    Serial.println("No SD_MMC card attached"); return false;
  }
  Serial.print("SD_MMC Card Type: ");
  if (cardType == CARD_MMC){         Serial.println("MMC");
  } else if (cardType == CARD_SD){   Serial.println("SDSC");
  } else if (cardType == CARD_SDHC){ Serial.println("SDHC");
  } else {                           Serial.println("UNKNOWN");
  }
  uint64_t cardSize = SD.cardSize() / (1024 * 1024);
  Serial.printf("SD_MMC Card Size: %lluMB\n", cardSize);
  return true;
}
// ===== functions ===================================================
void wifi_promiscuous(void* buf, wifi_promiscuous_pkt_type_t type) {
  wifi_promiscuous_pkt_t* pkt = (wifi_promiscuous_pkt_t*)buf;
  wifi_pkt_rx_ctrl_t ctrl = (wifi_pkt_rx_ctrl_t)pkt->rx_ctrl;
  if (type == WIFI_PKT_MGMT && 
     (pkt->payload[0] == 0xA0 || pkt->payload[0] == 0xC0 )) deauths++;
  if (type == WIFI_PKT_MISC) return;   // wrong packet type
  if (ctrl.sig_len > SNAP_LEN) return; // packet too long
  uint32_t packetLength = ctrl.sig_len;
  if (type == WIFI_PKT_MGMT) packetLength -= 4; 
  // fix for known bug in the IDF
  // https://github.com/espressif/esp-idf/issues/886
  //Serial.print(".");
  tmpPacketCounter++;
  rssiSum += ctrl.rssi;
  if (useSD) sdBuffer.addPacket(pkt->payload, packetLength);
}
// ===== functions ===================================================
void draw() {
  double multiplicator = getMultiplicator();
  int len, rssi;
  if (pkts[MAX_X - 1] > 0) rssi = rssiSum / (int)pkts[MAX_X - 1];
  else rssi = rssiSum;
  String p = (String)ch + " | " + (String)rssi + " | Pkts " +
     (String)tmpPacketCounter + " [" + deauths + "]" +
     (useSD ? " | SD" : "");
  M5.Lcd.setTextColor(WHITE,BLUE);                    // packet
  M5.Lcd.drawString(p + "  ", 10, 2);                 // string DRAW
  M5.Lcd.drawLine(40,MAX_Y-200,MAX_X,MAX_Y-200,GREEN);// MAX LINE DRAW
  for (int i = 40; i < MAX_X; i++) {                  // LINE DRAW
    len = pkts[i] * multiplicator;
    len = len * 2;
    if ( (MAX_Y - len) < (MAX_Y - 200)){ len = 200;}  // over flow
    M5.Lcd.drawLine(i, MAX_Y, i, 31, TFT_BLACK);      // LINE EARSE
    M5.Lcd.drawLine(i, MAX_Y, i, MAX_Y - len , GREEN);// LINE DRAW
    if (i < MAX_X - 1) pkts[i] = pkts[i + 1];
  }
}
// ===== functions ===================================================
void coreTask( void * p ) {
  uint32_t currentTime;
  while (true) {
    currentTime = millis();
    /* bit of spaghetti code, have to clean this up later :D_ */
    // check button
    if (digitalRead(BUTTON_PIN) == LOW) {
      M5.Lcd.fillRect(0, 0, 320, 20, BLUE);
      if (buttonEnabled) {
        if (!buttonPressed) {
          buttonPressed = true;
          lastButtonTime = currentTime;
        } else if (currentTime - lastButtonTime >= 2000){
          if (useSD) {
            useSD = false;
            sdBuffer.close(&SD);
            draw();
          } else {
            if (setupSD())
              sdBuffer.open(&SD);
            draw();
          }
          buttonPressed = false;
          buttonEnabled = false;
        }
      }
    } else {
      if (buttonPressed) {
        setChannel(ch + 1);
        draw();
      }
      buttonPressed = false;
      buttonEnabled = true;
    }
    // save buffer to SD
    if (useSD) sdBuffer.save(&SD);
    // draw Display
    if ( currentTime - lastDrawTime > 1000 ) {
      lastDrawTime = currentTime;
      // Serial.printf("\nFree RAM %u %u\n", 
      // heap_caps_get_minimum_free_size(MALLOC_CAP_8BIT),
      // heap_caps_get_minimum_free_size(MALLOC_CAP_32BIT));
      // for debug purposes
      pkts[MAX_X - 1] = tmpPacketCounter;
      draw();
      //Serial.println((String)pkts[MAX_X - 1]);
      tmpPacketCounter = 0;
      deauths = 0;
      rssiSum = 0;
    }
    // Serial input
    if (Serial.available()) {
      ch = Serial.readString().toInt();
      if (ch < 1 || ch > 14) ch = 1;
      setChannel(ch);
    }
  }
}
// ===================================================================


.
追記:2018.03.28
TTGO_T2 のリストのリクエストがありましたので追加致します。

#define BUTTON_PIN 22 // button to change the channel

Buffer Library: GitHub : spacehuhn/PacketMonitor32
SSD_13XX Library:GitHub : sumotoy/SSD_13XX

メモ:
// TTGO T2 : Modification of hard : Add RST — 100nF — GND.
_ TTGO_T2 の EN 端子は 起動用のCapacitor が付いていません。
_ AUTO PROGRAM 時に書き込みエラーがありましたら 追加してください。
絵文字:102 と 128 行の絵文字は 影響があれば修正してください。

スケッチ:TTGO_T2_Packet_Monitor_SD
Please enter 102 lines and 128 lines as follows.
102
128

// PacketMonitor32
// spacehuhn/PacketMonitor32 : https://github.com/spacehuhn/PacketMonitor32/
// DISPLAY: Channel,RSSI,Packet per Second,deauth packets,SD Card enabled
// Button : click to change channel hold to dis/enable SD
// SD : GPIO12=DATA2,GPIO13=DATA3,GPIO15=CMD,GPIO14=CLK,GPIO02=DATA0,
//      GPIO04=DATA1,GPIO21=card
// Tindie: https://goo.gl/kZmVug
// AliExpress : https://goo.gl/hCCKMJ
// YouTube : https://www.youtube.com/watch?v=7WYakpagPXk
// tindie:https://www.tindie.com/products/lspoplove/wifi-packet-monitorv3-preflashed-d-duino-32-sdv2/
// SD : http://okiraku-camera.tokyo/blog/?p=6064
// TTGO T2 : Modification of hard : Add  RST -- 100nF --- GND.

#include <SPI.h>
#include <SSD_13XX.h>
SSD_13XX oled = SSD_13XX(15, 16, 4); // CS, DC, RST
SPIClass vspi(VSPI);
#include "freertos/FreeRTOS.h"
#include "esp_wifi.h"
#include "esp_wifi_types.h"
#include "esp_system.h"
#include "esp_event.h"
#include "esp_event_loop.h"
#include "nvs_flash.h"
#include <stdio.h>
#include <string>
#include <cstddef>
#include <Preferences.h>
/* ===== compile settings ===== */
#define MAX_CH 14     // 1-14ch(1-11 for US,1-13 for EU and 1-14 for Japan)
#define SNAP_LEN 2324 // max len of each recieved packet
#define BUTTON_PIN 22 // 5 // button to change the channel
#define MAX_X 96      //128
#define MAX_Y 51      //51
#if CONFIG_FREERTOS_UNICORE
#define RUNNING_CORE 0
#else
#define RUNNING_CORE 1
#endif
#include "Buffer.h"
#include "FS.h"
#include "SD.h"
enum { sd_sck = 18, sd_miso = 19, sd_mosi = 5, sd_ss = 23 };
esp_err_t event_handler(void* ctx, system_event_t* event) {
  return ESP_OK;
}
/* ===== run-time variables ===== */
Buffer sdBuffer;
Preferences preferences;
bool useSD = false;
bool buttonPressed = false;
bool buttonEnabled = true;
uint32_t lastDrawTime;
uint32_t lastButtonTime;
uint32_t tmpPacketCounter;
uint32_t pkts[MAX_X]; // here the packets per second will be saved
uint32_t deauths = 0; // deauth frames per second
unsigned int ch = 1;  // current 802.11 channel
int rssiSum;

// ===== main program ================================================
void setup() {
  Serial.begin(115200);
  // OLED Setup ----------------------------------------------------------
  SPI.end();
  vspi.begin(14, -1, 13, 15); // SCK,MISO,MOSI,SS
  oled.begin();
  oled.clearScreen();
  oled.fillScreen(GREEN);delay(500);
  oled.fillScreen(WHITE);delay(500);
  oled.fillScreen(BLUE);delay(500);
  oled.fillScreen(BLACK);
  oled.setTextColor(WHITE);
  oled.setTextScale(1);
  oled.setCursor(0, 0);
  // SD Card -----------------------------------------------------------
  SPI.end();
  SPI.begin(sd_sck, sd_miso, sd_mosi, sd_ss);
  SD.begin(sd_ss, SPI, 24000000);
  if(!SD.begin(sd_ss,SPI)){Serial.println("Card Mount Failed");return;}
  sdBuffer = Buffer();
  if (setupSD()){sdBuffer.open(&SD);Serial.println(" SD CHECK OPEN ");}
  // Settings------------------------------------------------------------
  preferences.begin("packetmonitor32", false);
  ch = preferences.getUInt("channel", 1);
  preferences.end();
  // System & WiFi-------------------------------------------------------
  nvs_flash_init();
  tcpip_adapter_init();
  wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
  ESP_ERROR_CHECK(esp_event_loop_init(event_handler, NULL));
  ESP_ERROR_CHECK(esp_wifi_init(&cfg));
  //ESP_ERROR_CHECK(esp_wifi_set_country(WIFI_COUNTRY_EU));
  ESP_ERROR_CHECK(esp_wifi_set_storage(WIFI_STORAGE_RAM));
  ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_NULL));
  ESP_ERROR_CHECK(esp_wifi_start());
  esp_wifi_set_channel(ch, WIFI_SECOND_CHAN_NONE);
  // I/O ----------------------------------------------------------------
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  /* show start screen */
  oled.setCursor(10, 10); oled.print("PacketMonitor32");
  oled.setCursor(10, 30); oled.print("Made with ❤ by");
  oled.setCursor(10, 50); oled.print("@Spacehuhn");
  delay(3000);
  oled.clearScreen();
  // second core --------------------------------------------------------
  xTaskCreatePinnedToCore(
    coreTask,               /* Function to implement the task */
    "coreTask",             /* Name of the task */
    2500,                   /* Stack size in words */
    NULL,                   /* Task input parameter */
    0,                      /* Priority of the task */
    NULL,                   /* Task handle. */
    RUNNING_CORE);          /* Core where the task should run */
  // start Wifi sniffer -------------------------------------------------
  esp_wifi_set_promiscuous_rx_cb(&wifi_promiscuous);
  esp_wifi_set_promiscuous(true);
}
// ===== main program ================================================
void loop() {
  vTaskDelay(portMAX_DELAY);
}
// ===== functions ===================================================
void coreTask( void * p ) {
  uint32_t currentTime;
  while (true) {
    currentTime = millis();
    /* bit of spaghetti code, have to clean this up later 😀 */
    // check button
    if (digitalRead(BUTTON_PIN) == LOW) {
      if (buttonEnabled) {
        if (!buttonPressed) {
          buttonPressed = true;
          lastButtonTime = currentTime;
        } else if (currentTime - lastButtonTime >= 2000){
          if (useSD) {
            useSD = false;
            sdBuffer.close(&SD);
            draw();
          } else {
            if (setupSD())
              sdBuffer.open(&SD);
            draw();
          }
          buttonPressed = false;
          buttonEnabled = false;
        }
      }
    } else {
      if (buttonPressed) {
        setChannel(ch + 1);
        draw();
      }
      buttonPressed = false;
      buttonEnabled = true;
    }
    // save buffer to SD
    if (useSD) sdBuffer.save(&SD);
    // draw Display
    if ( currentTime - lastDrawTime > 1000 ) {
      lastDrawTime = currentTime;
      // Serial.printf("\nFree RAM %u %u\n", 
      // heap_caps_get_minimum_free_size(MALLOC_CAP_8BIT),
      // heap_caps_get_minimum_free_size(MALLOC_CAP_32BIT));
      // for debug purposes
      pkts[MAX_X - 1] = tmpPacketCounter;
      draw();
      //Serial.println((String)pkts[MAX_X - 1]);
      tmpPacketCounter = 0;
      deauths = 0;
      rssiSum = 0;
    }
    // Serial input
    if (Serial.available()) {
      ch = Serial.readString().toInt();
      if (ch < 1 || ch > 14) ch = 1;
      setChannel(ch);
    }
  }
}
// ===== functions ===================================================
double getMultiplicator() {
  uint32_t maxVal = 1;
  for (int i = 0; i < MAX_X; i++) {
    if (pkts[i] > maxVal) maxVal = pkts[i];
  }
  if (maxVal > MAX_Y) return (double)MAX_Y / (double)maxVal;
  else return 1;
}
// ===== functions ===================================================
void setChannel(int newChannel) {
  ch = newChannel;
  if (ch > MAX_CH || ch < 1) ch = 1;
  preferences.begin("packetmonitor32", false);
  preferences.putUInt("channel", ch);
  preferences.end();
  esp_wifi_set_promiscuous(false);
  esp_wifi_set_channel(ch, WIFI_SECOND_CHAN_NONE);
  esp_wifi_set_promiscuous_rx_cb(&wifi_promiscuous);
  esp_wifi_set_promiscuous(true);
}
// ===== functions ===================================================
bool setupSD() {
  if (!SD.begin(sd_ss, SPI)) {
    Serial.println("Card Mount Failed"); return false;
  }
  uint8_t cardType = SD.cardType();
  if (cardType == CARD_NONE) {
    Serial.println("No SD_MMC card attached"); return false;
  }
  Serial.print("SD_MMC Card Type: ");
  if (cardType == CARD_MMC){         Serial.println("MMC");
  } else if (cardType == CARD_SD){   Serial.println("SDSC");
  } else if (cardType == CARD_SDHC){ Serial.println("SDHC");
  } else {                           Serial.println("UNKNOWN");
  }
  uint64_t cardSize = SD.cardSize() / (1024 * 1024);
  Serial.printf("SD_MMC Card Size: %lluMB\n", cardSize);
  return true;
}
// ===== functions ===================================================
void wifi_promiscuous(void* buf, wifi_promiscuous_pkt_type_t type){
  wifi_promiscuous_pkt_t* pkt = (wifi_promiscuous_pkt_t*)buf;
  wifi_pkt_rx_ctrl_t ctrl = (wifi_pkt_rx_ctrl_t)pkt->rx_ctrl;
  if (type == WIFI_PKT_MGMT && 
     (pkt->payload[0] == 0xA0 || pkt->payload[0] == 0xC0 )) deauths++;
  if (type == WIFI_PKT_MISC) return; // wrong packet type
  if (ctrl.sig_len > SNAP_LEN) return; // packet too long
  uint32_t packetLength = ctrl.sig_len;
  if (type == WIFI_PKT_MGMT) packetLength -= 4;
  // fix for known bug in the IDF
  //https://github.com/espressif/esp-idf/issues/886
  //Serial.print(".");
  tmpPacketCounter++;
  rssiSum += ctrl.rssi;
  if (useSD) sdBuffer.addPacket(pkt->payload, packetLength);
}
// ===== functions ===================================================
void draw() {
  double multiplicator = getMultiplicator();
  int len;
  int rssi;
  if (pkts[MAX_X - 1] > 0) rssi = rssiSum / (int)pkts[MAX_X - 1];
  else rssi = rssiSum;
  //oled.clearScreen();
  oled.fillRect(0,0,127,10,BLACK);
  oled.setCursor(0, 0);
  oled.println((String)ch + " " + (String)rssi + " Pkts " +
       (String)tmpPacketCounter + " [" + deauths + "]" +
       (useSD ? " SD" : "")); 
  oled.drawLine(0,63 - MAX_Y,MAX_X,63 - MAX_Y,GREEN);
  for (int i = 0; i < MAX_X; i++) {
    oled.drawLine(i,63,i,64 - MAX_Y,BLACK);         // LINE ERASE
    len = pkts[i] * multiplicator;
    oled.drawLine(i,63,i,63 - (len > MAX_Y ? MAX_Y : len),BLUE);
    if (i < MAX_X - 1) pkts[i] = pkts[i + 1];       // LINE DRAW
  }
}
//=====================================================================


広告

Written by macsbug

1月 11, 2018 @ 1:00 am

カテゴリー: ESP32, M5STACK

コメント / トラックバック7件

Subscribe to comments with RSS.

  1. PacketMonitos32をM5Stackに転送していただきありがとうございます!
    Unfortunately I don’t speak Japanese in reality – Google was so nice to help me 🙂

    Dera macsbug, I’m a fan of your good work – really inspiring. You can feel the joy of it!

    I come from Berlin, Germany and am occasionally in Japan. 私はそれが私のばかげたアイデアだと知っていますが、私は3月初めに次の予定で真の茶道を持つことを本当に嬉しく思っています。 地域の技術や仕事、日本の美容について話すことができます。 私は素敵なアイデアかもしれません!
    There are far too few good sources like you, macsbug!

    Many thanks!
    BR, artkeller

    Thomas Walloschke

    2月 13, 2018 at 4:22 pm

    • Thank you for your visit to the site.
      I am using GOOGLE translation.
      I would like to enjoy M5STACK.
      I live in Tokyo.

      Many thanks!
      macsbug

      macsbug

      2月 13, 2018 at 5:35 pm

  2. こんにちは、私は同じTTGO T2を購入しましたが、私はソースコードを使用しますが、動作しません。 あなたのTTGOデモを共有することはできますか? M5とT2のスクリーンドライバチップが異なるからです。
    どうもありがとう

    Lee

    3月 28, 2018 at 3:44 pm

    • Lee さん、サイトの訪問を ありがとうございます。
      TTGO T2 のリストを表示せず申し訳ありません。
      ブログの下に追加(2018.03.28)しておきましたので試してください。
      TTGO_T2 は 使いやすく 素晴らしいですね。

      macsbug

      3月 28, 2018 at 6:03 pm

  3. Hey, macbug. Thank you for your selfless dedication and your great quality. I paid a high tribute to this.
    However, I feel very sorry here. Because I was in trouble again – unable to compile successfully. I commented on one line of code, but it failed to render the correct image. So here are some of my questions.

    NO.1: Why MISO in the VSPI of line 66 is “-1” (compilation is normal, but it is slightly doubtful)
    NO.2 : Why is there a site parameter in the oled.setCursor() function in line 102 (cannot be compiled, commented out to run successfully). Although the ESP32 chip has a wifi function, there is no function related to wifi in the program word line, and it is even more impossible to connect to the API to download the picture (out of curiosity, I logged in to that site, which is a big love). So, I want to understand what this means.

    NO.3 : This is an interesting project before I have not seen your newly added code. I tried to use the ESP32_SSD1331 library (also written by the Japanese), but I didn’t find the function comments in the library. The attempt failed. But I have found a new direction now. Thank you very much for your help. I hope you can solve my doubts. Thank you.

    ねえ、macbug。あなたの無私の献身と素晴らしい品質をありがとう。私はこれに大きな敬意を表しました。
    しかし、ここではとても残念です。なぜなら、私は再び困っていたので、うまくコンパイルできません。私は1行のコードについてコメントしましたが、正しいイメージを表示できませんでした。ここに私の質問のいくつかがあります。

    NO.1:66行目のVSPIのMISOが “-1″(コンパイルは正常ですが、多少疑わしいです)
    NO.2:oled.setCursor()関数の102行目にサイトパラメータがあるのはなぜですか(コンパイルできず、正常に実行されるためにコメントアウトされています)。 ESP32チップにはWi-Fi機能がありますが、プログラムワードラインにはWi-Fiに関連する機能はありません。また、APIに接続して写真をダウンロードすることも不可能です(好奇心を抱いて、大きな愛です)。だから、私はこれが何を意味するのか理解したい。

    NO.3:新しく追加されたコードを見たことがないうちに、これは興味深いプロジェクトです。 ESP32_SSD1331ライブラリ(日本語でも書かれています)を使用しようとしましたが、ライブラリに関数コメントが見つかりませんでした。試行は失敗しました。しかし、今私は新しい方向性を見いだしました。ご助力ありがとうございます。あなたが私の疑問を解決できることを願っています。ありがとうございました。

    Lee

    3月 28, 2018 at 8:00 pm

  4. あなたの詳細な答えをありがとう。 昨夜、私はT2を成功させました。 しかし、時間の遅さやタイムリーな返答の欠如のために、私は非常に残念です。
    SSD1331の青いパケット表示は本当に美しいです。 ありがとう、macbug。

    Lee

    Lee

    3月 29, 2018 at 10:30 am


コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。