Skip to content

Instantly share code, notes, and snippets.

@OrangeBox33
Last active November 5, 2023 12:32
Show Gist options
  • Save OrangeBox33/25a0d2b6cfcc68593c4ab4f98f82e67d to your computer and use it in GitHub Desktop.
Save OrangeBox33/25a0d2b6cfcc68593c4ab4f98f82e67d to your computer and use it in GitHub Desktop.
KvadratNikitosa
/*
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);
}
@anisyanka
Copy link

Поизучал немного библиотеку, которую ты используешь. Кажется там есть возможность установить callback на событие дисконекта веб-сокет клиента от сервера: https://github.com/gilmaimon/ArduinoWebsockets/blob/master/src/tiny_websockets/client.hpp#L46

Также наверняка сервер шлёт переодические пинги клиенту. Желательно на них отвечать. 
Короче надо в этом колбэке тогда по сути сделать переподключение в случае пропажи коннекшина, а в случае пинга отвечать понгом.

Сначала строку 83 передвинь на 34-ую.

Потом надо после строки 113 добавить:

client.onEvent(onEventCallback);

А выше 37-ой:

void onEventCallback(class WebsocketsEvent event, WSInterfaceString data_string) {
    switch (event) {
     case WebsocketsEvent::ConnectionOpened:
     /* Do nothing */
     break;

     case WebsocketsEvent::ConnectionClosed:
     //  а тут наверное так надо, хз
     client.connect(websockets_server_host, websockets_server_port, "/");
     break;

     case WebsocketsEvent::GotPing:
     client.pong();
     break;

     case WebsocketsEvent::GotPong:
     client.ping();
     break;
    }
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment