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