2017-09-14 10 views
2

내 esp8266 프로젝트에 문제가 있습니다. 내 목적은 esp8266을 사용하여 1 초마다 비콘 프레임을 전송하므로 내 안드로이드 장치 또는 랩톱에서 수신하고 연결할 수있는 AP 목록에 표시 할 수 있습니다.ESP8266 : 딥 슬립 모드의 비콘 프레임 전송이 제대로 작동하지 않습니다.

#include <ESP8266WiFi.h> 
extern "C" { 
    #include "user_interface.h" 
} 

void setup() { 
    delay(500); 
    sendBeacon("ESP8266"); 
    ESP.deepSleep(10e5); 
} 

void loop() { 
} 

void sendBeacon(char* ssid) { 
    // Randomize channel // 
    byte channel = 1; 
    wifi_set_channel(channel); 

    uint8_t packet[128] = { 0x80, 0x00, //Frame Control 
         0x00, 0x00, //Duration 
       /*4*/ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //Destination address 
       /*10*/ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, //Source address - overwritten later 
       /*16*/ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, //BSSID - overwritten to the same as the source address 
       /*22*/ 0xc0, 0x6c, //Seq-ctl 
       //Frame body starts here 
       /*24*/ 0x83, 0x51, 0xf7, 0x8f, 0x0f, 0x00, 0x00, 0x00, //timestamp - the number of microseconds the AP has been active 
       /*32*/ 0xFF, 0x00, //Beacon interval 
       /*34*/ 0x01, 0x04, //Capability info 
       /* SSID */ 
       /*36*/ 0x00 
       }; 

    int ssidLen = strlen(ssid); 
    packet[37] = ssidLen; 

    for(int i = 0; i < ssidLen; i++) { 
     packet[38+i] = ssid[i]; 
    } 

    uint8_t postSSID[13] = {0x01, 0x08, 0x82, 0x84, 0x8b, 0x96, 0x24, 0x30, 0x48, 0x6c, //supported rate 
         0x03, 0x01, 0x04 /*DSSS (Current Channel)*/ }; 

    for(int i = 0; i < 12; i++) { 
     packet[38 + ssidLen + i] = postSSID[i]; 
    } 

    packet[50 + ssidLen] = channel; 

    // get SRC MAC 
    unsigned char mac[6]; 
    WiFi.macAddress(mac); 
    packet[10] = packet[16] = mac[0]; 
    packet[11] = packet[17] = mac[1]; 
    packet[12] = packet[18] = mac[2]; 
    packet[13] = packet[19] = mac[3]; 
    packet[14] = packet[20] = mac[4]; 
    packet[15] = packet[21] = mac[5]; 

    int packetSize = 51 + ssidLen; 

    wifi_send_pkt_freedom(packet, packetSize, 0); 
    delay(1); 
} 

내가 그 프레임을 캡처하는 tcpdump를 사용하고 예, 그들이 거기에 있습니다 여기에 내가 쓴 내 코드입니다. 하지만 여전히 내 노트북과 내 안드로이드 장치의 AP 목록에서 볼 수 없었습니다. 딥 슬립 모드를 사용하지 않으면 볼 수 있습니다. 예 :

#include <ESP8266WiFi.h> 
extern "C" { 
    #include "user_interface.h" 
} 

void setup() { 
    delay(500); 
// sendBeacon("ESP8266"); 
// ESP.deepSleep(10e5); 
} 

void loop() { 
    sendBeacon("ESP8266"); 
} 

void sendBeacon(char* ssid) { 
    // Randomize channel // 
    byte channel = 1; 
    wifi_set_channel(channel); 

    uint8_t packet[128] = { 0x80, 0x00, //Frame Control 
         0x00, 0x00, //Duration 
       /*4*/ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //Destination address 
       /*10*/ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, //Source address - overwritten later 
       /*16*/ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, //BSSID - overwritten to the same as the source address 
       /*22*/ 0xc0, 0x6c, //Seq-ctl 
       //Frame body starts here 
       /*24*/ 0x83, 0x51, 0xf7, 0x8f, 0x0f, 0x00, 0x00, 0x00, //timestamp - the number of microseconds the AP has been active 
       /*32*/ 0xFF, 0x00, //Beacon interval 
       /*34*/ 0x01, 0x04, //Capability info 
       /* SSID */ 
       /*36*/ 0x00 
       }; 

    int ssidLen = strlen(ssid); 
    packet[37] = ssidLen; 

    for(int i = 0; i < ssidLen; i++) { 
     packet[38+i] = ssid[i]; 
    } 

    uint8_t postSSID[13] = {0x01, 0x08, 0x82, 0x84, 0x8b, 0x96, 0x24, 0x30, 0x48, 0x6c, //supported rate 
         0x03, 0x01, 0x04 /*DSSS (Current Channel)*/ }; 

    for(int i = 0; i < 12; i++) { 
     packet[38 + ssidLen + i] = postSSID[i]; 
    } 

    packet[50 + ssidLen] = channel; 

    // get SRC MAC 
    unsigned char mac[6]; 
    WiFi.macAddress(mac); 
    packet[10] = packet[16] = mac[0]; 
    packet[11] = packet[17] = mac[1]; 
    packet[12] = packet[18] = mac[2]; 
    packet[13] = packet[19] = mac[3]; 
    packet[14] = packet[20] = mac[4]; 
    packet[15] = packet[21] = mac[5]; 

    int packetSize = 51 + ssidLen; 

    wifi_send_pkt_freedom(packet, packetSize, 0); 
    delay(1); 
} 

이유를 아는 사람이 있습니까? 감사합니다. 도와주세요.

답변

0

우선 ESP.deepSleep (10e5)은 프로세서가 1 초가 아니라 100ms 동안 잠자기 상태가되도록합니다. 올바른 것은 ESP.deepSleep (10e6)입니다. 둘째, 매초마다 하나의 패킷 만 보내려고합니다. 장치에서 Wi-Fi를 읽는 것이 해당 패킷을 확실히 가져 와서 SSID 목록에 표시하는지 확인하는 것은 매우 어렵습니다. 내 실험에서, 나는 그것이 안드로이드 모바일 및 PC에 표시되었는지 확인하기 위해 200ms마다 3 패킷을 보내야했다. 전송 패킷 수와 간격으로 가장 적합한 패킷을 확인하십시오.

또한 설정 기능에서 ESP를 올바르게 구성하십시오. 비슷한 코드를 사용해 보았을 때 wifi_set_opmode (STATION_MODE)와 wifi_promiscuous_enable (1)의 두 가지 명령을 사용해야했습니다.