آموزش آردوینو اینترنت اشیا IOT برد ESP8266 برد ویموس Wemos

ساخت دستگاه PacketMonitor با برد ESP8266 و نمایشگر Oled

نوشته شده توسط CiferTech

شاید تابحال این مورد نظر شما را جلب کرده باشد، شبکه وای فایی که از آن استفاده می‌کنید چه مقدار ترافیک را ثبت می‌کند. یا زمانی که از آن استفاده‌ای ندارید آیا ترافیکی در شبکه شما در حال ردوبدل است؟ و یا این ترافیک دارای چه اطلاعاتی هستند، جواب این نیازها همگی با یک دستگاه جالب و کاربردی به اسم Packet Monitor برطرف خواهند شد. یک برنامه رایانه ای یا به شکل سخت افزار است، که می تواند ترافیکی را که از طریق شبکه رایانه یا بخشی از شبکه عبور می کند را ضبط و ثبت کند. هنگامی که جریان داده ها از طریق شبکه عبور می‌کند. نوسط  آنالیزر ها می‌توانیم هر پکت را ذخیره و در صورت نیاز، داده های خام پکت را رمزگشایی کنیم. در این پروژه اقدام به ساخت دستگاه PacketMonitor بوسیله برد ESP8266 می‌کنیم. ترافیک های موجود در هر کانال را دریافت کرده و سپس با استفاده از نمایشگر Oled بصورت گرافیکی در گراف هایی نمایش خواهیم داد. در ادامه این آموزش با مرجع تخصصی آردوینو به زبان فارسی، دیجی اسپارک همراه باشید.

 

Build PacketMonitor with ESP8266 board and OLED display

 


شناخت برد Wemos


برد Wemos یکی از پرطرافدار ترین برد هایی است که در زمینه iot مورد استفاده قرار میگیرد، یکی از مزیت های این برد نسبت به برد هایی مانند Node MCU اندازه کوچک آن می باشد تراشه وای فای مورد استفاده در این برد ESP8266 می باشد. از دیگر مزیت های این برد وجود شیلد های مختلفی برای این برد می باشد، که انجام هر پروژه ای را برای کاربر بسیار آسان و لذت بخش می کند، شیلد هایی از جمله شیلد باتری، multi sensor ، DHT22 ، رله ، oled تعداد بسیار زیادی شیلد برای این برد توسعه داده شده که در نتیجه تجربه خوبی از iot برای شما به جا خواهد گذاشت.

شناخت برد Wemos Build PacketMonitor - دیجی اسپارک

 


ماژول نمایشگر Oled SSD1306


معمولا در پروژه های اینترنت اشیا و دیگر پروژه های امبدد از برای نمایش متن و مقادیر مختلف از نمایشگر های Oled استفاده می شود، این ماژول ها بدر انواع مختلق بسته به نوع درایور اندازه یافت می شوند که یکی از پرطرفدار ترین آن ها SSD1306 می باشد، این نوع از Oled ها معمولا در اندازه های ۰٫۹۶ و ۱٫۳ اینچ ساخته می شوند همچنین پروتکل ارتباطی Oled ها I2C می باشد. صفحه نمایش دیود ساطع کننده نور (OLED) که ما در این آموزش استفاده خواهیم کرد مدل SSD1306 است، یک صفحه نمایش تک رنگ، ۰٫۹۶ اینچی با ۱۲۸ × ۶۴ پیکسل همانطور که در شکل زیر نشان داده شده است. نمایشگر OLED نیازی به نور پس زمینه ندارد، که نتیجه آن ایجاد تضاد بسیار خوب در محیط های تاریک است. همچنین پیکسل های آن فقط هنگام روشن بودن انرژی مصرف می کنند، بنابراین صفحه نمایش OLED در مقایسه با سایر نمایشگرها، مصرف برق کمتری دارد.

 


روش کار پروژه PacketMonitor 


در این پروژه مقادیر ترافیک که در چنل مشخص شده از بازه ۱ تا ۱۴ وجود دارد، با کمک برد وای‌فای ESP8266 و برد راه‌انداز Wemos دریافت شده و در نمایشگر Oled که توسط رابط i2c راه‌اندازی شده بصورت گرافیکی در اشکالی نسبت به ترافیک دریافتی در هر لحظه نمایش داده می‌شود. همچنین اگر اختلال یا حملات deauth در چنل مدنظر در جریان باشد، به ما اطلاع رسانی خواهد شد. همچنین با استفاده از کلیدی که به پین D3 در برد Wemos متصل است قادر خواهیم بود شماره چنل در حال آنالیز را تغییر دهیم.

پروژه PacketMonitor با برد ESP8266 - دیجی اسپارک

 


وسایل مورد نیاز


برد wemos

نمایشگر Oled

میکروسوییچ

 


کتابخانه مورد نیاز


در این آموزش از کتابخانه ssd1306 استفاده خواهیم کرد، مراحل زیر را برای نصب کتابخانه دنبال کنید.

  1. این مسیر را دنبال کنید Sketch Include Library > Manage Libraries
  2. کلمه ssd1306 را جستجو کنید.
  3. کتابخانه را نصب کنید.

 


شماتیک و راه‌اندازی مدار


در این پروژه از نمایشگر Oled با درایور SSD1306 استفاده کردیم که از رابط i2c برای برقراری ارتباط با برد Wemos ما که بر پایه ESP8266 است استفاده می‌کند. برای اتصال نمایشگر به برد راه‌انداز ار دو پین D1 , D2 استفاده می‌کنیم، همچنین برای تغذیه نمایشگر از پین های ۵v و GND استفاده خواهیم کرد اتصالات را مطابق شماتیک و جدول زیر برقرار کنید.

اتصالات ماژول OLED به برد Wemos D1 Mini - دیجی اسپارک

 

  • شماتیک اتصالات برد Wemos و نمایشگر Oledشماتیک اتصالات برد Wemos و نمایشگر Oled - دیجی اسپارک

 

در بخش بعدی از اتصالات نیاز داریم تا با اتصال یک میکروسوییچ به برد wemos اقدام به فرماندهی به برد برای تغییر مقادیر چنل شبکه کنیم، برای ایم منظر از پین GPIO 0 در تراشه ESP8266 یا پین D3 در برد Wemos استفاده می‌کنیم. یکی دیگر از پایه های میکروسوییچ نیز به پین GND برای مشخص شدن سطح منطقی متصل می‌گردد. اتصالات این بخش را نیز از به کمک جدول و شماتیک پایین برقرار کنید.

اتصال میکروسوئیچ به برد Wemos D1 Mini - دیجی اسپارک

  • شماتیک اتصالات برد Wemos و میکروسوییچ

شماتیک اتصالات برد Wemos و میکروسوییچ - دیجی اسپارک

در بخش نهایی برای راه‌اندازی پروژه نوبت به کد این Packet Monitor می‌رسد، در این کد از کتابخانه SSD1306 برای راه‌اندازی Oled و نمایش مقادیر در نمایشگر استفاده کردیم، همچنین طبق معمول کتابخانه ESP8266WiFi نیز برای استفاده از قبلیت وای‌فای برد فراخوانی شده است.

#include <ESP8266WiFi.h>
#include <Wire.h>
#include <EEPROM.h>

#include "SSD1306.h"

 

می‌‌توان گفت یکی از مهم ترین بخش های کد این قسمت است که راه‌اندازی وای‌فای برای انجان عملیات های مربوط صورت می‌گیرد.

  wifi_set_opmode(STATION_MODE);
  wifi_promiscuous_enable(0);
  WiFi.disconnect();
  wifi_set_promiscuous_rx_cb(sniffer);
  wifi_set_channel(curChannel);
  wifi_promiscuous_enable(1);

 

کد کامل پروژه ساخت دستگاه PacketMonitor با برد ESP8266 و نمایشگر Oled

#include <ESP8266WiFi.h>
#include <Wire.h>
#include <EEPROM.h>

#include "SSD1306.h"

extern "C" {
#include "user_interface.h"
}

SSD1306 display(0x3c, 5, 4);   // GPIO 5 = D1, GPIO 4 = D2 پین های مربوط

#define btn D3         // GPIO 0 = پین Flash در برد های Nodemcu

#define maxCh 13       //   US = 11, EU = 13, Japan = 14 حداکثر تعداد چنل در استاندارد های متفاو
#define ledPin 2       // پین LED 
#define packetRate 5   // پکت ها قبل شناسایی شدن به عنوان حمله

#define flipDisplay true

#define minRow       0           
#define maxRow     127              
#define minLine      0              
#define maxLine     63              

#define Row1         0
#define Row2        30
#define Row3        35
#define Row4        80
#define Row5        85
#define Row6       125

#define LineText     0
#define Line        12
#define LineVal     47


unsigned long prevTime   = 0;
unsigned long curTime    = 0;
unsigned long pkts       = 0;
unsigned long no_deauths = 0;
unsigned long deauths    = 0;
int curChannel           = 1;
unsigned long maxVal     = 0;
double multiplicator     = 0.0;
bool canBtnPress         = true;

unsigned int val[128];

void sniffer(uint8_t *buf, uint16_t len) {
  pkts++;
  if (buf[12] == 0xA0 || buf[12] == 0xC0) {
    deauths++;
  }
}

void getMultiplicator() {
  maxVal = 1;
  for (int i = 0; i < maxRow; i++) {
    if (val[i] > maxVal) maxVal = val[i];
  }
  if (maxVal > LineVal) multiplicator = (double)LineVal / (double)maxVal;
  else multiplicator = 1;
}


void setup() {

  display.init();
  if (flipDisplay) display.flipScreenVertically();

  Serial.begin(115200);

  EEPROM.begin(4096);
  curChannel = EEPROM.read(2000);
  if (curChannel < 1 || curChannel > maxCh) {
    curChannel = 1;
    EEPROM.write(2000, curChannel);
    EEPROM.commit();
  }

  pinMode(ledPin, OUTPUT);


  wifi_set_opmode(STATION_MODE);
  wifi_promiscuous_enable(0);
  WiFi.disconnect();
  wifi_set_promiscuous_rx_cb(sniffer);
  wifi_set_channel(curChannel);
  wifi_promiscuous_enable(1);

  Serial.println("starting!");
}

void loop() {
  curTime = millis();

  if (digitalRead(btn) == LOW) {
    if (canBtnPress) canBtnPress = false;
  } else if (!canBtnPress) {
    canBtnPress = true;

    curChannel++;
    if (curChannel > maxCh) curChannel = 1;
    wifi_set_channel(curChannel);
    for (int i = 0; i < maxRow; i++) val[i] = 0;
    pkts = 0;
    multiplicator = 1;

    EEPROM.write(2000, curChannel);
    EEPROM.commit();

    if (pkts == 0) pkts = deauths;
    no_deauths = pkts - deauths;

    display.clear();
    display.drawLine(minRow, Line, maxRow, Line);
    display.setTextAlignment(TEXT_ALIGN_LEFT);
    display.drawString(Row1, LineText, "Ch:");
    display.drawString(Row3, LineText, "Pkts:");
    display.drawString(Row5, LineText, "DA:");
    display.setTextAlignment(TEXT_ALIGN_RIGHT);
    display.drawString(Row2, LineText, (String)curChannel);
    display.drawString(Row4, LineText, (String)no_deauths);
    display.drawString(Row6, LineText, (String)deauths);
    for (int i = 0; i < maxRow; i++) display.drawLine(i, maxLine, i, maxLine - val[i]*multiplicator);
    display.display();
  }

  if (curTime - prevTime >= 1000) {
    prevTime = curTime;

    for (int i = 0; i < maxRow; i++) {
      val[i] = val[i + 1];
    }
    val[127] = pkts;

    getMultiplicator();

    if (deauths > packetRate) digitalWrite(ledPin, LOW);
    else digitalWrite(ledPin, HIGH);

    if (pkts == 0) pkts = deauths;
    no_deauths = pkts - deauths;

    display.clear();
    display.drawLine(minRow, Line, maxRow, Line);
    display.setTextAlignment(TEXT_ALIGN_LEFT);
    display.drawString(Row1, LineText, "Ch:");
    display.drawString(Row3, LineText, "Pkts:");
    display.drawString(Row5, LineText, "DA:");
    display.setTextAlignment(TEXT_ALIGN_RIGHT);
    display.drawString(Row2, LineText, (String)curChannel);
    display.drawString(Row4, LineText, (String)no_deauths);
    display.drawString(Row6, LineText, (String)deauths);
    for (int i = 0; i < maxRow; i++) display.drawLine(i, maxLine, i, maxLine - val[i]*multiplicator);
    display.display();

    deauths    = 0;
    pkts       = 0;
  }
}

 

Build PacketMonitor with ESP8266 board and OLED display

 


جمع بندی


در این پروژه توانستیم مقادیر ترافیک شبکه در ۱۴ چنل استاندارد را بصورت جداگانه اندازه‌گیری کنیم. همچنین در صورت وقوع هرگونه حمله Deauth به کاربر اطلاع رسانی خواهد شد. تمام مقادیر بصورت گرافیکی در نمایشگر Oled نمایش داده خواهند. و با استفاده از میکروسوییچ امکان تغییر چنل را خواهیم داشت.

 

چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریع‌ترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند می‌توانید از همین طریق اطلاع رسانی کنید.

 

در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی , از وبسایت دیجی اسپارک حمایت کنید.

درباره نویسنده

CiferTech

تبادل نظر و رفع عیب با ثبت دیدگاه

۱۲ دیدگاه

  • سلام مهندس اموزش جالبی بود
    فقط یک سوال میشه با استفاده از ماژول esp8266 و ماژول صفحه نمایش دستگاهی درست کرد که با هاش بتوان کسانی که بدون اجازه یا با اجازه ما به وای‌فای ما وصل می‌شوند را حذف کرد یعنی دسترسی وای‌فای را از این اشخاص قطع کنیم ؟؟

    • با سلام، بله این امکان وجود دارد که باید STA ها اسکن شوند و با استفاده از deauth attack دسترسی آن ها قطع شود.

  • سلام
    من نمیتونم کتابخانه ESP8266WiFi رو روی نرافزار اردینو نصب کنم باید چه کار کنم؟
    و اینکه نمی تونم برد وموس رو بهش معرفی کنم قبلا با اردینو uno کار میکردم حالا رو uno مونده باید چه کار کنم؟
    این مطلب رو هم مطالعه کردم و انجام دادم
    https://digispark.ir/%D9%86%D8%B5%D8%A8-%D8%B1%D8%A7%D9%87-%D8%A7%D9%86%D8%AF%D8%A7%D8%B2%DB%8C-%D8%A8%D8%B1%D8%AF-%DA%A9%D9%86%D8%AA%D8%B1%D9%84-iot-wemos-d1-mini/

    • با سلام، باید از قست tools باید برد مدنظر را نصب کنید، همچنین با استفاده از همین قسمت قبل از آپلود هر کد باید از قسمت boards، برد مدنظر را انتخاب کنید.

  • سلام مهندس
    میشه با استفاده از esp8266 و نمایشگرoled یه دستگاهی درست کرد که مثلاً من خودم رمز عبور وای‌فایم را به شخصی گفته ام اما من نمی‌دونم که این طرف چقدر از ترافیک خریداری شده توسط من را مصرف می‌کند
    و یا حتی خودم هم چقدر از این ترافیک را مصرف میکنم
    که مثلاً برای این دستگاه دو منو تعریف کنیم منوی اول کاربر متصل به وای‌فای و کاربر دوم هم خودم که وقتی وارد منو دوم شدم بهم نشون بده که من امروز چقدر از ترافیک خریداری شده را مصرف کردم

    • این امکان هست اما نیازمند API اختصاصی از طرف شرکت مبدا هست برای دریافت اطلاعات، البته ممکن است راه های دیگری باشد که من اطلاع ندارم.