#include <ArduinoJson.h>
#include <WiFi.h>
#include <WebSocketsClient_Generic.h>
//#include <Hash.h>
WebSocketsClient webSocket;
#define USE_SSL true
#if USE_SSL
// Deprecated echo.websocket.org to be replaced
#define WS_SERVER "wss://echo.websocket.org"
#define WS_PORT 443
#else
// To run a local WebSocket Server
#define WS_SERVER "192.168.2.30"
#define WS_PORT 8080
#endif
bool alreadyConnected = false;
String messageToSend = "From Async " ARDUINO_BOARD;
void sendTXTMessage()
{
static uint64_t sendTXTMessage_timeout = 0;
uint64_t now = millis();
//KH
#define SEND_INTERVAL 30000L
// sendTXTMessage every SEND_INTERVAL (30) seconds.
if (now > sendTXTMessage_timeout)
{
//webSocket.sendTXT("message here");
// creat JSON message
DynamicJsonDocument doc(1024);
JsonArray array = doc.to<JsonArray>();
array.add(messageToSend);
// add payload (parameters) for the event
JsonObject param1 = array.createNestedObject();
param1["now"] = (uint32_t) now;
// JSON to String (serializion)
String output;
serializeJson(doc, output);
// Send event
webSocket.sendTXT(output);
// Print JSON for debugging
Serial.println(output);
sendTXTMessage_timeout = millis() + SEND_INTERVAL;
}
}
void webSocketEvent(const WStype_t& type, uint8_t * payload, const size_t& length)
{
switch (type)
{
case WStype_DISCONNECTED:
if (alreadyConnected)
{
Serial.println("[WSc] Disconnected!");
alreadyConnected = false;
}
break;
case WStype_CONNECTED:
{
alreadyConnected = true;
Serial.print("[WSc] Connected to url: ");
Serial.println((char *) payload);
// send message to server when Connected
webSocket.sendTXT("Connected");
}
break;
case WStype_TEXT:
Serial.printf("[WSc] get text: %s\n", payload);
// send message to server
//sendTXTMessage();
break;
case WStype_BIN:
Serial.printf("[WSc] get binary length: %u\n", length);
// hexdump(payload, length);
// send data to server
webSocket.sendBIN(payload, length);
break;
case WStype_PING:
// pong will be send automatically
Serial.printf("[WSc] get ping\n");
break;
case WStype_PONG:
// answer to a ping we send
Serial.printf("[WSc] get pong\n");
break;
case WStype_ERROR:
case WStype_FRAGMENT_TEXT_START:
case WStype_FRAGMENT_BIN_START:
case WStype_FRAGMENT:
case WStype_FRAGMENT_FIN:
break;
default:
break;
}
}
void setup()
{
// Serial.begin(921600);
Serial.begin(115200);
while (!Serial);
delay(200);
Serial.print("\nStart ESP8266_AsyncWSClient on ");
Serial.println(ARDUINO_BOARD);
Serial.println(WEBSOCKETS_GENERIC_VERSION);
//Serial.setDebugOutput(true);
WiFi.begin("Wokwi-GUEST", "", 6);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi..");
}
Serial.println();
// Client address
Serial.print("WebSockets Client started @ IP address: ");
Serial.println(WiFi.localIP());
// server address, port and URL
Serial.print("Connecting to WebSockets Server @ ");
Serial.println(WS_SERVER);
// server address, port and URL
#if USE_SSL
webSocket.beginSSL(WS_SERVER, WS_PORT);
#else
webSocket.begin(WS_SERVER, WS_PORT, "/");
#endif
// event handler
webSocket.onEvent(webSocketEvent);
// use HTTP Basic Authorization this is optional remove if not needed
//webSocket.setAuthorization("user", "Password");
// try ever 5000 again if connection has failed
webSocket.setReconnectInterval(5000);
// start heartbeat (optional)
// ping server every 15000 ms
// expect pong from server within 3000 ms
// consider connection disconnected if pong is not received 2 times
webSocket.enableHeartbeat(15000, 3000, 2);
// server address, port and URL
Serial.print("Connected to WebSockets Server @ IP address: ");
Serial.println(WS_SERVER);
}
void loop()
{
// No more webSocket.loop() in Async
sendTXTMessage();
}