Skip to content

Commit 00cd68f

Browse files
committed
Add ping, pong, and connection close support
1 parent 1c56734 commit 00cd68f

File tree

3 files changed

+65
-3
lines changed

3 files changed

+65
-3
lines changed

WebSocketClient.cpp

+56-3
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,20 @@
66
#include "WebSocketClient.h"
77

88
WebSocketClient::WebSocketClient(Client& aClient, const char* aServerName, uint16_t aServerPort)
9-
: HttpClient(aClient, aServerName, aServerPort)
9+
: HttpClient(aClient, aServerName, aServerPort),
10+
iRxSize(0)
1011
{
1112
}
1213

1314
WebSocketClient::WebSocketClient(Client& aClient, const String& aServerName, uint16_t aServerPort)
14-
: HttpClient(aClient, aServerName, aServerPort)
15+
: HttpClient(aClient, aServerName, aServerPort),
16+
iRxSize(0)
1517
{
1618
}
1719

1820
WebSocketClient::WebSocketClient(Client& aClient, const IPAddress& aServerAddress, uint16_t aServerPort)
19-
: HttpClient(aClient, aServerAddress, aServerPort)
21+
: HttpClient(aClient, aServerAddress, aServerPort),
22+
iRxSize(0)
2023
{
2124
}
2225

@@ -55,6 +58,8 @@ int WebSocketClient::begin(const char* aPath)
5558
}
5659
}
5760

61+
iRxSize = 0;
62+
5863
// status code of 101 means success
5964
return (status == 101) ? 0 : status;
6065
}
@@ -152,6 +157,8 @@ size_t WebSocketClient::write(const uint8_t *aBuffer, size_t aSize)
152157

153158
int WebSocketClient::parseMessage()
154159
{
160+
flushRx();
161+
155162
// make sure 2 bytes (opcode + length)
156163
// are available
157164
if (HttpClient::available() < 2)
@@ -208,6 +215,29 @@ int WebSocketClient::parseMessage()
208215

209216
iRxMaskIndex = 0;
210217

218+
if (TYPE_CONNECTION_CLOSE == messageType())
219+
{
220+
flushRx();
221+
stop();
222+
iRxSize = 0;
223+
}
224+
else if (TYPE_PING == messageType())
225+
{
226+
beginMessage(TYPE_PONG);
227+
while(available())
228+
{
229+
write(read());
230+
}
231+
endMessage();
232+
233+
iRxSize = 0;
234+
}
235+
else if (TYPE_PONG == messageType())
236+
{
237+
flushRx();
238+
iRxSize = 0;
239+
}
240+
211241
return iRxSize;
212242
}
213243

@@ -239,6 +269,21 @@ String WebSocketClient::readString()
239269
return s;
240270
}
241271

272+
int WebSocketClient::ping()
273+
{
274+
uint8_t pingData[16];
275+
276+
// create random data for the ping
277+
for (int i = 0; i < (int)sizeof(pingData); i++)
278+
{
279+
pingData[i] = random(0xff);
280+
}
281+
282+
beginMessage(TYPE_PING);
283+
write(pingData, sizeof(pingData));
284+
return endMessage();
285+
}
286+
242287
int WebSocketClient::available()
243288
{
244289
if (iState < eReadingBody)
@@ -293,3 +338,11 @@ int WebSocketClient::peek()
293338

294339
return p;
295340
}
341+
342+
void WebSocketClient::flushRx()
343+
{
344+
while(available())
345+
{
346+
read();
347+
}
348+
}

WebSocketClient.h

+8
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,11 @@ class WebSocketClient : public HttpClient
6363
*/
6464
String readString();
6565

66+
/** Send a ping
67+
@return 0 if successful, else error
68+
*/
69+
int ping();
70+
6671
// Inherited from Print
6772
virtual size_t write(uint8_t aByte);
6873
virtual size_t write(const uint8_t *aBuffer, size_t aSize);
@@ -75,6 +80,9 @@ class WebSocketClient : public HttpClient
7580
virtual int read(uint8_t *buf, size_t size);
7681
virtual int peek();
7782

83+
private:
84+
void flushRx();
85+
7886
private:
7987
uint8_t iTxMessageType;
8088
uint8_t iTxBuffer[128];

keywords.txt

+1
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ parseMessage KEYWORD2
4242
messageType KEYWORD2
4343
isFinal KEYWORD2
4444
readString KEYWORD2
45+
ping KEYWORD2
4546

4647
#######################################
4748
# Constants (LITERAL1)

0 commit comments

Comments
 (0)