Скрыть объявление
На нашем форуме недоступен просмотр изображений для неавторизованных пользователей. Если Вы уже зарегистрированы на нашем форуме, то можете войти. Если у Вас еще нет аккаунта, мы будем рады, если Вы к нам присоединитесь. Зарегистрироваться Вы можете здесь.

Нужна помощь Неправильный статус после автоматического переподключения к Wi-Fi точке доступа

Тема в разделе "Общие вопросы по esp8266", создана пользователем RAlexeev, 27 июн 2018.

Метки:
  1. RAlexeev

    RAlexeev Новичок

    Сообщения:
    3
    Симпатии:
    0
    ESP8266 возвращает неправильный статус после автоматического переподключения к Wi-Fi точке доступа в WIFI_STA и WIFI_AP_STA режимах. Как я ожидаю, функци WiFi.isConnected() должна вернуть true, а WiFi.status() код WL_CONNECTED после автоматического переподключения к точке доступа, однако по каким-то причинам эти функции возвращают false и WL_DISCONNECTED соответственно. Хотя в действительности ESP8266 успешно переподключается к Wi-Fi точке доступа, но возвращает неправильный статус. Может быть кто-нибудь может подсказать, что я делаю неправильно, из-за чего получаю не те статусы?

    Мой скетч, который компилировался в Arduino IDE v. 1.8.5:

    Код (C):
    1. #include <ESP8266WiFi.h>
    2. #include <ArduinoJson.h>
    3.  
    4.  
    5. const char* ssid = "MYWIFISSID";
    6. const char* password = "MYWIFIPSK";
    7.  
    8.  
    9. void setup()
    10. {
    11.   Serial.begin(115200);
    12.   delay(1000);
    13.  
    14.   WiFi.mode(WIFI_AP_STA);
    15.   WiFi.softAP("my_esp");
    16.   delay(1000);
    17.  
    18.   WiFi.begin(ssid, password);
    19.   while (WiFi.status() != WL_CONNECTED) {
    20.     delay(500);
    21.     Serial.print(".");
    22.   }
    23. }
    24.  
    25.  
    26. void loop()
    27. {
    28.   delay(5000);
    29.  
    30.   DynamicJsonDocument doc;
    31.   JsonObject& obj = doc.to<JsonObject>();
    32.  
    33.   obj["chip_id"] = String(ESP.getChipId(), HEX);
    34.  
    35.   JsonObject& wifi = obj.createNestedObject("wifi");
    36.   switch (WiFi.getMode()) {
    37.     case WIFI_OFF:
    38.       wifi["mode"] = "WIFI_OFF";
    39.       break;
    40.     case WIFI_STA:
    41.       wifi["mode"] = "WIFI_STA";
    42.       break;
    43.     case WIFI_AP:
    44.       wifi["mode"] = "SWIFI_AP";
    45.       break;
    46.     case WIFI_AP_STA:
    47.       wifi["mode"] = "WIFI_AP_STA";
    48.       break;
    49.     default:
    50.       wifi["mode"] = "UNKNOWN";
    51.   }
    52.  
    53.   JsonObject& ap = wifi.createNestedObject("ap");
    54.   ap["ssid"] = WiFi.softAPSSID();
    55.   ap["psk"] = WiFi.softAPPSK();
    56.   ap["ip"] = WiFi.softAPIP().toString();
    57.   ap["mac"] = WiFi.softAPmacAddress();
    58.   ap["station_num"] = (uint8_t) WiFi.softAPgetStationNum();
    59.  
    60.   JsonObject& station = wifi.createNestedObject("station");
    61.   station["ssid"] = WiFi.SSID();
    62.   station["psk"] = WiFi.psk();
    63.   station["ip"] = WiFi.localIP().toString();
    64.   station["hostname"] = WiFi.hostname();
    65.   station["mac"] = WiFi.macAddress();
    66.   station["subnet"] = WiFi.subnetMask().toString();
    67.   station["gateway"] = WiFi.gatewayIP().toString();
    68.  
    69.   JsonObject& dns = station.createNestedObject("dns");
    70.   dns["0"] = WiFi.dnsIP(0).toString();
    71.   dns["1"] = WiFi.dnsIP(1).toString();
    72.  
    73.   JsonObject& states = obj.createNestedObject("state");
    74.   states["AutoConnect"] = WiFi.getAutoConnect();
    75.   states["AutoReconnect"] = WiFi.getAutoReconnect();
    76.   states["Persistent"] = WiFi.getPersistent();
    77.   states["isConnected"] = WiFi.isConnected();
    78.  
    79.   switch (WiFi.status()) {
    80.     case WL_CONNECTED:
    81.       states["status"] = "WL_CONNECTED";
    82.       break;
    83.     case WL_NO_SHIELD:
    84.       states["status"] = "WL_NO_SHIELD";
    85.       break;
    86.     case WL_IDLE_STATUS:
    87.       states["status"] = "WL_IDLE_STATUS";
    88.       break;
    89.     case WL_NO_SSID_AVAIL:
    90.       states["status"] = "WL_NO_SSID_AVAIL";
    91.       break;
    92.     case WL_SCAN_COMPLETED:
    93.       states["status"] = "WL_SCAN_COMPLETED";
    94.       break;
    95.     case WL_CONNECT_FAILED:
    96.       states["status"] = "WL_CONNECT_FAILED";
    97.       break;
    98.     case WL_CONNECTION_LOST:
    99.       states["status"] = "WL_CONNECTION_LOST";
    100.       break;
    101.     case WL_DISCONNECTED:
    102.       states["status"] = "  ";
    103.       break;
    104.   }
    105.  
    106.   Serial.println("========================================");
    107.   serializeJsonPretty(obj, Serial);
    108.   Serial.println("========================================");
    109. }
    110.  
    Вывод монитора последовательного порта можно найти в прикреплённом файле serial_monitor_output.txt.

    Заранее благодарю за любую помощь.
     

    Вложения:

    Последнее редактирование: 27 июн 2018
  2. Алексей.

    Алексей. Авторитетный участник сообщества

    Сообщения:
    543
    Симпатии:
    63
    RAlexeev, По каким признакам вы определяете что выполнено автоматическое переподключение к точке доступа?
    По логам у вас только в начале событие EVENT_STAMODE_GOT_IP срабатывает

    connected with MYWIFISSID, channel 8
    dhcp client start...
    wifi evt: 0
    ip:192.168.1.37,mask:255.255.255.0,gw:192.168.1.1
    wifi evt: 3
    .wifi evt: 7

    И статус должен возвращать WL_CONNECTED только после этого события.
    Код (C):
    1.  
    2. wl_status_t ESP8266WiFiSTAClass::status() {
    3.     station_status_t status = wifi_station_get_connect_status();
    4.     switch(status) {
    5.         case STATION_GOT_IP:
    6.             return WL_CONNECTED;
    7.         case STATION_NO_AP_FOUND:
    8.             return WL_NO_SSID_AVAIL;
    9.         case STATION_CONNECT_FAIL:
    10.         case STATION_WRONG_PASSWORD:
    11.             return WL_CONNECT_FAILED;
    12.         case STATION_IDLE:
    13.             return WL_IDLE_STATUS;
    14.         default:
    15.             return WL_DISCONNECTED;
    16.     }
    17. }
    18.  
    И совсем не понятно для чего запрашивать и статус и isConnected
    Код (C):
    1.  
    2. bool ESP8266WiFiSTAClass::isConnected() {
    3.     return (status() == WL_CONNECTED);
    4. }
    5.  
     
    Последнее редактирование: 27 июн 2018
  3. RAlexeev

    RAlexeev Новичок

    Сообщения:
    3
    Симпатии:
    0
    Алексей., спасибо Вам за ответ! По логам второе подключение происходит на строчке "connected with MYWIFISSID, channel 6". Факт подключения я определил, посмотрев клиентов Wi-Fi роутера и пропинговав esp8266. Видимо, это был баг, который как раз исправили. Если скачать мастер ветку библиотеки esp8266/Arduino, то подобной ошибки нет. Об этом я узнал как раз отсюда WIFI.isconnected stil false after router reboot but ping requests reponse etc works · Issue #4210 · esp8266/Arduino. Завтра посмотрю, есть ли там в логах "wifi evt: 3" во время второго подключения. Но скорей всего да, раз проблемы больше нет.
     
  4. Алексей.

    Алексей. Авторитетный участник сообщества

    Сообщения:
    543
    Симпатии:
    63
    Это говорит о том что выполнено подключение и только, об этом и говорит событие wifi evt: 0 (EVENT_STAMODE_CONNECTED) через одну строчку лога, ip адрес в аренду еще не выдан (или выдан но почему то dhcp клиент об этом забыл сказать), событие EVENT_STAMODE_GOT_IP так и не наступило, поэтому и статус по прежнему WL_DISCONNECTED.
    Порой есп ведет себя не предсказуемо, иногда у меня оставались не закрытые сокеты, fin с удаленной стороны отправляется, а на есп теряется, приходится отслеживать таймауты и прибивать вялые сокеты.
     
  5. RAlexeev

    RAlexeev Новичок

    Сообщения:
    3
    Симпатии:
    0
    Алексей., с последней версией библиотеки, действительно, происходит событие "wifi evt: 3" в логах во время подключения. Но теперь я наткнулся на другую ошибку при работе с устройством:
    Fatal exception 0(IllegalInstructionCause). Ошибка возникает в режиме отладки и только с одним роутером Zyxel Keenetic LTE, когда сеть закрытая. Можно отключить режим отладки и ошибки не будет, а также можно оставить режим отладки и убрать одну из функций WiFi.persistent(false);, wifiDisconnect(true); или MDNS.begin("my_esp_hostname");, тогда тоже ошибки не будет. Очень напрягает такой хрупкий код, который может сломаться не пойми от чего.

    Код (C):
    1. #include <ESP8266WiFi.h>
    2. #include <ESP8266mDNS.h>
    3.  
    4.  
    5. void wifiDisconnect(bool wifioff) {
    6.   switch (WiFi.getMode()) {
    7.     case WIFI_STA:
    8.       delay(100);
    9.       WiFi.disconnect(wifioff);
    10.       delay(100);
    11.       break;
    12.     case WIFI_AP:
    13.       delay(100);
    14.       WiFi.softAPdisconnect(wifioff);
    15.       delay(100);
    16.       break;
    17.     case WIFI_AP_STA:
    18.       delay(100);
    19.       WiFi.disconnect(wifioff);
    20.       delay(100);
    21.       WiFi.softAPdisconnect(wifioff);
    22.       delay(100);
    23.       break;
    24.   }
    25. }
    26.  
    27.  
    28. void setup(){
    29.   Serial.begin(115200);
    30.   delay(1000);
    31.  
    32.   WiFi.persistent(false);
    33.  
    34.   wifiDisconnect(true);
    35.  
    36.   WiFi.mode(WIFI_STA);
    37.   WiFi.hostname("my_esp_hostname");
    38.   WiFi.begin("MYWIFISSID", "MYWIFIPSK");
    39.   for (uint8_t tries = 0; tries < 30; tries++) {
    40.     if (WiFi.isConnected()) {
    41.       break;
    42.     }
    43.     else {
    44.       delay(500);
    45.     }
    46.   }
    47.  
    48.   MDNS.begin("my_esp_hostname");
    49. }
    50.  
    51.  
    52. void loop() { }
    Вывод последновательного порта:
    Код (Text):
    1. SDK:2.2.1(cfd48f3)/Core:2.4.1-102-g74819a76/lwIP:2.0.3(STABLE-2_0_3_RELEASE/glue:arduino-2.4.1-13-g163bb82)/BearSSL:94e9704
    2. bcn 0
    3. del if1
    4. usl
    5. add if1
    6. dhcp server start:(ip:192.168.4.1,mask:255.255.255.0,gw:192.168.4.1)
    7. bcn 100
    8. bcn 0
    9. del if1
    10. usl
    11. mode : null
    12. wifi evt: 8
    13. mode : sta(dc:4f:22:18:14:58)
    14. add if0
    15. wifi evt: 8
    16. wifi evt: 2
    17. scandone
    18. state: 0 -> 2 (b0)
    19. state: 2 -> 3 (0)
    20. state: 3 -> 5 (10)
    21. add 0
    22. aid 2
    23. cnt
    24.  
    25. connected with MYWIFISSID, channel 6
    26. dhcp client start...
    27. wifi evt: 0
    28. ip:192.168.1.33,mask:255.255.255.0,gw:192.168.1.1
    29. wifi evt: 3
    30. Fatal exception 0(IllegalInstructionCause):
    31. epc1=0xa8c05814, epc2=0x00000000, epc3=0x00000000, excvaddr=0x00000000, depc=0x00000000
    32.  
    33. Exception (0):
    34. epc1=0xa8c05814 epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000000 depc=0x00000000
    35.  
    36. ctx: cont
    37. sp: 3ffffbb0 end: 3fffffd0 offset: 01a0
    38.  
    39. >>>stack>>>
    40. 3ffffd50:  00000000 00000000 00000020 4010122e
    41. 3ffffd60:  3ffe9410 4022436b 3ffef514 3fff03f4
    42. 3ffffd70:  00000000 4021822f 3ffed7ec 401009e4
    43. 3ffffd80:  3ffe8ffc 3ffffe60 3ffffe60 3ffef87d
    44. 3ffffd90:  3ffef5b0 3fff0144 0000000a 3ffedf3c
    45. 3ffffda0:  3ffe8ffc 3ffe8ffc 3ffefa67 4021a057
    46. 3ffffdb0:  3ffefcda 0000002e 0000001f 40104f09
    47. 3ffffdc0:  4000050c 0006688e 3ffee020 3ffef2f5
    48. 3ffffdd0:  3ffef2c0 3ffef2c0 3ffefc94 4020bed2
    49. 3ffffde0:  4020c26b 3ffefc94 3ffefcda 4020c274
    50. 3ffffdf0:  00000008 3ffffe20 00000000 000000a5
    51. 3ffffe00:  000000a5 3ffefb28 00000001 3ffefce8
    52. 3ffffe10:  3ffefc94 3ffefab0 3ffef2c0 40211ded
    53. 3ffffe20:  005e0001 4010fb00 00000012 4022d8ae
    54. 3ffffe30:  00000018 3ffefab0 3ffefc94 40212874
    55. 3ffffe40:  00000080 401022f4 3ffeed68 00000000
    56. 3ffffe50:  3ffef2c4 00000001 00000000 00000002
    57. 3ffffe60:  3ffef220 00000004 3ffefaac 40212ee4
    58. 3ffffe70:  00000001 00000001 402391a0 3ffefaac
    59. 3ffffe80:  00000000 3ffefc94 3ffefd00 402128b4
    60. 3ffffe90:  3ffef2c0 3ffffec0 00000004 3ffefaac
    61. 3ffffea0:  00000016 3ffef2c0 3ffefaac 40212045
    62. 3ffffeb0:  3ffef2c0 3ffffec0 00000004 4020c2c8
    63. 3ffffec0:  00000494 00000000 3ffef454 4020c304
    64. 3ffffed0:  3ffefab0 3ffef2c0 3ffeed68 40212116
    65. 3ffffee0:  3ffef50c 402052f8 0000001c 00000020
    66. 3ffffef0:  3fffff5c 3ffef2c0 3ffefaac 402122ef
    67. 3fffff00:  3fffff5c 3ffe9138 3ffef2c0 4021237b
    68. 3fffff10:  4957594d 00000001 3fffff90 00000001
    69. 3fffff20:  3ffeecd4 3ffeeca8 3ffeecd4 4020359a
    70. 3fffff30:  00000000 3ffeeca8 3ffefaa4 401009e4
    71. 3fffff40:  3ffeed68 000000e4 3fffff80 40205350
    72. 3fffff50:  00000000 402052f8 3ffeed00 fb0000e0
    73. 3fffff60:  00000000 3ffeeca8 3ffeecd4 3ffeee54
    74. 3fffff70:  00000000 3ffeeca8 3ffeecd4 40204892
    75. 3fffff80:  3ffefaac 40202f28 40203250 402036bc
    76. 3fffff90:  00000000 00000000 000001f4 402030e4
    77. 3fffffa0:  3ffe8950 00000017 3ffeeca8 40202771
    78. 3fffffb0:  3fffdad0 00000000 3ffeee4c 402054a0
    79. 3fffffc0:  feefeffe feefeffe 3ffe85dc 40100a45
    80. <<<stack<<<
    81.  
    82. ets Jan  8 2013,rst cause:1, boot mode:(3,0)
    83.  
    84. load 0x4010f000, len 1384, room 16
    85. tail 8
    86. chksum 0x2d
    87. csum 0x2d
    88. v74819a76
    89. ~ld
    Расшифровка исключения:
    Код (Text):
    1. Exception 0: Illegal instruction
    2. PC: 0xa8c05814
    3. EXCVADDR: 0x00000000
    4.  
    5. Decoding stack results
    6. 0x401009e4: free at /opt/arduino-1.8.5/hardware/esp8266com/esp8266/cores/esp8266/umm_malloc/umm_malloc.c line 1755
    7. 0x4020bed2: new_linkoutput at glue-lwip/lwip-git.c line 259
    8. 0x4020c26b: ethernet_output at netif/ethernet.c line 305
    9. 0x4020c274: ethernet_output at netif/ethernet.c line 305
    10. 0x40211ded: etharp_output_LWIP2 at core/ipv4/etharp.c line 893
    11. 0x40212874: ip4_output_if_opt_src at core/ipv4/ip4.c line 962
    12. 0x40212ee4: mem_malloc at core/mem.c line 136
    13. 0x402128b4: ip4_output_if_opt at core/ipv4/ip4.c line 788
    14. 0x40212045: igmp_send at core/ipv4/igmp.c line 793
    15. 0x4020c2c8: do_memp_malloc_pool at core/memp.c line 301
    16. 0x4020c304: memp_malloc at core/memp.c line 404
    17. 0x40212116: igmp_lookup_group at core/ipv4/igmp.c line 258
    18. 0x402052f8: operator new(unsigned int) at /opt/arduino-1.8.5/hardware/esp8266com/esp8266/cores/esp8266/abi.cpp line 34
    19. 0x402122ef: igmp_joingroup_netif at core/ipv4/igmp.c line 694
    20. 0x4021237b: igmp_joingroup at core/ipv4/igmp.c line 464
    21. 0x4020359a: MDNSResponder::_listen() at /opt/arduino-1.8.5/hardware/esp8266com/esp8266/libraries/ESP8266mDNS/ESP8266mDNS.cpp line 198
    22. 0x401009e4: free at /opt/arduino-1.8.5/hardware/esp8266com/esp8266/cores/esp8266/umm_malloc/umm_malloc.c line 1755
    23. 0x40205350: operator delete(void*) at /opt/arduino-1.8.5/hardware/esp8266com/esp8266/cores/esp8266/abi.cpp line 54
    24. 0x402052f8: operator new(unsigned int) at /opt/arduino-1.8.5/hardware/esp8266com/esp8266/cores/esp8266/abi.cpp line 34
    25. 0x40204892: MDNSResponder::begin(char const*) at /opt/arduino-1.8.5/hardware/esp8266com/esp8266/libraries/ESP8266mDNS/ESP8266mDNS.cpp line 174
    26. 0x40202f28: ESP8266WiFiSTAClass::status() at /opt/arduino-1.8.5/hardware/esp8266com/esp8266/libraries/ESP8266WiFi/src/ESP8266WiFiSTA.cpp line 498
    27. 0x40203250: std::_Function_base::_Base_manager ::_M_manager(std::_Any_data &, const std::_Any_data &, std::_Manager_operation) at /opt/arduino-1.8.5/hardware/esp8266com/esp8266/tools/xtensa-lx106-elf/xtensa-lx106-elf/include/c++/4.8.2/functional line 1931
    28. 0x402036bc: std::_Function_handler ::_M_invoke(const std::_Any_data &, const WiFiEventStationModeDisconnected &) at /opt/arduino-1.8.5/hardware/esp8266com/esp8266/libraries/ESP8266mDNS/ESP8266mDNS.cpp line 171
    29. 0x402030e4: ESP8266WiFiSTAClass::isConnected() at /opt/arduino-1.8.5/hardware/esp8266com/esp8266/libraries/ESP8266WiFi/src/ESP8266WiFiSTA.cpp line 324
    30. 0x40202771: setup() at /home/roman/Arduino/sketch_mdns_fatal_exception/sketch_mdns_fatal_exception.ino line 48
    31. 0x402054a0: loop_wrapper() at /opt/arduino-1.8.5/hardware/esp8266com/esp8266/cores/esp8266/core_esp8266_main.cpp line 122
    32.  
     
  6. Алексей.

    Алексей. Авторитетный участник сообщества

    Сообщения:
    543
    Симпатии:
    63
    Память свободную не пытались контролировать?
    Может из за включенного режима отладки не осталось памяти совсем.
    WiFi.persistent - вообще ничего не делает, просто устанавливает статическую переменную и только, никаких дополнительных вызовов не делает и не должен крашить ни разу.
    По логу крашится на выходе из umm_free, такое впечатление что стек пробили попали в небытие поэтому и сработало исключение Illegal instruction
     

Поделиться этой страницей