Files
arduinoWebSockets/src/SocketIOclient.cpp

175 lines
5.9 KiB
C++
Raw Normal View History

/*
* SocketIOclient.cpp
*
* Created on: May 12, 2018
* Author: links
*/
#include "WebSockets.h"
#include "WebSocketsClient.h"
#include "SocketIOclient.h"
SocketIOclient::SocketIOclient() {
}
SocketIOclient::~SocketIOclient() {
}
2019-06-10 13:31:51 +02:00
void SocketIOclient::begin(const char * host, uint16_t port, const char * url, const char * protocol) {
WebSocketsClient::beginSocketIO(host, port, url, protocol);
2019-06-10 14:57:49 +02:00
WebSocketsClient::enableHeartbeat(60 * 1000, 90 * 1000, 5);
}
void SocketIOclient::begin(String host, uint16_t port, String url, String protocol) {
WebSocketsClient::beginSocketIO(host, port, url, protocol);
2019-06-10 14:57:49 +02:00
WebSocketsClient::enableHeartbeat(60 * 1000, 90 * 1000, 5);
}
/**
* set callback function
* @param cbEvent SocketIOclientEvent
*/
void SocketIOclient::onEvent(SocketIOclientEvent cbEvent) {
_cbEvent = cbEvent;
}
2018-05-12 16:53:34 +02:00
bool SocketIOclient::isConnected(void) {
return WebSocketsClient::isConnected();
}
/**
* send text data to client
* @param num uint8_t client id
* @param payload uint8_t *
* @param length size_t
* @param headerToPayload bool (see sendFrame for more details)
* @return true if ok
*/
bool SocketIOclient::sendEVENT(uint8_t * payload, size_t length, bool headerToPayload) {
bool ret = false;
if(length == 0) {
2019-06-10 13:31:51 +02:00
length = strlen((const char *)payload);
2018-05-12 16:53:34 +02:00
}
if(clientIsConnected(&_client)) {
if(!headerToPayload) {
// webSocket Header
2019-06-10 13:23:15 +02:00
ret = WebSocketsClient::sendFrameHeader(&_client, WSop_text, length + 2, true);
2018-05-12 16:53:34 +02:00
// Engine.IO / Socket.IO Header
if(ret) {
uint8_t buf[3] = { eIOtype_MESSAGE, sIOtype_EVENT, 0x00 };
2019-06-10 13:31:51 +02:00
ret = WebSocketsClient::write(&_client, buf, 2);
2018-05-12 16:53:34 +02:00
}
if(ret && payload && length > 0) {
2019-06-10 13:31:51 +02:00
ret = WebSocketsClient::write(&_client, payload, length);
2018-05-12 16:53:34 +02:00
}
return ret;
} else {
// TODO implement
}
// return WebSocketsClient::sendFrame(&_client, WSop_text, payload, length, true, true, headerToPayload);
}
return false;
}
bool SocketIOclient::sendEVENT(const uint8_t * payload, size_t length) {
2019-06-10 13:31:51 +02:00
return sendEVENT((uint8_t *)payload, length);
2018-05-12 16:53:34 +02:00
}
bool SocketIOclient::sendEVENT(char * payload, size_t length, bool headerToPayload) {
2019-06-10 13:31:51 +02:00
return sendEVENT((uint8_t *)payload, length, headerToPayload);
2018-05-12 16:53:34 +02:00
}
bool SocketIOclient::sendEVENT(const char * payload, size_t length) {
2019-06-10 13:31:51 +02:00
return sendEVENT((uint8_t *)payload, length);
2018-05-12 16:53:34 +02:00
}
bool SocketIOclient::sendEVENT(String & payload) {
2019-06-10 13:31:51 +02:00
return sendEVENT((uint8_t *)payload.c_str(), payload.length());
2018-05-12 16:53:34 +02:00
}
void SocketIOclient::loop(void) {
WebSocketsClient::loop();
unsigned long t = millis();
if((t - _lastConnectionFail) > EIO_HEARTBEAT_INTERVAL) {
_lastConnectionFail = t;
2019-06-10 14:57:49 +02:00
DEBUG_WEBSOCKETS("[wsIOc] send ping\n");
WebSocketsClient::sendTXT(eIOtype_PING);
}
}
2019-06-10 14:57:49 +02:00
void SocketIOclient::handleCbEvent(WStype_t type, uint8_t * payload, size_t length) {
switch(type) {
case WStype_DISCONNECTED:
2019-06-10 14:57:49 +02:00
runIOCbEvent(sIOtype_DISCONNECT, NULL, 0);
DEBUG_WEBSOCKETS("[wsIOc] Disconnected!\n");
break;
case WStype_CONNECTED: {
DEBUG_WEBSOCKETS("[wsIOc] Connected to url: %s\n", payload);
// send message to server when Connected
2018-05-12 15:27:08 +02:00
// Engine.io upgrade confirmation message (required)
2018-05-12 16:53:34 +02:00
WebSocketsClient::sendTXT(eIOtype_UPGRADE);
2019-06-10 14:57:49 +02:00
runIOCbEvent(sIOtype_CONNECT, payload, length);
2019-06-10 13:31:51 +02:00
} break;
case WStype_TEXT: {
if(length < 1) {
break;
}
2019-06-10 13:31:51 +02:00
engineIOmessageType_t eType = (engineIOmessageType_t)payload[0];
switch(eType) {
case eIOtype_PING:
payload[0] = eIOtype_PONG;
DEBUG_WEBSOCKETS("[wsIOc] get ping send pong (%s)\n", payload);
2018-05-12 16:53:34 +02:00
WebSocketsClient::sendTXT(payload, length, false);
break;
case eIOtype_PONG:
DEBUG_WEBSOCKETS("[wsIOc] get pong\n");
break;
2018-05-12 17:10:17 +02:00
case eIOtype_MESSAGE: {
if(length < 2) {
break;
}
2019-06-10 13:31:51 +02:00
socketIOmessageType_t ioType = (socketIOmessageType_t)payload[1];
uint8_t * data = &payload[2];
size_t lData = length - 2;
2018-05-12 17:10:17 +02:00
switch(ioType) {
case sIOtype_EVENT:
DEBUG_WEBSOCKETS("[wsIOc] get event (%d): %s\n", lData, data);
break;
case sIOtype_CONNECT:
case sIOtype_DISCONNECT:
case sIOtype_ACK:
case sIOtype_ERROR:
case sIOtype_BINARY_EVENT:
case sIOtype_BINARY_ACK:
default:
DEBUG_WEBSOCKETS("[wsIOc] Socket.IO Message Type %c (%02X) is not implemented\n", ioType, ioType);
DEBUG_WEBSOCKETS("[wsIOc] get text: %s\n", payload);
break;
}
2019-06-10 14:57:49 +02:00
runIOCbEvent(ioType, data, lData);
2019-06-10 13:31:51 +02:00
} break;
case eIOtype_OPEN:
case eIOtype_CLOSE:
case eIOtype_UPGRADE:
case eIOtype_NOOP:
default:
DEBUG_WEBSOCKETS("[wsIOc] Engine.IO Message Type %c (%02X) is not implemented\n", eType, eType);
DEBUG_WEBSOCKETS("[wsIOc] get text: %s\n", payload);
break;
}
2019-06-10 13:31:51 +02:00
} break;
case WStype_BIN:
case WStype_FRAGMENT_TEXT_START:
case WStype_FRAGMENT_BIN_START:
case WStype_FRAGMENT:
case WStype_FRAGMENT_FIN:
case WStype_PING:
case WStype_PONG:
break;
}
}