basic event sending works
This commit is contained in:
@@ -71,6 +71,115 @@ void WebSockets::clientDisconnect(WSclient_t * client, uint16_t code, char * rea
|
||||
clientDisconnect(client);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param buf uint8_t * ptr to the buffer for writing
|
||||
* @param opcode WSopcode_t
|
||||
* @param length size_t length of the payload
|
||||
* @param mask bool add dummy mask to the frame (needed for web browser)
|
||||
* @param maskkey uint8_t[4] key used for payload
|
||||
* @param fin bool can be used to send data in more then one frame (set fin on the last frame)
|
||||
*/
|
||||
uint8_t WebSockets::createHeader(uint8_t * headerPtr, WSopcode_t opcode, size_t length, bool mask, uint8_t maskKey[4], bool fin) {
|
||||
uint8_t headerSize;
|
||||
// calculate header Size
|
||||
if(length < 126) {
|
||||
headerSize = 2;
|
||||
} else if(length < 0xFFFF) {
|
||||
headerSize = 4;
|
||||
} else {
|
||||
headerSize = 10;
|
||||
}
|
||||
|
||||
if(mask) {
|
||||
headerSize += 4;
|
||||
}
|
||||
|
||||
// create header
|
||||
|
||||
// byte 0
|
||||
*headerPtr = 0x00;
|
||||
if(fin) {
|
||||
*headerPtr |= bit(7); ///< set Fin
|
||||
}
|
||||
*headerPtr |= opcode; ///< set opcode
|
||||
headerPtr++;
|
||||
|
||||
// byte 1
|
||||
*headerPtr = 0x00;
|
||||
if(mask) {
|
||||
*headerPtr |= bit(7); ///< set mask
|
||||
}
|
||||
|
||||
if(length < 126) {
|
||||
*headerPtr |= length;
|
||||
headerPtr++;
|
||||
} else if(length < 0xFFFF) {
|
||||
*headerPtr |= 126;
|
||||
headerPtr++;
|
||||
*headerPtr = ((length >> 8) & 0xFF);
|
||||
headerPtr++;
|
||||
*headerPtr = (length & 0xFF);
|
||||
headerPtr++;
|
||||
} else {
|
||||
// Normally we never get here (to less memory)
|
||||
*headerPtr |= 127;
|
||||
headerPtr++;
|
||||
*headerPtr = 0x00;
|
||||
headerPtr++;
|
||||
*headerPtr = 0x00;
|
||||
headerPtr++;
|
||||
*headerPtr = 0x00;
|
||||
headerPtr++;
|
||||
*headerPtr = 0x00;
|
||||
headerPtr++;
|
||||
*headerPtr = ((length >> 24) & 0xFF);
|
||||
headerPtr++;
|
||||
*headerPtr = ((length >> 16) & 0xFF);
|
||||
headerPtr++;
|
||||
*headerPtr = ((length >> 8) & 0xFF);
|
||||
headerPtr++;
|
||||
*headerPtr = (length & 0xFF);
|
||||
headerPtr++;
|
||||
}
|
||||
|
||||
if(mask) {
|
||||
*headerPtr = maskKey[0];
|
||||
headerPtr++;
|
||||
*headerPtr = maskKey[1];
|
||||
headerPtr++;
|
||||
*headerPtr = maskKey[2];
|
||||
headerPtr++;
|
||||
*headerPtr = maskKey[3];
|
||||
headerPtr++;
|
||||
}
|
||||
return headerSize;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param client WSclient_t * ptr to the client struct
|
||||
* @param opcode WSopcode_t
|
||||
* @param length size_t length of the payload
|
||||
* @param mask bool add dummy mask to the frame (needed for web browser)
|
||||
* @param fin bool can be used to send data in more then one frame (set fin on the last frame)
|
||||
* @return true if ok
|
||||
*/
|
||||
bool WebSockets::sendFrameHeader(WSclient_t * client, WSopcode_t opcode, size_t length, bool mask, bool fin) {
|
||||
uint8_t maskKey[4] = { 0x00, 0x00, 0x00, 0x00 };
|
||||
uint8_t buffer[WEBSOCKETS_MAX_HEADER_SIZE] = { 0 };
|
||||
|
||||
uint8_t headerSize = createHeader(&buffer[0], opcode, length, mask, maskKey, fin);
|
||||
|
||||
if(write(client, &buffer[0], headerSize) != headerSize) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
* @param client WSclient_t * ptr to the client struct
|
||||
@@ -146,53 +255,7 @@ bool WebSockets::sendFrame(WSclient_t * client, WSopcode_t opcode, uint8_t * pay
|
||||
headerPtr = &buffer[0];
|
||||
}
|
||||
|
||||
// create header
|
||||
|
||||
// byte 0
|
||||
*headerPtr = 0x00;
|
||||
if(fin) {
|
||||
*headerPtr |= bit(7); ///< set Fin
|
||||
}
|
||||
*headerPtr |= opcode; ///< set opcode
|
||||
headerPtr++;
|
||||
|
||||
// byte 1
|
||||
*headerPtr = 0x00;
|
||||
if(mask) {
|
||||
*headerPtr |= bit(7); ///< set mask
|
||||
}
|
||||
|
||||
if(length < 126) {
|
||||
*headerPtr |= length;
|
||||
headerPtr++;
|
||||
} else if(length < 0xFFFF) {
|
||||
*headerPtr |= 126;
|
||||
headerPtr++;
|
||||
*headerPtr = ((length >> 8) & 0xFF);
|
||||
headerPtr++;
|
||||
*headerPtr = (length & 0xFF);
|
||||
headerPtr++;
|
||||
} else {
|
||||
// Normally we never get here (to less memory)
|
||||
*headerPtr |= 127;
|
||||
headerPtr++;
|
||||
*headerPtr = 0x00;
|
||||
headerPtr++;
|
||||
*headerPtr = 0x00;
|
||||
headerPtr++;
|
||||
*headerPtr = 0x00;
|
||||
headerPtr++;
|
||||
*headerPtr = 0x00;
|
||||
headerPtr++;
|
||||
*headerPtr = ((length >> 24) & 0xFF);
|
||||
headerPtr++;
|
||||
*headerPtr = ((length >> 16) & 0xFF);
|
||||
headerPtr++;
|
||||
*headerPtr = ((length >> 8) & 0xFF);
|
||||
headerPtr++;
|
||||
*headerPtr = (length & 0xFF);
|
||||
headerPtr++;
|
||||
}
|
||||
createHeader(headerPtr, opcode, length, mask, maskKey, fin);
|
||||
|
||||
if(mask) {
|
||||
if(useInternBuffer) {
|
||||
@@ -200,8 +263,6 @@ bool WebSockets::sendFrame(WSclient_t * client, WSopcode_t opcode, uint8_t * pay
|
||||
// by this fact its possible the do the masking
|
||||
for(uint8_t x = 0; x < sizeof(maskKey); x++) {
|
||||
maskKey[x] = random(0xFF);
|
||||
*headerPtr = maskKey[x];
|
||||
headerPtr++;
|
||||
}
|
||||
|
||||
uint8_t * dataMaskPtr;
|
||||
@@ -215,16 +276,6 @@ bool WebSockets::sendFrame(WSclient_t * client, WSopcode_t opcode, uint8_t * pay
|
||||
for(size_t x = 0; x < length; x++) {
|
||||
dataMaskPtr[x] = (dataMaskPtr[x] ^ maskKey[x % 4]);
|
||||
}
|
||||
|
||||
} else {
|
||||
*headerPtr = maskKey[0];
|
||||
headerPtr++;
|
||||
*headerPtr = maskKey[1];
|
||||
headerPtr++;
|
||||
*headerPtr = maskKey[2];
|
||||
headerPtr++;
|
||||
*headerPtr = maskKey[3];
|
||||
headerPtr++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user