• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

ESP8266 и несколько клиентов

enjoynering

Well-known member
Ну и хорошо. В парсере можно попробовать сделать StaticJsonDocument вместо динамического, чтобы память выделялась на стеке а не в куче, это ускорит работу парсера.
только надо осторожно, тк свободного стека у ESP8266 всего 4КБ. сам автор ArduinoJson рекомендует StaticJsonDocument для данных below 1KB
 

EvgeniyS

Member
только надо осторожно, тк свободного стека у ESP8266 всего 4КБ. сам автор ArduinoJson рекомендует StaticJsonDocument для данных below 1KB
До 1 КВ - это общая рекомендация автора, не привязанная к конкретному коду, все зависит от потребления стека в вашей программе. Чтобы уменьшить расход памяти на стеке, следует избегать большой вложенности функций, не заводить лишних локальных переменных, по-возможности передавать параметры в функциях по указателю (ссылке) если это структуры, объекты.
 

vavanvanvanovich

New member
Добрый день, можете подсказать, websocket во время переподключения кнопка клиента не реагирует, только когда Serial пишет что connected кнопка работает. Есть какое-то правили или как можно сделать чтоб ответ был сразу и всегда?
 

vavanvanvanovich

New member
Добрый день, можете подсказать, websocket во время переподключения кнопка клиента не реагирует, только когда Serial пишет что connected кнопка работает. Есть какое-то правили или как можно сделать чтоб ответ был сразу и всегда?
 

EvgeniyS

Member
Добрый день, можете подсказать, websocket во время переподключения кнопка клиента не реагирует, только когда Serial пишет что connected кнопка работает. Есть какое-то правили или как можно сделать чтоб ответ был сразу и всегда?
Честно говоря, не понял суть вопроса.
 

vavanvanvanovich

New member
собрал websocketclient на Андроид и собрал websocketservice на esp8266, и цикл происходит в таком порядке: клиент подключен, читает информацию, клиент disconnect, и именно в тот момент когда пишет что клиент disconnect
, ни одна кнопка не работает, вот и не могу понять как это исправить, косяк в сборке на андроиде или на ESP?
 

EvgeniyS

Member
Если клиент disconnect, значит он отключился, логично, что при отключении он не будет работать.
 

vavanvanvanovich

New member
просто я собирал код из примеров, и мне казалось что так и должно быть, что такой цикл работы. Значит надо как отменить перезагрузку???
void onEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventType type,
void *arg, uint8_t *data, size_t len) {
switch (type) {
case WS_EVT_CONNECT:
Serial.printf("WebSocket client #%u connected from %s\n", client->id(), client->remoteIP().toString().c_str());
break;
case WS_EVT_DISCONNECT:
Serial.printf("WebSocket client #%u disconnected\n", client->id());
break;
case WS_EVT_DATA:
handleWebSocketMessage(arg, data, len);
break;
case WS_EVT_PONG:
case WS_EVT_ERROR:
break;
}
}
Это надо в андроиде поменять чтоб всегда был подключен или это в ESP8266 как-то переделать код, я понимаю что могу быть далеко от истины,но хотябы понять в каком направлении искать?
 

EvgeniyS

Member
onEvent - это слушатель сообщений от клиентов. Когда клиент подключается, открывается постояно работающее соединение между клиентом и сервером. Соединение работает до тех пор, пока соединение не закроется по чьей-то инициативе, (например клиент закроет вкладку браузера). Я не видел полностью ваш код, мне трудно судить в чем у вас проблема. В вашем посте выше обычный слушатель входящих сообщений, сам по себе он не разорвет соединение.
 

vavanvanvanovich

New member
мне кажется я понял, надо настроить ping pong, соединение клиент разрывает
public void onTextReceived(String s) {
Log.i(TAG, "Сообщение полученно ");
final String message = s;
runOnUiThread(new Runnable() {
@Override
public void run() {
try {
TextView textView = findViewById(R.id.text_message);
textView.setText(message);
}catch (Exception e){
e.printStackTrace();
}
}
});
}
@Override
public void onBinaryReceived(byte[] data) {
}
@Override
public void onPingReceived(byte[] data) {
}
@Override
public void onPongReceived(byte[] data) {
}
@Override
public void onException(Exception e) {
System.out.println(e.getMessage());
}
@Override
public void onCloseReceived() {
Log.i(TAG, "Соединение закрыто ");
System.out.println("Соединение закрыто ");
}
};
ws.setConnectTimeout(1000);
ws.setReadTimeout(6000);
ws.enableAutomaticReconnection(5000);
ws.connect();
}
 

vavanvanvanovich

New member
это моё андроид приложение, вы подскажите если я на правильном мышлении, соединение постоянным делать нельзя, но запросы обрабатываются через Ping Pong?
 

vavanvanvanovich

New member
наверно всё же я чайник))) Если я просто поменяю ws.enableAutomaticReconnection(5000); на более короткий интервал это не приведёт к проблеме?
 
Сверху Снизу