Last active
November 5, 2023 12:32
-
-
Save OrangeBox33/25a0d2b6cfcc68593c4ab4f98f82e67d to your computer and use it in GitHub Desktop.
KvadratNikitosa
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
Esp32 Websockets Client | |
This sketch: | |
1. Connects to a WiFi network | |
2. Connects to a Websockets server | |
3. Sends the websockets server a message ("Hello Server") | |
4. Prints all incoming messages while the connection is open | |
Hardware: | |
For this sketch you only need an ESP32 board. | |
Created 15/02/2019 | |
By Gil Maimon | |
https://github.com/gilmaimon/ArduinoWebsockets | |
*/ | |
#include <ArduinoWebsockets.h> | |
#include <WiFi.h> | |
#include "FastLED.h" | |
#define NUM_LEDS 256 | |
#define DATA_PIN 13 | |
CRGB leds[NUM_LEDS]; | |
const char* ssid = ""; //Enter SSID | |
const char* password = ""; //Enter Password | |
const char* websockets_server_host = ""; //Enter server adress | |
const uint16_t websockets_server_port = ; // Enter server port | |
using namespace websockets; | |
WebsocketsClient* client = NULL; | |
void onMessageCallback(WebsocketsMessage message) { | |
// Serial.println("mes"); | |
if (message.isEmpty()) { | |
return; | |
} | |
const uint32_t length = message.length(); | |
const char *data = message.c_str(); | |
// Serial.println(data[0]); | |
// if (data[0] == 1) { | |
for (uint32_t i = 1; i < length; i += 4) { | |
leds[data[i]] = CRGB( | |
data[i+1] - 0, | |
data[i+2] - 0, | |
data[i+3] - 0 | |
); | |
} | |
// } | |
FastLED.show(); | |
} | |
void onEventCallback(WebsocketsEvent event, String data) { | |
if(event == WebsocketsEvent::ConnectionClosed) { | |
Serial.println("connection closed EVENT"); | |
delay(2000); | |
recreateSocket(); | |
} else if(event == WebsocketsEvent::GotPing) { | |
client->pong(); | |
} else if(event == WebsocketsEvent::GotPong) { | |
client->ping(); | |
} | |
} | |
void recreateSocket() { | |
Serial.println("run recreateSocket"); | |
if (client) { | |
Serial.println("delete client"); | |
delete client; | |
} | |
client = new WebsocketsClient(); | |
client->onMessage(onMessageCallback); | |
client->onEvent(onEventCallback); | |
bool connected = client->connect(websockets_server_host, websockets_server_port, "/"); | |
Serial.println("connected status"); | |
Serial.println(connected); | |
} | |
void setup() { | |
Serial.begin(115200); | |
// Connect to wifi | |
WiFi.begin(ssid, password); | |
// Wait some time to connect to wifi | |
for(int i = 0; i < 10 && WiFi.status() != WL_CONNECTED; i++) { | |
Serial.print("."); | |
delay(1000); | |
} | |
// Check if connected to wifi | |
if(WiFi.status() != WL_CONNECTED) { | |
Serial.println("No Wifi!"); | |
return; | |
} | |
Serial.println("Connected to Wifi, Connecting to server."); | |
// try to connect to Websockets server | |
recreateSocket(); | |
delay(2000); | |
FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS); | |
} | |
void loop() { | |
Serial.println("loop"); | |
if(client && client->available()) { | |
client->poll(); | |
} else { | |
delay(1000); | |
recreateSocket(); | |
delay(1000); | |
} | |
delay(200); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Поизучал немного библиотеку, которую ты используешь. Кажется там есть возможность установить callback на событие дисконекта веб-сокет клиента от сервера: https://github.com/gilmaimon/ArduinoWebsockets/blob/master/src/tiny_websockets/client.hpp#L46
Также наверняка сервер шлёт переодические пинги клиенту. Желательно на них отвечать.
Короче надо в этом колбэке тогда по сути сделать переподключение в случае пропажи коннекшина, а в случае пинга отвечать понгом.
Сначала строку 83 передвинь на 34-ую.
Потом надо после строки 113 добавить:
А выше 37-ой: