Отключение веб-сокета Arduino ESP8266 через случайное времяC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Отключение веб-сокета Arduino ESP8266 через случайное время

Сообщение Anonymous »

Недавно я занялся созданием веб-сервера с использованием Arduino.
С платой NODEMCU V1.0 приведенный ниже код работает нормально после загрузки/подключения к серверу.
Кажется, что все функции (кнопки) на веб-странице работают нормально, как я и предполагал.
Однако, когда я оставляю веб-страницу на случайное время
без нажатия кнопок или ввода текста, сервер автоматически отключен.
(Время или число отображения больше не менялись.)
Последовательная печать Arduino одновременно показывает «Клиент WebSocket отключен».
Поскольку я использую функцию arduino millis() для отображения времени, когда я перезагружаю веб-страницу после ее отключения, время обычно обновляется до ожидаемого значения независимо от подключения/отключения.
/>Кстати Я серьезно новичок в этом. Так что любое решение мне очень поможет. Спасибо

Код: Выделить всё

#include 
#include 

const char* ssid = "SSID";
const char* password = "PASSWORD";

AsyncWebServer server(80);
AsyncWebSocket ws("/ws"); // WebSocket path

// read value of A0
int analogValue1;

// Reset displaying time
unsigned long millisOffset = 0;

// WiFi connection
void WifiConnect() {

Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());

}

// WebSocket Event process
void onWebSocketEvent(AsyncWebSocket *server,
AsyncWebSocketClient *client,
AwsEventType type,
void *arg,
uint8_t *data,
size_t len) {

//
if (type == WS_EVT_CONNECT) {
Serial.println("WebSocket Client Connected");

//
} else if (type == WS_EVT_DISCONNECT) {
Serial.println("WebSocket Client Disconnected");

// Received data
} else if (type == WS_EVT_DATA) {

String receivedData = "";
for (size_t i = 0; i < len; i++) {
receivedData += (char)data[i];
}

// LED Control
if (receivedData == "LED_ON") {
digitalWrite(D0, HIGH);
Serial.println("LED turned ON");

} else if (receivedData == "LED_OFF") {
digitalWrite(D0, LOW);
Serial.println("LED turned OFF");

// Reset display time
} else if (receivedData == "reset") {
millisOffset = millis();
}
}
}

// Arduino setup
void setup() {
Serial.begin(115200);
delay(10);

pinMode(D0, OUTPUT);
digitalWrite(D0, LOW);

WifiConnect();

// WebSocket event handler
ws.onEvent(onWebSocketEvent);
server.addHandler(&ws);

// HTML page
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request) {
request->send_P(200, "text/html", R"rawliteral(




Real-Time A0 Logger with LED Control


body { font-family: Arial, sans-serif; }
#log { max-height: 400px; overflow-y: scroll; border: 1px solid #ccc; padding: 10px; margin-bottom: 10px; }
button { margin: 5px; }
#event-status { color: red; font-weight: bold; margin-top: 10px; }



let socket = new WebSocket("ws://" + window.location.host + "/ws");
let logging = false;
let logContainer;
let logs = []; // All log
let displayLogs = []; // Newest log
let logIndex = 1; // log number
let maxEntries = 100; // limit of log for save (initial = 100)

window.onload = function() {
logContainer = document.getElementById('log');
const maxEntriesInput = document.getElementById('max-entries');
const eventStatus = document.getElementById('event-status');

// WebSocket message
socket.onmessage = function(event) {
const [millis, value] = event.data.split(',');
if (logging) {
if (logs.length <  maxEntries) {
const logEntry = formatLogEntry(logIndex, millis, value);

logs.push(logEntry);

} else {
eventStatus.innerText = "Event collected";
}

logIndex++;

const displayLogEntry = formatLogEntry(logIndex, millis, value);
displayLogs.push(displayLogEntry);
if (displayLogs.length > 100) {
displayLogs.shift();
}

updateDisplayLogs();
}
document.getElementById('current-value').innerText = `Value: ${value}, Time: ${millis} ms`;
};

// 버튼 동작
document.getElementById('start').onclick = () => {
logging = true;
eventStatus.innerText = "";
};
document.getElementById('stop').onclick = () => { logging = false; };
document.getElementById('reset').onclick = () => {
logs = [];
displayLogs = [];
logContainer.innerHTML = '';
logIndex = 1;
eventStatus.innerText = "";
socket.send("reset");
};
document.getElementById('download').onclick = () => {
downloadLogs();
};
document.getElementById('led-on').onclick = () => {
socket.send("LED_ON");
};
document.getElementById('led-off').onclick = () => {
socket.send("LED_OFF");
};
document.getElementById('set-size').onclick = () => {
const newSize = parseInt(maxEntriesInput.value, 10);
if (!isNaN(newSize) && newSize > 0) {
maxEntries = newSize;
eventStatus.innerText = `Max entries updated to ${maxEntries}`;
} else {
alert("Please enter a valid positive number.");
}
};
};

function updateDisplayLogs() {
logContainer.innerHTML = '';
displayLogs.forEach((log) =>  {
const logElement = document.createElement('div');
logElement.textContent = log;
logContainer.appendChild(logElement);
});
logContainer.scrollTop = logContainer.scrollHeight;
}

function formatLogEntry(index, millis, value) {
return `#${index.toString().padStart(5, '0')} ${millis} ms ${value.toString().padStart(4, '0')}`;
}

function downloadLogs() {
const blob = new Blob([logs.join('\n')], { type: 'text/plain' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = 'logs.txt';
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
URL.revokeObjectURL(url);
}





Real-Time A0 Logger with LED Control
Current A0 Value: Waiting...
Start Display
Stop Display
Reset Log
Download Log
LED ON
LED OFF

Max Entries:

Set Size





)rawliteral");
});

server.on("/favicon.ico", HTTP_GET, [](AsyncWebServerRequest *request) {
request->send(204);
});

server.begin();
}

void loop() {

analogValue1 = analogRead(A0);
String message = String(millis() - millisOffset) + "," + String(analogValue1);
ws.textAll(message);
delay(10);
}

Я хочу решить проблему отключения клиента независимо от мощности Wi-Fi.

Подробнее здесь: https://stackoverflow.com/questions/793 ... ndom-times
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Отключение веб-сокета Arduino ESP8622 через случайное время
    Anonymous » » в форуме Html
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • Отключение веб-сокета Arduino ESP8622 через случайное время
    Anonymous » » в форуме C++
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous
  • Отправка и получение данных с помощью приложения Android, Arduino и модуля Wi-Fi esp8266
    Anonymous » » в форуме Android
    0 Ответы
    21 Просмотры
    Последнее сообщение Anonymous
  • Arduino-esp8266 использовать с C# вместо приложения RemoteXY [закрыто]
    Anonymous » » в форуме C#
    0 Ответы
    19 Просмотры
    Последнее сообщение Anonymous
  • Отправка и получение данных с помощью приложения Android, Arduino и модуля Wi-Fi esp8266
    Anonymous » » в форуме Android
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»