Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ESP8266 Arduino Core 2.4.0 causing reset #477

Open
yoyanec opened this issue Jan 26, 2018 · 28 comments
Open

ESP8266 Arduino Core 2.4.0 causing reset #477

yoyanec opened this issue Jan 26, 2018 · 28 comments

Comments

@yoyanec
Copy link

yoyanec commented Jan 26, 2018

When i use ESP8266 Arduino Core 2.4.0 (KRACK fix), configuration save in configuration ui is causing reset without saving configuration.

@timpur
Copy link
Contributor

timpur commented Jan 27, 2018

Can we have the stack trace ?

@yoyanec
Copy link
Author

yoyanec commented Jan 27, 2018

Sure

✖/homie/config.json doesn't exist
Configuration invalid. Using CONFIG MODE
💡 Firmware bare-minimum (1.0.0)
🔌 Booting into config mode 🔌
Device ID is 5ccf7f239655
AP started as Homie-5ccf7f239655 with IP 192.168.123.1
Triggering Wi-Fi scan...
✔ Wi-Fi scan completed
Received captive portal request: Redirect: http://192.168.123.1
Received captive portal request: Redirect: http://192.168.123.1
Received captive portal request: UI bundle found
Triggering Wi-Fi scan...
✔ Wi-Fi scan completed
Received heart request
Received device information request
Received networks request
Received captive portal request: Redirect: http://192.168.123.1
Triggering Wi-Fi scan...
Received captive portal request: Redirect: http://192.168.123.1
✔ Wi-Fi scan completed
Triggering Wi-Fi scan...
✔ Wi-Fi scan completed
Received config request

Exception (3):
epc1=0x401003e9 epc2=0x00000000 epc3=0x00000000 excvaddr=0x40024441 depc=0x00000000

ctx: sys
sp: 3ffffb30 end: 3fffffb0 offset: 01a0

stack>>>
3ffffcd0: 3ffeaa52 4023fd43 3ffee1c0 3fff5812
3ffffce0: 00000000 402333bb 3fff48dc 00000228
3ffffcf0: 00000228 00000008 3ffffdc0 401004d8
3ffffd00: 3fff5812 40104456 3fff2d0c 4020bc3e
3ffffd10: 00000036 3fff2350 3fff2d0c 3fff0470
3ffffd20: 3ffffd90 3fff04cc 3ffffdc0 4020bdf3
3ffffd30: 00000010 00000010 00000000 4021fb70
3ffffd40: 3fff2350 00000001 3ffe9b39 40207d88
3ffffd50: 40227937 3fff57dc 3ffffd94 4020c028
3ffffd60: 3fff0370 3fff04cc 3fff04cc 4021fcf4
3ffffd70: 00000010 3fff57ac 3fff57ac 3fff0470
3ffffd80: 3fff0370 3fff04cc 3fff4e04 4020c0d4
3ffffd90: 3ffffdc0 3fff5a5c 3ffffdc0 4021d20a
3ffffda0: 3fff0370 3fff04cc 3fff4e04 4020c462
3ffffdb0: 3fff0dc4 00000364 00000364 3fff5820
3ffffdc0: 3ffe8e38 3fff4810 00000000 00000228
3ffffdd0: 00000000 00000030 00000000 4010053d
3ffffde0: 00000014 3fff4810 3fff57dc 4022e458
3ffffdf0: 00000000 00000054 3fff4e04 00000000
3ffffe00: 3fff480c 000000ff 00000000 3fff5292
3ffffe10: 3fff4d24 3fff4e04 3fff4e04 4020c55c
3ffffe20: 00000022 4010320a 00040000 4021c064
3ffffe30: 3ffeec18 40102136 3fff4e04 4021fd38
3ffffe40: 3fff2350 00000000 00002200 40220758
3ffffe50: 3fffc278 000000d2 3fff4e04 4021a4b8
3ffffe60: 3ffffe70 00000000 00000000 4022ebbf
3ffffe70: 40244a8e 00000030 00000010 ffffffff
3ffffe80: 40244b7b 00000002 00000042 000000b4
3ffffe90: 3fff5310 00007d22 00007d22 00000000
3ffffea0: 3fff4d24 3fff524c 00000000 4021a559
3ffffeb0: 3fff0000 3fffdc90 3fff2194 40213c44
3ffffec0: 3fff480c 00000001 3fff3f0c 00000064
3ffffed0: 4022897c 3ffea6a0 3ffea6a0 3fff21b4
3ffffee0: 3fff480c 3fff2198 3fff2194 40213c88
3ffffef0: 3fff480c 3fff2198 3fff2199 4022a32c
3fffff00: 017ba8c0 0000000a 3ffea6a0 00000000
3fffff10: 00000000 000000b4 3fffff80 3fff526a
3fffff20: 3fff2350 3fff524c 3fff23f4 4022e251
3fffff30: 00000014 00000364 00000364 3fff2350
3fffff40: 3fffdc90 3fff2d0c 3fff3f34 3fff2d74
3fffff50: 00000008 3fff2350 3fff524c 402278b1
3fffff60: 3fffdc90 3fff2d0c 3fff3f34 401045cc
3fffff70: 40244b76 3fff2d0c 3fff3f34 40244ba4
3fffff80: 3fff525c 3fff524c 00000000 3fffdcb0
3fffff90: 3ffefce0 00000000 3fff3f34 40246c3f
3fffffa0: 40000f49 3fffdab0 3fffdab0 40000f49
<<<stack<<<

ets Jan 8 2013,rst cause:2, boot mode:(3,6)

load 0x4010f000, len 1384, room 16
tail 8
chksum 0x2d
csum 0x2d
v4ceabea9
~ld

@timpur timpur self-assigned this Jan 28, 2018
@timpur timpur added the bug label Jan 28, 2018
@timpur
Copy link
Contributor

timpur commented Jan 28, 2018

Do you also have the translation of the stack ? https://github.com/me-no-dev/EspExceptionDecoder

Will look into soon when i next have time, soz on hols atm....

@yoyanec
Copy link
Author

yoyanec commented Jan 28, 2018

