2017-02-07 27 views
0

Мы реализуем решение для телеметрии IoT с использованием концентратора Azure IoT. Используя проект here, мы смогли реализовать успешное базовое решение на ESP8266. Однако мы хотели бы, чтобы ESP работал также как веб-сервер в локальной сети Wi-Fi, главным образом для начальной настройки.Azure ESP8266 Клиентская библиотека IoT, не работающая с веб-сервером ESP8266

Если мы добавим к вышеупомянутому проекту этой строки:

#include <ESP8266WebServer.h>  
ESP8266WebServer server(80); 

проектной компиляция, но мы продолжаем получать «дампы» на ESP и устройство перестает работать.

неустранимым 29 (StoreProhibitedCause): EPC1 = 0x4000e1b2, EPC2 = 0x00000000, Epc3 = 0x00000000, excvaddr = 0x00000004, DEPC = 0x00000000

Исключение (29): EPC1 = 0x4000e1b2 EPC2 = 0x00000000 Epc3 = 0x00000000 excvaddr = 0x00000004 = 0x00000000 DEPC

CTX: продолжение зр: 3fff4700 Мягкие WDT сброса

CTX: продолжение SP: 3fff4460 конец: 3fff4ce0 смещение: 01b0

стека >>> 3fff4610: 40001da0 00000078 00000000 00000010 3fff4620: 40001f46 0000000d 66089700 263a390c 3fff4630: 66666633 30303734 88fd4100 5da4cdaf 3fff4640: 2395829e 2c6ea747 4f2f4c52 72696e6d
3fff4650: 00000000 2e353230 306c7263 5503061d 3fff4660: 00000000 3fff4740 3fff4740 3fffa878 3fff4670: 00000000 3fff46e0 3fff46e0 3ffec9ba 3fff4680: 40002514 3fffdd3c 3fff4ce0 3fff4700 3fff4690: 00000000 00000008 00000008 00000001 3fff46a0: 00000000 3fff4700 00000000 3fff4638

¿Есть ли кто-нибудь испытал эту проблему и нашел способ это исправить?

+0

Может быть проблема TCP-порт? можете ли вы попробовать другой порт, отличный от 80 для веб-сервера? – Jackie

+0

Это была хорошая попытка, но это не сработало. Я добавил также основной свалку на вопрос. – faturita

+0

ESP8266 имеет низкие ресурсы ОЗУ, работающие как на веб-сервере, так и на концентраторе Azure IoT, поскольку исключение 29 говорит о запрете магазина Store. Ссылка: [ESP8266] (https://cdn.sparkfun.com/datasheets/Wireless/WiFi/ESP8266ModuleV1.pdf) , [ESP8266Arduino] (https://github.com/esp8266/Arduino/blob/master/ doc/exception_causes.md) и [EspExceptionDecoder] (https://github.com/me-no-dev/EspExceptionDecoder/releases/tag/1.0.6) – JamesLiu

ответ

2

У меня была почти идентичная настройка (с помощью ESP8266 для размещения Wi-Fi-сервера, а также периодически отправки сообщений через концентратор Azure IoT), и для решения этой проблемы для меня было очень осторожное управление памятью. Ваша трассировка стека даже соответствует моим (epc1 и excvaddr идентичны).

Я свести к минимуму звонки в malloc/free, чтобы попытаться сохранить кучу от фрагментации, и это решило ее для моих целей. Я думаю, что это просто большая нагрузка для памяти чипов.

1

Думаю this и this вопросы стоит посмотреть. Оба автора используют ESP8266WebServer с WiFiClientSecure и испытывают ту же проблему. @ Jeroen88 указал на возможное решение here.

Позвольте мне процитировать:

памяти утечка (около 24 байт, в зависимости от размера Hostname) каждый время я использую ESP8266HTTPClient получить данные с защищенного сайта.

Свернутая проблема с SSLContext :: connect (ClientContext * ctx, const char * hostName, uint32_t timeout_ms). В этой функции память - , выделенная с использованием функции ssl_ext_set_host_name (ext, hostName); эта память, однако, на мой взгляд, никогда не освобождалась.

Добавлено непосредственно перед завершением функции подключения: ssl_ext_set_host_name (ext, nullptr); Теперь больше нет утечки памяти.

Полная функция:

void connect(ClientContext* ctx, const char* hostName, uint32_t timeout_ms) 
{ 
    SSL_EXTENSIONS* ext = ssl_ext_new(); 
    ssl_ext_set_host_name(ext, hostName); 
    ssl_ext_set_max_fragment_size(ext, 4096); 
    if (_ssl) { 
     /* Creating a new TLS session on top of a new TCP connection. 
      ssl_free will want to send a close notify alert, but the old TCP connection 
      is already gone at this point, so reset s_io_ctx. */ 
     s_io_ctx = nullptr; 
     ssl_free(_ssl); 
     _available = 0; 
     _read_ptr = nullptr; 
    } 
    s_io_ctx = ctx; 
    _ssl = ssl_client_new(_ssl_ctx, 0, nullptr, 0, ext); 
    uint32_t t = millis(); 

    while (millis() - t < timeout_ms && ssl_handshake_status(_ssl) != SSL_OK) { 
     uint8_t* data; 
     int rc = ssl_read(_ssl, &data); 
     if (rc < SSL_OK) { 
      break; 
     } 
    } 
    ssl_ext_set_host_name(ext, nullptr); // THIS FUNCTION FREEs the host_name 
}