0
votes

I am developing code for ESP32 (16MB) using PlatformIO with Arduino framework, On ESP32, I am using both Bluetooth as well as Wi-Fi connectivity. When Mobile App is connected with Bluetooth of ESP32 data will be sent on mobile using Bluetooth on BLE characteristics (working perfectly fine), and when Bluetooth is not connected data will be logged in .json file (have used SPIFFS library for this and file creation is working fine). When user wants to have log data, ESP32 will create Wi-Fi Access Point (AP) (used WiFi.h) and by connecting to that AP user should be able to download .json file by accessing link "192.168.4.1/download" on browser. Once the file will be downloaded on Mobile App user will access link "192.168.4.1/finisheddownload" and file will be deleted from ESP32.

after successfully connecting to AP of ESP32, while I access link "192.168.4.1/download" from browser, the code gets stuck at that point or sometimes it reboots the ESP32 and performs nothing and if I access "192.168.4.1/finisheddownload", it successfully deletes the file. My file size is around 10MB but even I perform this action when file size is of 1KB it behaves same. I have tested the same code on ESP32 (4MB) module and was able to download file for around 50KB.

I am not sure whether it is the issue of memory or library which I am using or limitation of ESP32. I am attaching code snippet along with memory partition I have used, please guide.

Error when ESP32 gets reboot after accessing link for file download:

abort() was called at PC 0x401d844b on core 1

Backtrace: 0x40092b60:0x3ffcf8e0 0x40092d91:0x3ffcf900 0x401d844b:0x3ffcf920 0x401d8492:0x3ffcf940 0x401bf359:0x3ffcf960 0x401bf0dc:0x3ffcf980 0x400fa67e:0x3ffcf9a0 0x400fa75a:0x3ffcf9d0 0x400e62b9:0x3ffcf9f0 0x400d23e4:0x3ffcfa20 0x400d27e3:0x3ffcfa40 0x400d2ed7:0x3ffcfa70 0x400d35f1:0x3ffcfa90 0x400e9151:0x3ffcfb10 0x4008f275:0x3ffcfb30

Rebooting...

rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) configsip: 0, SPIWP:0xee clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00 mode:DIO, clock div:2 load:0x3fff0018,len:4 load:0x3fff001c,len:1044 load:0x40078000,len:8896 load:0x40080400,len:5828 entry 0x400806ac

Code snippet:

void downloadfile(){                                       //function to download file on mobile App
  delay(500);
  do{
   BLEAdvertising *pAdvertising = pServer->getAdvertising();
   pAdvertising->stop();
   if(!SPIFFS.begin()){
        Serial.println("An Error has occurred while mounting SPIFFS");
        return;
   }
  WiFi.mode(WIFI_AP); 
  delay(100);
  Serial.print("Setting soft-AP ... ");
  Serial.println(WiFi.softAP("ESP32","123456789") ? "Ready" : "Failed!");
  Serial.print("Soft-AP IP address = ");
  Serial.println(WiFi.softAPIP());
  delay(100);
  // send a file when /download is requested
  server.on("/download", HTTP_ANY, [](AsyncWebServerRequest *request){
     request->send(SPIFFS, "/file1.json", "text/plain", true);
  });
  server.on("/finisheddownload", HTTP_GET, [](AsyncWebServerRequest *request){
    logfile.del_file();
    request->send(200, "text/html", "Download complete response");
    delay(500);
    Actual_filexist = 0;
    WiFi.softAPdisconnect(true);
    BLEAdvertising *pAdvertising = pServer->getAdvertising();
    pAdvertising->start();
    delay(500);
  });  
  server.begin();
  delay(500);
 }while(Actual_filexist == 1);
}

memory partition: #name Type Subtype Offset Size Flags nvs data nvs 0x9000 0x7000 app0 app ota_0 0x10000 0x2A0000
eeprom data 0x99 0x2F0000 0x1A8CE0 spiffs data spiffs 0x498CE0 0xA7D8C0

Memory usage: RAM: [== ] 19.9% (used 65292 bytes from 327680 bytes) Flash: [====== ] 60.1% (used 1654361 bytes from 2752512 bytes)

Thank you....

1

1 Answers

0
votes

You're using ESPAsyncWebServer. Its documentation explicitly states that you should not call delay() or yield() or any function that calls them in callbacks from the web server (Important things to remember. You're calling delay() twice in the /finisheddownload handler.

You're also calling WiFi.softAPdisconnect() in the handler before the handler can return, which means you're turning off Wifi before the callback returns and potentially before the response is sent to the browser. It's not safe to do this in the callback.

You need to do as little as possible in the callback from the web server. Rewrite that handler to set a flag which loop() will inspect so that all of the work it does except for the call to request->send() is actually done in loop().