Decoding 39 results
0x402333bb: LightSleepWakedCbSetFunc at ?? line ?
0x401004d8: malloc at C:\Users\eva\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.4.0\cores\esp8266\umm_malloc/umm_malloc.c line 1668
0x40104456: ppEnqueueRxq at ?? line ?
0x4020bc3e: __fpclassifyd at /Users/igrokhotkov/e/newlib-xtensa/xtensa-lx106-elf/newlib/libm/common/../../../.././newlib/libm/common/s_fpclassify.c line 26
0x4020bdf3: __ieee754_rem_pio2 at /Users/igrokhotkov/e/newlib-xtensa/xtensa-lx106-elf/newlib/libm/math/../../../.././newlib/libm/math/e_rem_pio2.c line 121
0x4021fb70: wpa_receive at ?? line ?
0x40207d88: _strtol_r at /Users/igrokhotkov/e/newlib-xtensa/xtensa-lx106-elf/newlib/libc/stdlib/../../../.././newlib/libc/stdlib/strtol.c line 159
0x40227937: wifi_softap_set_default_ssid at ?? line ?
0x4020c028: __ieee754_rem_pio2 at /Users/igrokhotkov/e/newlib-xtensa/xtensa-lx106-elf/newlib/libm/math/../../../.././newlib/libm/math/e_rem_pio2.c line 159 (discriminator 1)
0x4021fcf4: __wpa_send_eapol at ?? line ?
0x4020c0d4: __ieee754_rem_pio2 at /Users/igrokhotkov/e/newlib-xtensa/xtensa-lx106-elf/newlib/libm/math/../../../.././newlib/libm/math/e_rem_pio2.c line 175
0x4021d20a: cnx_start_handoff_cb at ?? line ?
0x4020c462: __kernel_rem_pio2 at /Users/igrokhotkov/e/newlib-xtensa/xtensa-lx106-elf/newlib/libm/math/../../../.././newlib/libm/math/k_rem_pio2.c line 189
0x4010053d: _umm_realloc at C:\Users\eva\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.4.0\cores\esp8266\umm_malloc/umm_malloc.c line 1495
: (inlined by) realloc at C:\Users\eva\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.4.0\cores\esp8266\umm_malloc/umm_malloc.c line 1713
0x4022e458: reduce_current_init at ?? line ?
0x4020c55c: __kernel_rem_pio2 at /Users/igrokhotkov/e/newlib-xtensa/xtensa-lx106-elf/newlib/libm/math/../../../.././newlib/libm/math/k_rem_pio2.c line 205
0x4010320a: lmacRecycleMPDU at ?? line ?
0x4021c064: sta_input at ?? line ?
0x40102136: phy_adc_read_fast at ?? line ?
0x4021fd38: __wpa_send_eapol at ?? line ?
0x40220758: wpa_remove_ptk at ?? line ?
0x4021a4b8: ieee80211_set_tim at ?? line ?
0x4022ebbf: set_most_pwr_reg at ?? line ?
0x4021a559: ieee80211_pwrsave at ?? line ?
0x40213c44: sntp_recv at /home/david/dev/esp8266/origin/tools/sdk/lwip2/builder/lwip2-src/src/apps/sntp/sntp.c line 612
0x4022897c: wifi_get_ip_info at ?? line ?
0x40213c88: sntp_recv at /home/david/dev/esp8266/origin/tools/sdk/lwip2/builder/lwip2-src/src/apps/sntp/sntp.c line 612
0x4022a32c: ram_rfpll_set_freq at ?? line ?
0x4022e251: set_crystal_uart at ?? line ?
0x402278b1: wifi_softap_set_default_ssid at ?? line ?
0x401045cc: ppCalTxop at ?? line ?

@timpur
Copy link
Contributor

timpur commented Jan 29, 2018

@yoyanec Just want to verify something, you can only decode the stack trace correctly when you use the same build go decode as what was flashed. In other words you have to build then flash the board then decode the stack without any builds in between..... trying to use an old stack trace on a new build will give you wrong and weird results.

Assuming you've does this right, looks like homie doesn't have much blood in the water. Verify you decoded the stack correctly and then i'll dive into this.

@yoyanec
Copy link
Author

yoyanec commented Jan 29, 2018

@timpur I will reflash, reupoload and try again. Just to be sure. I was working on my project and not sure if i did it correctly.

@yoyanec
Copy link
Author

yoyanec commented Jan 29, 2018

