Skip to content

Commit 794163c

Browse files
committed
Merge branch 'gpn18' into socketio
2 parents 2944368 + d325bd3 commit 794163c

File tree

6 files changed

+384
-76
lines changed

6 files changed

+384
-76
lines changed

src/SocketIOclient.cpp

Lines changed: 168 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,168 @@
1+
/*
2+
* SocketIOclient.cpp
3+
*
4+
* Created on: May 12, 2018
5+
* Author: links
6+
*/
7+
8+
#include "WebSockets.h"
9+
#include "WebSocketsClient.h"
10+
#include "SocketIOclient.h"
11+
12+
SocketIOclient::SocketIOclient() {
13+
14+
}
15+
16+
SocketIOclient::~SocketIOclient() {
17+
18+
}
19+
20+
void SocketIOclient::begin(const char *host, uint16_t port, const char * url, const char * protocol) {
21+
WebSocketsClient::beginSocketIO(host, port, url, protocol);
22+
}
23+
24+
void SocketIOclient::begin(String host, uint16_t port, String url, String protocol) {
25+
WebSocketsClient::beginSocketIO(host, port, url, protocol);
26+
}
27+
28+
bool SocketIOclient::isConnected(void) {
29+
return WebSocketsClient::isConnected();
30+
}
31+
32+
/**
33+
* send text data to client
34+
* @param num uint8_t client id
35+
* @param payload uint8_t *
36+
* @param length size_t
37+
* @param headerToPayload bool (see sendFrame for more details)
38+
* @return true if ok
39+
*/
40+
bool SocketIOclient::sendEVENT(uint8_t * payload, size_t length, bool headerToPayload) {
41+
bool ret = false;
42+
if(length == 0) {
43+
length = strlen((const char *) payload);
44+
}
45+
if(clientIsConnected(&_client)) {
46+
47+
if(!headerToPayload) {
48+
// webSocket Header
49+
ret = WebSocketsClient::sendFrameHeader(&_client, WSop_text, length + 2, true);
50+
// Engine.IO / Socket.IO Header
51+
if(ret) {
52+
uint8_t buf[3] = { eIOtype_MESSAGE, sIOtype_EVENT, 0x00 };
53+
ret = WebSocketsClient::write(&_client, buf, 2);
54+
}
55+
if(ret) {
56+
ret = WebSocketsClient::write(&_client, payload, length );
57+
}
58+
return ret;
59+
} else {
60+
// TODO implement
61+
}
62+
63+
// return WebSocketsClient::sendFrame(&_client, WSop_text, payload, length, true, true, headerToPayload);
64+
}
65+
return false;
66+
}
67+
68+
bool SocketIOclient::sendEVENT(const uint8_t * payload, size_t length) {
69+
return sendEVENT((uint8_t *) payload, length);
70+
}
71+
72+
bool SocketIOclient::sendEVENT(char * payload, size_t length, bool headerToPayload) {
73+
return sendEVENT((uint8_t *) payload, length, headerToPayload);
74+
}
75+
76+
bool SocketIOclient::sendEVENT(const char * payload, size_t length) {
77+
return sendEVENT((uint8_t *) payload, length);
78+
}
79+
80+
bool SocketIOclient::sendEVENT(String & payload) {
81+
return sendEVENT((uint8_t *) payload.c_str(), payload.length());
82+
}
83+
84+
void SocketIOclient::loop(void) {
85+
WebSocketsClient::loop();
86+
unsigned long t = millis();
87+
if((t - _lastConnectionFail) > EIO_HEARTBEAT_INTERVAL) {
88+
_lastConnectionFail = t;
89+
//WebSocketsClient::sendTXT(eIOtype_PING);
90+
}
91+
}
92+
93+
void SocketIOclient::runCbEvent(WStype_t type, uint8_t * payload, size_t length) {
94+
switch(type) {
95+
case WStype_DISCONNECTED:
96+
DEBUG_WEBSOCKETS("[wsIOc] Disconnected!\n");
97+
break;
98+
case WStype_CONNECTED: {
99+
DEBUG_WEBSOCKETS("[wsIOc] Connected to url: %s\n", payload);
100+
// send message to server when Connected
101+
// Engine.io upgrade confirmation message (required)
102+
WebSocketsClient::sendTXT(eIOtype_UPGRADE);
103+
}
104+
break;
105+
case WStype_TEXT: {
106+
107+
if(length < 1) {
108+
break;
109+
}
110+
111+
engineIOmessageType_t eType = (engineIOmessageType_t) payload[0];
112+
switch(eType) {
113+
case eIOtype_PING:
114+
payload[0] = eIOtype_PONG;
115+
DEBUG_WEBSOCKETS("[wsIOc] get ping send pong (%s)\n", payload);
116+
WebSocketsClient::sendTXT(payload, length, false);
117+
break;
118+
case eIOtype_PONG:
119+
DEBUG_WEBSOCKETS("[wsIOc] get pong\n");
120+
break;
121+
case eIOtype_MESSAGE: {
122+
if(length < 2) {
123+
break;
124+
}
125+
socketIOmessageType_t ioType = (socketIOmessageType_t) payload[1];
126+
uint8_t * data = &payload[2];
127+
size_t lData = length - 2;
128+
switch(ioType) {
129+
case sIOtype_EVENT:
130+
DEBUG_WEBSOCKETS("[wsIOc] get event (%d): %s\n", lData, data);
131+
break;
132+
case sIOtype_CONNECT:
133+
case sIOtype_DISCONNECT:
134+
case sIOtype_ACK:
135+
case sIOtype_ERROR:
136+
case sIOtype_BINARY_EVENT:
137+
case sIOtype_BINARY_ACK:
138+
default:
139+
DEBUG_WEBSOCKETS("[wsIOc] Socket.IO Message Type %c (%02X) is not implemented\n", ioType, ioType);
140+
DEBUG_WEBSOCKETS("[wsIOc] get text: %s\n", payload);
141+
break;
142+
}
143+
144+
}
145+
break;
146+
case eIOtype_OPEN:
147+
case eIOtype_CLOSE:
148+
case eIOtype_UPGRADE:
149+
case eIOtype_NOOP:
150+
default:
151+
DEBUG_WEBSOCKETS("[wsIOc] Engine.IO Message Type %c (%02X) is not implemented\n", eType, eType);
152+
DEBUG_WEBSOCKETS("[wsIOc] get text: %s\n", payload);
153+
break;
154+
}
155+
156+
// send message to server
157+
// webSocket.sendTXT("message here");
158+
}
159+
break;
160+
case WStype_BIN:
161+
DEBUG_WEBSOCKETS("[wsIOc] get binary length: %u\n", length);
162+
// hexdump(payload, length);
163+
164+
// send data to server
165+
// webSocket.sendBIN(payload, length);
166+
break;
167+
}
168+
}

src/SocketIOclient.h

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
/*
2+
* SocketIOclient.h
3+
*
4+
* Created on: May 12, 2018
5+
* Author: links
6+
*/
7+
8+
#ifndef SOCKETIOCLIENT_H_
9+
#define SOCKETIOCLIENT_H_
10+
11+
#include "WebSockets.h"
12+
13+
#define EIO_HEARTBEAT_INTERVAL 10000
14+
15+
#define EIO_MAX_HEADER_SIZE (WEBSOCKETS_MAX_HEADER_SIZE + 1)
16+
#define SIO_MAX_HEADER_SIZE (EIO_MAX_HEADER_SIZE + 1)
17+
18+
typedef enum {
19+
eIOtype_OPEN = '0', ///< Sent from the server when a new transport is opened (recheck)
20+
eIOtype_CLOSE = '1', ///< Request the close of this transport but does not shutdown the connection itself.
21+
eIOtype_PING = '2', ///< Sent by the client. Server should answer with a pong packet containing the same data
22+
eIOtype_PONG = '3', ///< Sent by the server to respond to ping packets.
23+
eIOtype_MESSAGE = '4', ///< actual message, client and server should call their callbacks with the data
24+
eIOtype_UPGRADE = '5', ///< Before engine.io switches a transport, it tests, if server and client can communicate over this transport. If this test succeed, the client sends an upgrade packets which requests the server to flush its cache on the old transport and switch to the new transport.
25+
eIOtype_NOOP = '6', ///< A noop packet. Used primarily to force a poll cycle when an incoming websocket connection is received.
26+
} engineIOmessageType_t;
27+
28+
29+
typedef enum {
30+
sIOtype_CONNECT = '0',
31+
sIOtype_DISCONNECT = '1',
32+
sIOtype_EVENT = '2',
33+
sIOtype_ACK = '3',
34+
sIOtype_ERROR = '4',
35+
sIOtype_BINARY_EVENT = '5',
36+
sIOtype_BINARY_ACK = '6',
37+
} socketIOmessageType_t;
38+
39+
class SocketIOclient: protected WebSocketsClient {
40+
41+
public:
42+
#ifdef __AVR__
43+
typedef void (*SocketIOclientEvent)(WStype_t type, uint8_t * payload, size_t length);
44+
#else
45+
typedef std::function<void (WStype_t type, uint8_t * payload, size_t length)> SocketIOclientEvent;
46+
#endif
47+
48+
SocketIOclient(void);
49+
virtual ~SocketIOclient(void);
50+
51+
void begin(const char *host, uint16_t port, const char * url = "/socket.io/?EIO=3", const char * protocol = "arduino");
52+
void begin(String host, uint16_t port, String url = "/socket.io/?EIO=3", String protocol = "arduino");
53+
54+
bool isConnected(void);
55+
56+
bool sendEVENT(uint8_t * payload, size_t length = 0, bool headerToPayload = false);
57+
bool sendEVENT(const uint8_t * payload, size_t length = 0);
58+
bool sendEVENT(char * payload, size_t length = 0, bool headerToPayload = false);
59+
bool sendEVENT(const char * payload, size_t length = 0);
60+
bool sendEVENT(String & payload);
61+
62+
void loop(void);
63+
64+
protected:
65+
void runCbEvent(WStype_t type, uint8_t * payload, size_t length);
66+
uint64_t _lastHeartbeat = 0;
67+
};
68+
69+
#endif /* SOCKETIOCLIENT_H_ */

0 commit comments

Comments
 (0)