8000 Merge pull request #449 from Links2004/socketio · coderGods/arduinoWebSockets@c64f2b8 · GitHub
[go: up one dir, main page]

Skip to content

Commit c64f2b8

Browse files
authored
Merge pull request Links2004#449 from Links2004/socketio
Socket.IO 2.0.x Support
2 parents d3fde2b + 4ef8d73 commit c64f2b8

File tree

8 files changed

+472
-131
lines changed

8 files changed

+472
-131
lines changed

.travis.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ script:
2828
- export PATH="$HOME/arduino_ide:$PATH"
2929
- which arduino
3030
- mkdir -p $HOME/Arduino/libraries
31+
32+
- wget https://github.com/bblanchon/ArduinoJson/archive/6.x.zip
33+
- unzip 6.x.zip
34+
- mv ArduinoJson-6.x $HOME/Arduino/libraries/ArduinoJson
3135
- cp -r $TRAVIS_BUILD_DIR $HOME/Arduino/libraries/arduinoWebSockets
3236
- source $TRAVIS_BUILD_DIR/travis/common.sh
3337
- get_core $CPU

examples/esp8266/WebSocketClientSocketIO/WebSocketClientSocketIO.ino

Lines changed: 66 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -10,56 +10,46 @@
1010
#include <ESP8266WiFi.h>
1111
#include <ESP8266WiFiMulti.h>
1212

13+
#include <ArduinoJson.h>
14+
1315
#include <WebSocketsClient.h>
16+
#include <SocketIOclient.h>
1417

1518
#include <Hash.h>
1619

1720
ESP8266WiFiMulti WiFiMulti;
18-
WebSocketsClient webSocket;
19-
21+
SocketIOclient socketIO;
2022

2123
#define USE_SERIAL Serial1
2224

23-
#define MESSAGE_INTERVAL 30000
24-
#define HEARTBEAT_INTERVAL 25000
25-
26-
uint64_t messageTimestamp = 0;
27-
uint64_t heartbeatTimestamp = 0;
28-
bool isConnected = false;
29-
30-
void webSocketEvent(WStype_t type, uint8_t * payload, size_t length) {
31-
32-
25+
void socketIOEvent(socketIOmessageType_t type, uint8_t * payload, size_t length) {
3326
switch(type) {
34-
case WStype_DISCONNECTED:
35-
USE_SERIAL.printf("[WSc] Disconnected!\n");
36-
isConnected = false;
27+
case sIOtype_DISCONNECT:
28+
USE_SERIAL.printf("[IOc] Disconnected!\n");
3729
break;
38-
case WStype_CONNECTED:
39-
{
40-
USE_SERIAL.printf("[WSc] Connected to url: %s\n", payload);
41-
isConnected = true;
42-
43-
// send message to server when Connected
44-
// socket.io upgrade confirmation message (required)
45-
webSocket.sendTXT("5");
46-
}
30+
case sIOtype_CONNECT:
31+
USE_SERIAL.printf("[IOc] Connected to url: %s\n", payload);
4732
break;
48-
case WStype_TEXT:
49-
USE_SERIAL.printf("[WSc] get text: %s\n", payload);
50-
51-
// send message to server
52-
// webSocket.sendTXT("message here");
33+
case sIOtype_EVENT:
34+
USE_SERIAL.printf("[IOc] get event: %s\n", payload);
5335
break;
54-
case WStype_BIN:
55-
USE_SERIAL.printf("[WSc] get binary length: %u\n", length);
36+
case sIOtype_ACK:
37+
USE_SERIAL.printf("[IOc] get ack: %u\n", length);
38+
hexdump(payload, length);
39+
break;
40+
case sIOtype_ERROR:
41+
USE_SERIAL.printf("[IOc] get error: %u\n", length);
42+
hexdump(payload, length);
43+
break;
44+
case sIOtype_BINARY_EVENT:
45+
USE_SERIAL.printf("[IOc] get binary: %u\n", length);
46+
hexdump(payload, length);
47+
break;
48+
case sIOtype_BINARY_ACK:
49+
USE_SERIAL.printf("[IOc] get binary ack: %u\n", length);
5650
hexdump(payload, length);
57-
58-
// send data to server
59-
// webSocket.sendBIN(payload, length);
6051
break;
6152
}
62-
6353
}
6454

6555
void setup() {
@@ -79,35 +69,57 @@ void setup() {
7969
delay(1000);
8070
}
8171

72+
// disable AP
73+
if(WiFi.getMode() & WIFI_AP) {
74+
WiFi.softAPdisconnect(true);
75+
}
76+
8277
WiFiMulti.addAP("SSID", "passpasspass");
8378

8479
//WiFi.disconnect();
8580
while(WiFiMulti.run() != WL_CONNECTED) {
8681
delay(100);
8782
}
8883

89-
webSocket.beginSocketIO("192.168.0.123", 81);
90-
//webSocket.setAuthorization("user", "Password"); // HTTP Basic Authorization
91-
webSocket.onEvent(webSocketEvent);
84+
String ip = WiFi.localIP().toString();
85+
USE_SERIAL.printf("[SETUP] WiFi Connected %s\n", ip.c_str());
86+
87+
// server address, port and URL
88+
socketIO.begin("10.11.100.100", 8880);
9289

90+
// event handler
91+
socketIO.onEvent(socketIOEvent);
9392
}
9493

94+
unsigned long messageTimestamp = 0;
9595
void loop() {
96-
webSocket.loop();
97-
98-
if(isConnected) {
99-
100-
uint64_t now = millis();
101-
102-
if(now - messageTimestamp > MESSAGE_INTERVAL) {
103-
messageTimestamp = now;
104-
// example socket.io message with type "messageType" and JSON payload
105-
webSocket.sendTXT("42[\"messageType\",{\"greeting\":\"hello\"}]");
106-
}
107-
if((now - heartbeatTimestamp) > HEARTBEAT_INTERVAL) {
108-
heartbeatTimestamp = now;
109-
// socket.io heartbeat message
110-
webSocket.sendTXT("2");
111-
}
96+
socketIO.loop();
97+
98+
uint64_t now = millis();
99+
100+
if(now - messageTimestamp > 2000) {
101+
messageTimestamp = now;
102+
103+
// creat JSON message for Socket.IO (event)
104+
DynamicJsonDocument doc(1024);
105+
JsonArray array = doc.to<JsonArray>();
106+
107+
// add evnet name
108+
// Hint: socket.on('event_name', ....
109+
array.add("event_name");
110+
111+
// add payload (parameters) for the event
112+
JsonObject param1 = array.createNestedObject();
113+
param1["now"] = now;
114+
115+
// JSON to String (serializion)
116+
String output;
117+
serializeJson(doc, output);
118+
119+
// Send event
120+
socketIO.sendEVENT(output);
121+
122+
// Print JSON for debugging
123+
USE_SERIAL.println(output);
112124
}
113125
}

src/SocketIOclient.cpp

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

0 commit comments

Comments
 (0)
0