Last active
March 8, 2020 07:03
-
-
Save gresan-gits/121d68e65219d182ca90edf7cb48fc5a to your computer and use it in GitHub Desktop.
ESPAsyncWebserver
This file contains hidden or 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
#include "WiFi.h" | |
#include "ESPAsyncWebServer.h" | |
const char* ssid = "Xuong May Gia Si";//"yourNetworkName"; | |
const char* password = "123456789";// "yourNetworkPassword"; | |
AsyncWebServer server(80); | |
AsyncWebSocket ws("/ws"); | |
void onWsEvent(AsyncWebSocket * server, AsyncWebSocketClient * client, AwsEventType type, void * arg, uint8_t *data, size_t len){ | |
if(type == WS_EVT_CONNECT){ | |
Serial.printf("ws[%s][%u] connect\n", server->url(), client->id()); | |
client->printf("Hello Client %u :)", client->id()); | |
client->ping(); | |
} else if(type == WS_EVT_DISCONNECT){ | |
Serial.printf("ws[%s][%u] disconnect\n", server->url(), client->id()); | |
} else if(type == WS_EVT_ERROR){ | |
Serial.printf("ws[%s][%u] error(%u): %s\n", server->url(), client->id(), *((uint16_t*)arg), (char*)data); | |
} else if(type == WS_EVT_PONG){ | |
Serial.printf("ws[%s][%u] pong[%u]: %s\n", server->url(), client->id(), len, (len)?(char*)data:""); | |
} else if(type == WS_EVT_DATA){ | |
AwsFrameInfo * info = (AwsFrameInfo*)arg; | |
String msg = ""; | |
if(info->final && info->index == 0 && info->len == len){ | |
//the whole message is in a single frame and we got all of it's data | |
Serial.printf("ws[%s][%u] %s-message[%llu]: ", server->url(), client->id(), (info->opcode == WS_TEXT)?"text":"binary", info->len); | |
if(info->opcode == WS_TEXT){ | |
for(size_t i=0; i < info->len; i++) { | |
msg += (char) data[i]; | |
} | |
} else { | |
char buff[3]; | |
for(size_t i=0; i < info->len; i++) { | |
sprintf(buff, "%02x ", (uint8_t) data[i]); | |
msg += buff ; | |
} | |
} | |
Serial.printf("%s\n",msg.c_str()); | |
if(info->opcode == WS_TEXT) | |
client->text("I got your text message"); | |
else | |
client->binary("I got your binary message"); | |
} else { | |
//message is comprised of multiple frames or the frame is split into multiple packets | |
if(info->index == 0){ | |
if(info->num == 0) | |
Serial.printf("ws[%s][%u] %s-message start\n", server->url(), client->id(), (info->message_opcode == WS_TEXT)?"text":"binary"); | |
Serial.printf("ws[%s][%u] frame[%u] start[%llu]\n", server->url(), client->id(), info->num, info->len); | |
} | |
Serial.printf("ws[%s][%u] frame[%u] %s[%llu - %llu]: ", server->url(), client->id(), info->num, (info->message_opcode == WS_TEXT)?"text":"binary", info->index, info->index + len); | |
if(info->opcode == WS_TEXT){ | |
for(size_t i=0; i < len; i++) { | |
msg += (char) data[i]; | |
} | |
} else { | |
char buff[3]; | |
for(size_t i=0; i < len; i++) { | |
sprintf(buff, "%02x ", (uint8_t) data[i]); | |
msg += buff ; | |
} | |
} | |
Serial.printf("%s\n",msg.c_str()); | |
if((info->index + len) == info->len){ | |
Serial.printf("ws[%s][%u] frame[%u] end[%llu]\n", server->url(), client->id(), info->num, info->len); | |
if(info->final){ | |
Serial.printf("ws[%s][%u] %s-message end\n", server->url(), client->id(), (info->message_opcode == WS_TEXT)?"text":"binary"); | |
if(info->message_opcode == WS_TEXT) | |
client->text("I got your text message"); | |
else | |
client->binary("I got your binary message"); | |
} | |
} | |
} | |
} | |
} | |
void setup() { | |
Serial.begin(115200); | |
WiFi.begin(ssid, password); | |
while (WiFi.status() != WL_CONNECTED) { | |
delay(1000); | |
Serial.println("Connecting to WiFi.."); | |
} | |
Serial.println(WiFi.localIP()); | |
ws.onEvent(onWsEvent); | |
server.addHandler(&ws); | |
server.begin(); | |
} | |
void loop() { | |
ws.cleanupClients(); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment