Skip to content

Instantly share code, notes, and snippets.

@aknik
Forked from mic159/ESP32_raw_packet.ino
Created March 23, 2018 13:22
Show Gist options
  • Save aknik/3934415fff3cb13d23ac6de3f4657bdd to your computer and use it in GitHub Desktop.
Save aknik/3934415fff3cb13d23ac6de3f4657bdd to your computer and use it in GitHub Desktop.
ESP32 raw packets
#include <WiFi.h>
#include "wifi_headers.h"
#include <esp_wifi.h>
//#include <esp_wifi_internal.h>
#include <lwip/err.h>
typedef union {
uint8_t fix_rate;
uint8_t b5;
uint8_t b4;
struct {
uint8_t b3;
uint8_t b2;
} b1;
struct {
uint32_t a1;
uint8_t a2;
uint8_t a3;
uint8_t a4;
uint8_t a5;
struct {
uint8_t a6;
uint8_t a7;
} a8[4];
uint8_t a9;
uint8_t a10;
uint8_t a11;
uint8_t a12;
} a13;
} wifi_internal_rate_t;
#define RATE_MCS4_SP 28 // N 43.3Mb MCS4 SP
// buffer: Raw IEEE 802.11 packet to send
// len: Length of IEEE 802.11 packet
// en_sys_seq: see https://github.com/espressif/esp-idf/blob/master/docs/api-guides/wifi.rst#wi-fi-80211-packet-send for details
extern "C" {
esp_err_t esp_wifi_80211_tx(wifi_interface_t ifx, const void *buffer, int len, bool en_sys_seq);
esp_err_t esp_wifi_internal_set_rate(int a, int b, int c, wifi_internal_rate_t *d);
}
mac_t BCAST(true);
mac_t ME;
void setup() {
Serial.begin(115200);
Serial.println("Start");
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
esp_wifi_init(&cfg);
esp_wifi_set_mode(WIFI_MODE_NULL);
wifi_internal_rate_t rate;
rate.fix_rate = RATE_MCS4_SP;
esp_wifi_internal_set_rate(100, 1, 4, &rate);
esp_wifi_start();
esp_wifi_set_ps(WIFI_PS_NONE);
Serial.println("Done setup");
WiFi.macAddress(ME.mac);
}
void loop() {
byte data[sizeof(WiFiHeader) + 20];
WiFiHeader* pkt = (WiFiHeader*)data;
pkt->frame_control.type = WIFI_TYPE_DATA;
pkt->frame_control.subtype = 0;
pkt->frame_control.to_ds = 1;
pkt->address_1 = BCAST;
pkt->address_2 = ME;
pkt->address_3 = ME;
memset(data + sizeof(WiFiHeader), 40, 20);
int result = esp_wifi_80211_tx(WIFI_IF_AP, data, sizeof(data), true);
switch (result) {
case ERR_OK: Serial.println("ERR_OK"); break;
case ERR_MEM: Serial.println("ERR_MEM"); break;
case ERR_IF: Serial.println("ERR_IF"); break;
case ERR_ARG: Serial.println("ERR_ARG"); break;
default: Serial.println(result);
}
delay(1000);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment