웹소켓 개선

This commit is contained in:
2026-03-11 21:36:35 +00:00
parent 5800a8d5dc
commit 70e3ca0ecb

View File

@@ -394,6 +394,7 @@ volatile bool loggingEnabled = false;
volatile bool serialLoggingEnabled = false;
volatile bool serial2LoggingEnabled = false;
volatile bool sdCardReady = false;
uint32_t lastBroadcast = 0; // webUpdateTask broadcast 주기 제어
// Auto Trigger
#define MAX_TRIGGERS 8
@@ -1610,6 +1611,8 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t *payload, size_t length)
}
String json; serializeJson(allData, json);
webSocket.sendTXT(num, json);
// ★ 연결 즉시 update 브로드캐스트 트리거 (다음 루프에서 500ms 기다리지 않고 즉시 전송)
lastBroadcast = 0;
}
else if (type == WStype_TEXT) {
DynamicJsonDocument doc(44384);
@@ -2126,24 +2129,33 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t *payload, size_t length)
void webUpdateTask(void *parameter) {
vTaskDelay(pdMS_TO_TICKS(500));
// ★ 핵심 개선: server.handleClient() + webSocket.loop()를
// 10ms 루프로 빠르게 폴링 → WebSocket 핸드셰이크 지연 대폭 감소
// (기존 500ms 루프 → 최악 500ms 대기, 개선 후 최악 10ms 대기)
// broadcastTXT(500ms 주기)와 분리해서 연결 수립만 먼저 빠르게 처리
while (1) {
// ★ server.handleClient()를 Core 0에서 호출
// loop()(Core 1, Pri 1)는 canRxTask(Core 1, Pri 24)에 선점당해 실행 불가
// ── 10ms마다: HTTP + WebSocket 핸드셰이크/수신 처리 ──────
server.handleClient();
webSocket.loop();
// ★ msgPerSecond를 Core 0에서 직접 계산
// (sdMonitorTask가 Core 1에서 canRxTask(Pri24)에 스타베이션될 수 있으므로)
{
uint32_t now = millis();
if (now - lastMsgCountTime >= 1000) {
uint32_t cur = totalMsgCount; // volatile 읽기
uint32_t cur = totalMsgCount;
msgPerSecond = cur - lastMsgCount;
lastMsgCount = cur;
lastMsgCountTime = now;
}
}
// ── 500ms마다: JSON 직렬화 + broadcastTXT (무거운 작업) ─
if (millis() - lastBroadcast < 500) {
vTaskDelay(pdMS_TO_TICKS(10)); // 10ms 대기 후 루프 재진입
continue;
}
lastBroadcast = millis();
if (webSocket.connectedClients() > 0) {
DynamicJsonDocument doc(16384);
doc["type"] = "update";
@@ -2320,7 +2332,7 @@ void webUpdateTask(void *parameter) {
if (jsonSize > 0 && jsonSize < 8192) webSocket.broadcastTXT(json);
}
vTaskDelay(pdMS_TO_TICKS(500));
// broadcastTXT 완료 후 즉시 루프 재진입 (10ms 대기는 위 continue에서)
}
}