웹소켓 개선
This commit is contained in:
@@ -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에서)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user