Decoding 39 results
0x4023fd43: ppTxPkt at ?? line ?
0x402333bb: ieee80211_output_pbuf at ?? line ?
0x401004d8: malloc at C:\Users\eva\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.4.0\cores\esp8266\umm_malloc/umm_malloc.c line 1668
0x40104456: glue2esp_linkoutput at /home/david/dev/esp8266/origin/tools/sdk/lwip2/builder/glue-esp/lwip-esp.c line 292
0x4020bc3e: ArduinoJson::Internals::DynamicJsonBufferBase ::addNewBlock(unsigned int) at C:\Users\eva\Desktop\GDrive\30_underconstruction\IOT\Arduino\libraries\ArduinoJson\src/ArduinoJson/DynamicJsonBuffer.hpp line 143
: (inlined by) ArduinoJson::Internals::DynamicJsonBufferBase ::allocInNewBlock(unsigned int) at C:\Users\eva\Desktop\GDrive\30_underconstruction\IOT\Arduino\libraries\ArduinoJson\src/ArduinoJson/DynamicJsonBuffer.hpp line 135
0x4020bdf3: ArduinoJson::Internals::DynamicJsonBufferBase ::alloc(unsigned int) at C:\Users\eva\Desktop\GDrive\30_underconstruction\IOT\Arduino\libraries\ArduinoJson\src/ArduinoJson/DynamicJsonBuffer.hpp line 67
0x4021fb70: ArduinoJson::Internals::JsonBufferAllocated::operator new(unsigned int, ArduinoJson::JsonBuffer*) at C:\Users\eva\Desktop\GDrive\30_underconstruction\IOT\Arduino\libraries\ArduinoJson\src/ArduinoJson/Data/JsonBufferAllocated.hpp line 17
0x40207d88: ArduinoJson::JsonBuffer::createObject() at C:\Users\eva\Desktop\GDrive\30_underconstruction\IOT\Arduino\libraries\ArduinoJson\src/ArduinoJson/JsonObject.hpp line 273
0x40227937: ethernet_output at /home/david/dev/esp8266/origin/tools/sdk/lwip2/builder/lwip2-src/src/netif/ethernet.c line 305
0x4020c028: ArduinoJson::Internals::JsonParser ::Reader, ArduinoJson::Internals::DynamicJsonBufferBase &>::parseObject() at C:\Users\eva\Desktop\GDrive\30_underconstruction\IOT\Arduino\libraries\ArduinoJson\src/ArduinoJson/Deserialization/JsonParserImpl.hpp line 95
0x4021fcf4: HomieInternals::Logger::write(unsigned char const*, unsigned int) at C:\Users\eva\Desktop\GDrive\30_underconstruction\IOT\Arduino\libraries\homie-esp8266\src\Homie/Logger.cpp line 24
0x4020c0d4: ArduinoJson::JsonObject& ArduinoJson::Internals::JsonBufferBase >::parseObject (char const*, unsigned char) at C:\Users\eva\Desktop\GDrive\30_underconstruction\IOT\Arduino\libraries\ArduinoJson\src/ArduinoJson/JsonBufferBase.hpp line 79
0x4021d20a: Print::print(char const*) at C:\Users\eva\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.4.0\cores\esp8266/Print.cpp line 87
0x4020c462: HomieInternals::BootConfig::_onConfigRequest(AsyncWebServerRequest*) at C:\Users\eva\Desktop\GDrive\30_underconstruction\IOT\Arduino\libraries\homie-esp8266\src\Homie\Boot/BootConfig.cpp line 389
0x4010053d: _umm_realloc at C:\Users\eva\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.4.0\cores\esp8266\umm_malloc/umm_malloc.c line 1495
: (inlined by) realloc at C:\Users\eva\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.4.0\cores\esp8266\umm_malloc/umm_malloc.c line 1713
0x4022e458: ip4_output_if_opt_src at /home/david/dev/esp8266/origin/tools/sdk/lwip2/builder/lwip2-src/src/core/ipv4/ip4.c line 962
0x4020c55c: _M_invoke at c:\users\eva\appdata\local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\xtensa-lx106-elf\include\c++\4.8.2/functional line 2073
0x4010320a: lmacProcessTXStartData at ?? line ?
0x4021c064: std::function ::operator()(AsyncWebServerRequest*) const at C:\Users\eva\Desktop\GDrive\30_underconstruction\IOT\Arduino\libraries\ESPAsyncWebServer-master\src/WebServer.cpp line 79
: (inlined by) AsyncCallbackWebHandler::handleRequest(AsyncWebServerRequest*) at C:\Users\eva\Desktop\GDrive\30_underconstruction\IOT\Arduino\libraries\ESPAsyncWebServer-master\src/WebHandlerImpl.h line 95
0x40102136: wDev_ProcessFiq at ?? line ?
0x4021fd38: std::_Function_handler ::_M_invoke(std::_Any_data const&, AsyncWebServerRequest*, unsigned char*, unsigned int, unsigned int, unsigned int) at c:\users\eva\appdata\local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\xtensa-lx106-elf\include\c++\4.8.2/functional line 2073
0x40220758: AsyncCallbackWebHandler::handleBody(AsyncWebServerRequest*, unsigned char*, unsigned int, unsigned int, unsigned int) at C:\Users\eva\Desktop\GDrive\30_underconstruction\IOT\Arduino\libraries\ESPAsyncWebServer-master\src/WebHandlerImpl.h line 106
0x4021a4b8: AsyncWebServerRequest::_onData(void*, unsigned int) at C:\Users\eva\Desktop\GDrive\30_underconstruction\IOT\Arduino\libraries\ESPAsyncWebServer-master\src/WebRequest.cpp line 792
0x4022ebbf: ip_chksum_pseudo at /home/david/dev/esp8266/origin/tools/sdk/lwip2/builder/lwip2-src/src/core/inet_chksum.c line 542
0x40244a8e: pbuf_free at /home/david/dev/esp8266/origin/tools/sdk/lwip2/builder/glue-esp/lwip-esp.c line 665
0x40244b7b: ethernet_input at /home/david/dev/esp8266/origin/tools/sdk/lwip2/builder/glue-esp/lwip-esp.c line 351
0x4021a559: _M_invoke at C:\Users\eva\Desktop\GDrive\30_underconstruction\IOT\Arduino\libraries\ESPAsyncWebServer-master\src/WebRequest.cpp line 792
0x40213c44: AsyncClient::_recv(tcp_pcb*, pbuf*, long) at C:\Users\eva\Desktop\GDrive\30_underconstruction\IOT\Arduino\libraries\ESPAsyncTCP-master\src/ESPAsyncTCP.cpp line 665
0x4022897c: cyclic_timer at /home/david/dev/esp8266/origin/tools/sdk/lwip2/builder/lwip2-src/src/core/timeouts.c line 165
0x40213c88: AsyncClient::_s_recv(void*, tcp_pcb*, pbuf*, long) at C:\Users\eva\Desktop\GDrive\30_underconstruction\IOT\Arduino\libraries\ESPAsyncTCP-master\src/ESPAsyncTCP.cpp line 665
0x4022a32c: tcp_input at /home/david/dev/esp8266/origin/tools/sdk/lwip2/builder/lwip2-src/src/core/tcp_in.c line 435 (discriminator 1)
0x4022e251: ip4_input at /home/david/dev/esp8266/origin/tools/sdk/lwip2/builder/lwip2-src/src/core/ipv4/ip4.c line 685
0x402278b1: ethernet_input_LWIP2 at /home/david/dev/esp8266/origin/tools/sdk/lwip2/builder/lwip2-src/src/netif/ethernet.c line 182
0x401045cc: esp2glue_ethernet_input at /home/david/dev/esp8266/origin/tools/sdk/lwip2/builder/glue-lwip/lwip-git.c line 406
0x40244b76: ethernet_input at /home/david/dev/esp8266/origin/tools/sdk/lwip2/builder/glue-esp/lwip-esp.c line 349
0x40244ba4: ethernet_input at /home/david/dev/esp8266/origin/tools/sdk/lwip2/builder/glue-esp/lwip-esp.c line 357
0x40246c3f: ets_snprintf at ?? line ?

@timpur
Copy link
Contributor

timpur commented Jan 30, 2018

Much better, will look into.

Any chance of getting your code ? or tell me if your importing #include <ArduinoJson.h> and doing anything with ArduinoJson ??

Looking at https://arduinojson.org/faq/why-does-my-device-crash-or-reboot/ since it seems to be an issue with ArduinoJson atm.

@yoyanec
Copy link
Author

yoyanec commented Jan 30, 2018

This is code i used
https://github.com/hiveeyes/arduino/blob/master/node-wifi-mqtt-homie/node-wifi-mqtt-homie.ino

this is the part using ArduinoJson (in loop())

StaticJsonBuffer<200>jsonBuffer;
JsonObject& root = jsonBuffer.createObject();
root["Weight"] = round2two(weight);
root["Temp1"] = round2two(temperature0);
root["Temp2"] = round2two(temperature1);
String values;
root.printTo(values);
Homie.getLogger() << "Json data:" << values << endl;
jsonNode.setProperty("json").setRetained(false).send(values);

But then i reflash Bare minimum sketch from http://marvinroger.github.io/homie-esp8266/docs/develop/quickstart/getting-started/ with the same error.

Just to be sure, nodemcu reset just after homie recieved configuration from ui_bundle

Receivedconfig request
Exception (3):
epc1=0x401003e9 epc2=0x00000000 epc3=0x00000000 excvaddr=0x40024441 depc=0x00000000

@Gulaschcowboy
Copy link

As the owner of https://github.com/hiveeyes/arduino/blob/master/node-wifi-mqtt-homie/node-wifi-mqtt-homie.ino: I had similar issue with wrong flash mode. Which flash mode do you use? What is your exact ESP board?

@yoyanec
Copy link
Author

yoyanec commented Jan 30, 2018

@Gulaschcowboy Based on line in boards.txt under esp8266/2.4.0/ folder, i believe it is DIO

nodemcuv2.build.flash_mode=dio

@Gulaschcowboy
Copy link

@yoyanec: I had my ESP07 barebone once wrongly flashed using DOUT. It caused also an exception while writing the config. Changing to DIO fixed it. But it depends on your board and how the flash is wired to the ESP. As I'm not an expert in SPI/flash wiring see https://github.com/espressif/esptool/wiki/SPI-Flash-Modes and try other modes.

@timpur
Copy link
Contributor

timpur commented Jan 31, 2018

Sounds like thats on the money, thanks @Gulaschcowboy

@yoyanec
Copy link
Author

yoyanec commented Jan 31, 2018

OK, problem fixed. It is not Flash Mode (i tried all :). With ESP8266 Arduino Core 2.4.0, nodemcu 1.0 has new options in tools. I dont know, what is IwIP Variant. Default value is v2 Prebuilt (MSS = 536). After change to v1.4 Prebuilt everything works like a charm.

@timpur @Gulaschcowboy Thank you very much.

homiebug

@yoyanec yoyanec closed this as completed Jan 31, 2018
@timpur
Copy link
Contributor

timpur commented Feb 1, 2018

Intresting, thanks for that.

@Gulaschcowboy
Copy link

@timpur lwIP v2 became the default and should address MTU issues when the ESP is connected over a xDSL line for example.
So it would be nice if v2 would work. Do you think this crash is homie related or does it have to be addressed to the esp8266 core developers?

@timpur
Copy link
Contributor

timpur commented Feb 1, 2018

I use v2.4 with lwip2.0 and all seems fine, maybe clean your dependencies and reinstall them ??

@timpur timpur reopened this Feb 1, 2018
@Gulaschcowboy
Copy link

Gulaschcowboy commented Feb 5, 2018

@timpur How did you upload the config.json? And does LwIP 2.0 mean MSS=536? Because: When I use LwIP MSS=536 and do the config upload via curl I get:
Decoding 34 results 0x401004d8: malloc at /home/atze/.arduino15/packages/esp8266/hardware/esp8266/2.4.0/cores/esp8266/umm_malloc/umm_malloc.c line 1668 0x4020c7d6: ArduinoJson::Internals::DynamicJsonBufferBase ::addNewBlock(unsigned int) at /home/atze/Dokumente/arduino/libraries/ArduinoJson/src/ArduinoJson/DynamicJsonBuffer.hpp line 143 : (inlined by) ArduinoJson::Internals::DynamicJsonBufferBase ::allocInNewBlock(unsigned int) at /home/atze/Dokumente/arduino/libraries/ArduinoJson/src/ArduinoJson/DynamicJsonBuffer.hpp line 135 0x4020c98b: ArduinoJson::Internals::DynamicJsonBufferBase ::alloc(unsigned int) at /home/atze/Dokumente/arduino/libraries/ArduinoJson/src/ArduinoJson/DynamicJsonBuffer.hpp line 67 0x402207ec: ArduinoJson::Internals::JsonBufferAllocated::operator new(unsigned int, ArduinoJson::JsonBuffer*) at /home/atze/Dokumente/arduino/libraries/ArduinoJson/src/ArduinoJson/Data/JsonBufferAllocated.hpp line 17 0x40208924: ArduinoJson::JsonBuffer::createObject() at /home/atze/Dokumente/arduino/libraries/ArduinoJson/src/ArduinoJson/JsonObject.hpp line 273 0x4020cbc0: ArduinoJson::Internals::JsonParser ::Reader, ArduinoJson::Internals::DynamicJsonBufferBase &>::parseObject() at /home/atze/Dokumente/arduino/libraries/ArduinoJson/src/ArduinoJson/Deserialization/JsonParserImpl.hpp line 95 0x40220970: HomieInternals::Logger::write(unsigned char const*, unsigned int) at /home/atze/Dokumente/arduino/libraries/homie-esp8266/src/Homie/Logger.cpp line 24 0x4020cc6c: ArduinoJson::JsonObject& ArduinoJson::Internals::JsonBufferBase >::parseObject (char const*, unsigned char) at /home/atze/Dokumente/arduino/libraries/ArduinoJson/src/ArduinoJson/JsonBufferBase.hpp line 79 0x4021de0a: Print::printf(char const*, ...) at ?? line ? 0x4020cffa: HomieInternals::BootConfig::_onConfigRequest(AsyncWebServerRequest*) at /home/atze/Dokumente/arduino/libraries/homie-esp8266/src/Homie/Boot/BootConfig.cpp line 389 0x4010020c: _umm_free at /home/atze/.arduino15/packages/esp8266/hardware/esp8266/2.4.0/cores/esp8266/umm_malloc/umm_malloc.c line 1291 0x4010053d: _umm_realloc at /home/atze/.arduino15/packages/esp8266/hardware/esp8266/2.4.0/cores/esp8266/umm_malloc/umm_malloc.c line 1495 : (inlined by) realloc at /home/atze/.arduino15/packages/esp8266/hardware/esp8266/2.4.0/cores/esp8266/umm_malloc/umm_malloc.c line 1713 0x401004d8: malloc at /home/atze/.arduino15/packages/esp8266/hardware/esp8266/2.4.0/cores/esp8266/umm_malloc/umm_malloc.c line 1668 0x4020d0f4: _M_invoke at /home/atze/.arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/1.20.0-26-gb404fb9-2/xtensa-lx106-elf/include/c++/4.8.2/functional line 2073 0x4021cc70: std::function ::operator()(AsyncWebServerRequest*) const at /home/atze/Dokumente/arduino/libraries/ESPAsyncWebServer/src/WebServer.cpp line 79 : (inlined by) AsyncCallbackWebHandler::handleRequest(AsyncWebServerRequest*) at /home/atze/Dokumente/arduino/libraries/ESPAsyncWebServer/src/WebHandlerImpl.h line 95 0x402209b4: std::_Function_handler ::_M_invoke(std::_Any_data const&, AsyncWebServerRequest*, unsigned char*, unsigned int, unsigned int, unsigned int) at /home/atze/.arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/1.20.0-26-gb404fb9-2/xtensa-lx106-elf/include/c++/4.8.2/functional line 2073 0x402213d4: AsyncCallbackWebHandler::handleBody(AsyncWebServerRequest*, unsigned char*, unsigned int, unsigned int, unsigned int) at /home/atze/Dokumente/arduino/libraries/ESPAsyncWebServer/src/WebHandlerImpl.h line 106 0x4021b0c4: AsyncWebServerRequest::_onData(void*, unsigned int) at /home/atze/Dokumente/arduino/libraries/ESPAsyncWebServer/src/WebRequest.cpp line 792 0x402206ac: std::_Function_base::~_Function_base() at /home/atze/.arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/1.20.0-26-gb404fb9-2/xtensa-lx106-elf/include/c++/4.8.2/functional line 2031 0x4010020c: _umm_free at /home/atze/.arduino15/packages/esp8266/hardware/esp8266/2.4.0/cores/esp8266/umm_malloc/umm_malloc.c line 1291 0x40100690: free at /home/atze/.arduino15/packages/esp8266/hardware/esp8266/2.4.0/cores/esp8266/umm_malloc/umm_malloc.c line 1737 0x4021b165: _M_invoke at /home/atze/Dokumente/arduino/libraries/ESPAsyncWebServer/src/WebRequest.cpp line 792 0x4021484d: AsyncClient::_recv(tcp_pcb*, pbuf*, long) at /home/atze/Dokumente/arduino/libraries/ESPAsyncTCP/src/ESPAsyncTCP.cpp line 659 0x40214898: AsyncClient::_s_recv(void*, tcp_pcb*, pbuf*, long) at /home/atze/Dokumente/arduino/libraries/ESPAsyncTCP/src/ESPAsyncTCP.cpp line 659 0x4022afa8: tcp_input at /home/david/dev/esp8266/origin/tools/sdk/lwip2/builder/lwip2-src/src/core/tcp_in.c line 435 (discriminator 1) 0x4022eecd: ip4_input at /home/david/dev/esp8266/origin/tools/sdk/lwip2/builder/lwip2-src/src/core/ipv4/ip4.c line 685 0x4022852d: ethernet_input_LWIP2 at /home/david/dev/esp8266/origin/tools/sdk/lwip2/builder/lwip2-src/src/netif/ethernet.c line 182 0x401045cc: esp2glue_ethernet_input at /home/david/dev/esp8266/origin/tools/sdk/lwip2/builder/glue-lwip/lwip-git.c line 406 0x402457f2: ethernet_input at /home/david/dev/esp8266/origin/tools/sdk/lwip2/builder/glue-esp/lwip-esp.c line 349 0x40245820: ethernet_input at /home/david/dev/esp8266/origin/tools/sdk/lwip2/builder/glue-esp/lwip-esp.c line 357 0x4024075b: ppPeocessRxPktHdr at ?? line ? 0x402478bb: ets_snprintf at ?? line ?
But if I use esptool to flash the SPIFFS it works. Speculation (as I don't understand the stack trace): Packet size/fragmentation issues?
Shall I start running some test with wireshark?

EDIT: Did a quick test with MSS=1460 and there I can use curl to configure. Will do some more tests.
EDIT2: With MSS=1460 configuration via curl is not reliably possible. Around 50% of the attempts cause an exception as well.
EDIT3: Tested again several times with MSS=536, actually same behavior as with MSS=1460: 50% of the curl attempts fail with an exception.

@timpur
Copy link
Contributor

timpur commented Feb 6, 2018

hmm ill look into this, but i dont seem to be getting issues, that said i was using arduino ide, ill test platform IO

Edit: been using 2.4.0 for a while on both arduino and platform io. All seems fine maybe test using bare homie sketch ?

@Gulaschcowboy
Copy link

BTW, my tests/results are with Arduino IDE

@Gulaschcowboy
Copy link

Did some more tests with fresh PlatformIO environment. Couldn't reproduce this issue there. :-(
But to be honest, I'm not sure how to compile there with LwIP2 vs. 1.4 vs. different MSS sizes.

@timpur
Copy link
Contributor

timpur commented Feb 6, 2018

With arduino try updating all libs to latest ? especially homie, aruinojson, asyncmqtt, asynctcp

@Gulaschcowboy
Copy link

Deleted and recreated the whole libraries folder with latest versions. Compiled, uploaded.
1st config try:
curl -X PUT http://192.168.123.1/config --header "Content-Type: application/json" -d @config-alarm-test.json

Received config request
✖ Invalid or too big JSON

Exception (29):
epc1=0x4021eb67 epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000000 depc=0x00000000

This "Invalid JSON" is new and I'm 100% sure, that it is not, because in the second try same config.json works (see below)

Decoded stack trace:

`

0x4021eb67: String::init() at /home/atze/.arduino15/packages/esp8266/hardware/esp8266/2.4.0/cores/esp8266/WString.cpp line 746
: (inlined by) String::String(String const&) at /home/atze/.arduino15/packages/esp8266/hardware/esp8266/2.4.0/cores/esp8266/WString.cpp line 39
0x4021f478: operator new(unsigned int) at /home/atze/.arduino15/packages/esp8266/hardware/esp8266/2.4.0/cores/esp8266/abi.cpp line 57
0x4021b69e: AsyncWebHeader at /home/atze/Dokumente/arduino/libraries/ESPAsyncWebServer/src/WebResponseImpl.h line 126
: (inlined by) AsyncWebServerResponse::addHeader(String const&, String const&) at /home/atze/Dokumente/arduino/libraries/ESPAsyncWebServer/src/WebResponses.cpp line 123
0x4021b680: AsyncWebServerResponse::addHeader(String const&, String const&) at /home/atze/Dokumente/arduino/libraries/ESPAsyncWebServer/src/WebResponseImpl.h line 126
0x4021ea92: String::String(char const*) at /home/atze/.arduino15/packages/esp8266/hardware/esp8266/2.4.0/cores/esp8266/WString.cpp line 746
0x4021eb48: String::operator=(String const&) at /home/atze/.arduino15/packages/esp8266/hardware/esp8266/2.4.0/cores/esp8266/WString.cpp line 746
0x4021b680: AsyncWebServerResponse::addHeader(String const&, String const&) at /home/atze/Dokumente/arduino/libraries/ESPAsyncWebServer/src/WebResponseImpl.h line 126
0x4021bda3: AsyncBasicResponse::AsyncBasicResponse(int, String const&, String const&) at /home/atze/Dokumente/arduino/libraries/ESPAsyncWebServer/src/WebResponseImpl.h line 126
0x401004d8: malloc at /home/atze/.arduino15/packages/esp8266/hardware/esp8266/2.4.0/cores/esp8266/umm_malloc/umm_malloc.c line 1668
0x40255236: sleep_reset_analog_rtcreg_8266 at ?? line ?
0x4021a388: AsyncWebServerRequest::beginResponse(int, String const&, String const&) at /home/atze/Dokumente/arduino/libraries/ESPAsyncWebServer/src/WebRequest.cpp line 792
0x4021ec4c: String::operator=(__FlashStringHelper const*) at /home/atze/.arduino15/packages/esp8266/hardware/esp8266/2.4.0/cores/esp8266/WString.cpp line 746
0x4021a3a3: AsyncWebServerRequest::send(int, String const&, String const&) at /home/atze/Dokumente/arduino/libraries/ESPAsyncWebServer/src/WebRequest.cpp line 792
0x4020c39e: HomieInternals::BootConfig::__SendJSONError(AsyncWebServerRequest*, String, short) at /home/atze/Dokumente/arduino/libraries/homie-esp8266/src/Homie/Boot/BootConfig.cpp line 443
0x4020d012: HomieInternals::BootConfig::_onConfigRequest(AsyncWebServerRequest*) at /home/atze/Dokumente/arduino/libraries/homie-esp8266/src/Homie/Boot/BootConfig.cpp line 391
0x4010020c: _umm_free at /home/atze/.arduino15/packages/esp8266/hardware/esp8266/2.4.0/cores/esp8266/umm_malloc/umm_malloc.c line 1291
0x4010053d: _umm_realloc at /home/atze/.arduino15/packages/esp8266/hardware/esp8266/2.4.0/cores/esp8266/umm_malloc/umm_malloc.c line 1495
: (inlined by) realloc at /home/atze/.arduino15/packages/esp8266/hardware/esp8266/2.4.0/cores/esp8266/umm_malloc/umm_malloc.c line 1713
0x401004d8: malloc at /home/atze/.arduino15/packages/esp8266/hardware/esp8266/2.4.0/cores/esp8266/umm_malloc/umm_malloc.c line 1668
0x4020d0f4: _M_invoke at /home/atze/.arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/1.20.0-26-gb404fb9-2/xtensa-lx106-elf/include/c++/4.8.2/functional line 2073
0x4021ccf4: std::function ::operator()(AsyncWebServerRequest*) const at /home/atze/Dokumente/arduino/libraries/ESPAsyncWebServer/src/WebServer.cpp line 79
: (inlined by) AsyncCallbackWebHandler::handleRequest(AsyncWebServerRequest*) at /home/atze/Dokumente/arduino/libraries/ESPAsyncWebServer/src/WebHandlerImpl.h line 95
0x40220a38: std::_Function_handler ::_M_invoke(std::_Any_data const&, AsyncWebServerRequest*, unsigned char*, unsigned int, unsigned int, unsigned int) at /home/atze/.arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/1.20.0-26-gb404fb9-2/xtensa-lx106-elf/include/c++/4.8.2/functional line 2073
0x40221444: AsyncCallbackWebHandler::handleBody(AsyncWebServerRequest*, unsigned char*, unsigned int, unsigned int, unsigned int) at /home/atze/Dokumente/arduino/libraries/ESPAsyncWebServer/src/WebHandlerImpl.h line 106
0x4021b148: AsyncWebServerRequest::_onData(void*, unsigned int) at /home/atze/Dokumente/arduino/libraries/ESPAsyncWebServer/src/WebRequest.cpp line 792
0x4021b1e9: _M_invoke at /home/atze/Dokumente/arduino/libraries/ESPAsyncWebServer/src/WebRequest.cpp line 792
0x4021487c: AsyncClient::_recv(tcp_pcb*, pbuf*, long) at /home/atze/Dokumente/arduino/libraries/ESPAsyncTCP/src/ESPAsyncTCP.cpp line 665
0x402148c0: AsyncClient::_s_recv(void*, tcp_pcb*, pbuf*, long) at /home/atze/Dokumente/arduino/libraries/ESPAsyncTCP/src/ESPAsyncTCP.cpp line 665
0x4022b018: tcp_input at /home/david/dev/esp8266/origin/tools/sdk/lwip2/builder/lwip2-src/src/core/tcp_in.c line 435 (discriminator 1)
0x4022ef3d: ip4_input at /home/david/dev/esp8266/origin/tools/sdk/lwip2/builder/lwip2-src/src/core/ipv4/ip4.c line 685
0x4022859d: ethernet_input_LWIP2 at /home/david/dev/esp8266/origin/tools/sdk/lwip2/builder/lwip2-src/src/netif/ethernet.c line 182
0x401045cc: esp2glue_ethernet_input at /home/david/dev/esp8266/origin/tools/sdk/lwip2/builder/glue-lwip/lwip-git.c line 406
0x40245862: ethernet_input at /home/david/dev/esp8266/origin/tools/sdk/lwip2/builder/glue-esp/lwip-esp.c line 349
0x40245890: ethernet_input at /home/david/dev/esp8266/origin/tools/sdk/lwip2/builder/glue-esp/lwip-esp.c line 357
0x402407cb: ppPeocessRxPktHdr at ?? line ?
0x4024792b: ets_snprintf at ?? line ?
`

2nd try (yes, same config):
curl -X PUT http://192.168.123.1/config --header "Content-Type: application/json" -d @config-alarm-test.json

Received config request
✔ Configured
↻ Rebooting into normal mode..

@timpur
Copy link
Contributor

timpur commented Feb 7, 2018

yes, it has been known fresh upload weird things can happen and is recommenced to do a reset after reload, not sure its worth trying to fix this .... so all seems fine to me.

@Gulaschcowboy
Copy link

OK, my bad. I know this behavior but forgot to do a reset after flashing. So at the moment I cant't reproduce anymore.

@timpur
Copy link
Contributor

timpur commented Feb 22, 2018

Believe i have a fix for this in 2.1, will push to dev here if it does fix.

timpur added a commit to timpur/homie-esp8266 that referenced this issue Mar 18, 2018
timpur added a commit that referenced this issue Mar 18, 2018
* Fix #446 CORS Issue

* Fix for #477

* Fix Lint
@timpur
Copy link
Contributor

timpur commented Mar 18, 2018

@yoyanec can you check that current dev has fixed this? #501

@yoyanec
Copy link
Author

yoyanec commented Mar 21, 2018

@timpur I will check, just need few days.

euphi added a commit to euphi/homie-esp8266 that referenced this issue Mar 31, 2018
* 🔥 Remove hardcoded keepalive - fix homieiot#301 (homieiot#314)

Remove hardcoded KeepAlive for MQTT connection.
Default value of 15sec is already present in AsyncMQTT library

* 🐎 Improve uptime accuracy (homieiot#315)

improve uptime accuracy by storing milliseconds and only rounding when
publishing value
drawback: less time before rollover, but still long enough

* 🐛 Fix truncated IP (homieiot#318)

published IP is truncated.

* 🎨 Fix warning with parenthesis

* 🐛 Fix pio library.json bad dependency name

* ✨ Add support for static IP and BSSID/MAC, channel of AP (homieiot#327)

* Support for static IP and BSSID/MAC, Channel of AP

- added parameters to config.json which allow to define static ip, mask,
gateway, dns
- added parameters to config.json which allow to define BSSID and
channel of AP

To run device with defined static IP you have to define ip, mask and
gateway together.

To point device to connect to specific BSSID and channel you haveto
define bssid and channel together.

```
{

	"name": "The kitchen light",
	"device_id": "kitchen-light",
	"wifi": {
		"ssid": "Network_1",
		"password": "I'm a Wi-Fi password!",
		"bssid":
		"DE:AD:BE:EF:BA:BE",
		"channel": 1,
		"ip": "192.168.1.5",
		"mask": "255.255.255.0",
		"gw": "192.168.1.1"
	},
	"mqtt": {
		"host": "192.168.1.10",
		"port": 1883,
		"base_topic": "devices/",
		"auth": true,
		"username": "user",
		"password": "pass" i
	},
	"ota": {
		"enabled": true
	},
	"settings": {
		"param1": 55,
		"param2": "abcdefghijklm",
		"param3": true,
		"param4": false,
		"param5": 2147483647,
		"param6": -2147483647,
		"param7": 55,
		"param8": "abcdefghijklm",
		"param9": true,
		"param10": false
	}
}
```

* Addjustments for travis

* Another addjustments for travis

* Fix problem with prepareToSleep

* 🐎 Pass all callbacks by reference
Still store it by value

* 🐎 Make isActive const

* 🎨 Add custom settings value to initial log

* ✨ Abort if default setting value does not pass validator function
Fix homieiot#324

* 📝 Clarify ISSUE_TEMPLATE docs location for homieiot#331

* 📝 Implement new versioned Git docs (homieiot#341)

* ✨ Add versionned in-repo docs

* 🐛 Attempt to fix encrypted key

* 🐛 Fix permission issue on python exec

* 🐛 Add mission import

* 🐛 Fix relative path

* 🐛 Add missing commit

* ✨ Add index

* 🎨 Change index design

* 📝 Update all URLs to new docs

* 🎨 Fix broken doc link in README

* 📝 Add edit link to docs

* 📝 Move firmware_parser.py to scripts folder

* 🐛 Fix out of limits abort message not showing

* 👕 Be less strict on whitespace in comments

* 📝 Add dummy OTA updater script (TODO)

* 🎨 🐎 Use CircleCi instead of Travis CI (homieiot#348)

* ✨ Add Circle CI build

* 🐛 Add working_directory

* 🐛 Attempt to fix perm issue

* ✨ Generate docs from CircleCI

* 🐛 Fix path

* 🐛 Fix chmod permission

* 🐛 Try to run sudo

* 🐛 Attempt to use remote docker

* 🐛 Change bad directories

* 🐛 Remove dependency on Docker

* 🐛 Fix perm problem

* 🐛 Chamge tmp folder

* 🐎 Use CircleCI instead of Travis CI

* 🎨 Add SonoffDualShutters example

* 🐛 Install current lib to platformio

* 🐛 Actually ignore gh-pages in CI

* 🐛 Add missing SonoffDual dep

* 🐛 Fix ArduinoJSON 5.11.0 (homieiot#363)

* ⬆️ Update pio dependencies

* 🎨 Cleanup code a bit

* 🐛 Make sure every announcements packet are sent - closes homieiot#345

* 🎨 Refactor code and implement new OTA system
Closes homieiot#346

* 👕 Fix lint

* ✅ Use new workflow feature from Circle

* ✅ Ignore gh-pages at workflow level

* ✨ Add OTA_PROGRESS event

* 📝 Update docs for new OTA system

* ⬆️ Upgrade AsyncMqttClient dependency to 0.8.0

* 🐛 IHomieSetting::settings first, HomieNode-settings second! (homieiot#335)

*  IHomieSetting::settings first, HomieNode-settings second!

Set initialization priority of IHomieSetting::settings to value of highest allowed priority (101).

This allows other static variables to be of type HomieSetting<T>.

See https://github.com/euphi/HomieNodeCollection/blob/master/src/RGBWNode.cpp for example.

Note: As shown in the example it makes sense to have a static HomieSetting member, if you have a class that may be instantiated multiple times. (e.g. two LED Strips connected to the same ESP8266, as shown in https://github.com/euphi/ESP-LEDCtrl).

* Removed extra whitespaces

* Removed another whitespace

* 🐛 Fix not returning a value in setConfigurationApPassword (homieiot#378)

`HomieClass& HomieClass::setConfigurationApPassword(const char* password)` did not returned a reference to the Homie instance. This PR fixes this.

* 🐛 Fix crash when starting up without any defined node (homieiot#379)

* Fix crash when starting up without any defined node

Skip node publication if HomieNode::nodes.size() == 0

* Update BootNormal.cpp

* 🐛 Fix topic check for OTA upload (homieiot#375)

* Change topic check for OTA upload

* Change firmware topics to remove the 's'

* 🐛 Rename last OTA topic instance

* ✨ Add OTA updater script (homieiot#384)

* 🐍Add python ota updater script

* 💼 Update documentation of ota update script

* 😑 Add comments to ota updater script

* 🔮 Use 127.0.0.1:1883 as default broker setting

For the ota updater script

* 📝 Add details on how to interact with range property (homieiot#393)

Add hint to help people figure out how to interact with
range properties. Especially document the `_` separator.

* 📝 Add warning to input-handlers.md about concurrency (homieiot#400)

* 🐛 Interpret firmware file as an bytearray (homieiot#403)

Fix homieiot#397

* 📝 Update input-handlers.md (homieiot#401)

* Update input-handlers.md

Sorry, it seems that I used the `!!! warning` block in a wrong way.

* Update input-handlers.md

* Update input-handlers.md

* ✨ Use AsyncWebServer + Refactoring (homieiot#425)

* Initial AsyncWebServer

* Fixed Proccessing Body Requests (JSON)

* Doc Fixes + typo

* Added Missing Method in Timer.cpp

* Lots of Refactoring + Moved Reset Button to its own helper class for boots to use

* 🎨 Update BootNormal.cpp (homieiot#426)

Solve "else" errors from https://circleci.com/gh/marvinroger/homie-esp8266/136#tests/containers/0

* ⬆️ Update dependency to "ESP Async WebServer" (homieiot#434)

* 📝 Add instruction for @platformio (homieiot#435)

* Instruction for @platformio

* Explain how to used tagged version with @platformio

* Explain how to use tagged version with @platformio

* 🐛 Use v2.0.0-beta.2 as a working tagged example for @platformio (homieiot#437)

* 🎨 Simplify CI with @platformio (homieiot#438)

* 🐛 Install library via @platformio with all dependencies (homieiot#439)

* 💚 CI: Install staging version of Arduino Core for ESP8266 & @platformio (homieiot#440)

* 🐛 Pin Shutters dep version

* 🔥 Don't fail on CI docs step when testing a fork

* 🎨 More Refactoring + Deep Sleep + Prevent WiFi Reconnect when reboot (homieiot#432)

* Initial AsyncWebServer

* Fixed Proccessing Body Requests (JSON)

* Doc Fixes + typo

* Added Missing Method in Timer.cpp

* Lots of Refactoring + Moved Reset Button to its own helper class for boots to use

* Lots of Refactoring.

* Refactored ResetHandler + More Refactoring + Testing

* Added deep sleep function + Prevent Wifi reconnect before reboot (homieiot#380)[homieiot#380]

* Small typo fixes

* Small Rearange of code in BootConfig + Minor Refactor of function names

* Minior Commit to Triger a Github Action

* circleci build fix

* 🎨 First pass to fix linting

* 🎨 Second pass of lint

* 🎨 Final lint fix

* 📝 Update docs deps

* 📝 🎨 Update docs manifest

* 📝 🎨 Adjust HTTP JSON API doc

* 📝 Add configurators on website

* 📝 Update links to configurator

* Fix links under Features (homieiot#452)

* Set Device Stats Interval (homieiot#451) (homieiot#455)

* Add last step to uibundle README (homieiot#460)

* Add last step to uibundle README

* Added Arduino Support for doc

* Update updater script addressing quirks (homieiot#461)

* Update API for /wifi/connect from GET to PUT (homieiot#468)

Docs show `/wifi/connect` as `GET` when it should actually be `PUT`

* Proposal to optionally run HomieNode::loop() also in disconnected state

* Show Homie version

* Fix homieiot#446 homieiot#477 (homieiot#501)

* Fix homieiot#446 CORS Issue

* Fix for homieiot#477

* Fix Lint

* Fix Safari not displaying the config bundle HTML page (Fix homieiot#476) (homieiot#502)

* Fix Safari not displaying the config bundle HTML page

Safari cannot deal with gzip files that have a "*.gz" file extension.
Simply faking the filename solves the problem though.

* Update Readme Homie Version

* Fix Warnings (homieiot#503)

* Update Readme - Homie Convention

* Update to Homie Convention v2.0.1 (homieiot#507)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants