#ifndef __WebUtils_H___ #define __WebUtils_H___ #include #include #include #include class WebUtils { public: static String getRequestParameterOrDefault(AsyncWebServerRequest *request, String param, String defaultValue, bool isPost = true){ if(request->hasParam(param, isPost)) { return request->getParam(param, isPost)->value(); } return defaultValue; } static String parseFrame(AwsEventType type, void * arg, uint8_t *data, size_t len) { String msg = ""; if(type == WS_EVT_DATA){ AwsFrameInfo * info = (AwsFrameInfo*)arg; 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 ; } } } return msg; } static String parseFrameAsString(AwsEventType type, void * arg, uint8_t *data, size_t len, int start = 0) { String msg = ""; if(type == WS_EVT_DATA){ AwsFrameInfo * info = (AwsFrameInfo*)arg; //if(info->final && info->index == 0 && info->len == len){ if(info->opcode == WS_TEXT){ for(size_t i=start; i < info->len; i++) { msg += (char) data[i]; } } else { char buff[3]; for(size_t i=start; i < info->len; i++) { sprintf(buff, "%02x ", (uint8_t) data[i]); msg += buff ; } } //} } return msg; } /* static 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: %u\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 = ""; //the whole message is in a single frame and we got all of it's data if(info->final && info->index == 0 && info->len == len){ 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"); } //message is comprised of multiple frames or the frame is split into multiple packets else { 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 < 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->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"); } } } } } */ }; #endif