123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 |
- /*
- * SocketIOclient.cpp
- *
- * Created on: May 12, 2018
- * Author: links
- */
- #include "WebSockets.h"
- #include "WebSocketsClient.h"
- #include "SocketIOclient.h"
- SocketIOclient::SocketIOclient() {
- }
- SocketIOclient::~SocketIOclient() {
- }
- void SocketIOclient::begin(const char * host, uint16_t port, const char * url, const char * protocol) {
- WebSocketsClient::beginSocketIO(host, port, url, protocol);
- 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);
- WebSocketsClient::enableHeartbeat(60 * 1000, 90 * 1000, 5);
- }
- /**
- * set callback function
- * @param cbEvent SocketIOclientEvent
- */
- void SocketIOclient::onEvent(SocketIOclientEvent cbEvent) {
- _cbEvent = cbEvent;
- }
- 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) {
- length = strlen((const char *)payload);
- }
- if(clientIsConnected(&_client)) {
- if(!headerToPayload) {
- // webSocket Header
- ret = WebSocketsClient::sendFrameHeader(&_client, WSop_text, length + 2, true);
- // Engine.IO / Socket.IO Header
- if(ret) {
- uint8_t buf[3] = { eIOtype_MESSAGE, sIOtype_EVENT, 0x00 };
- ret = WebSocketsClient::write(&_client, buf, 2);
- }
- if(ret && payload && length > 0) {
- ret = WebSocketsClient::write(&_client, payload, length);
- }
- 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) {
- return sendEVENT((uint8_t *)payload, length);
- }
- bool SocketIOclient::sendEVENT(char * payload, size_t length, bool headerToPayload) {
- return sendEVENT((uint8_t *)payload, length, headerToPayload);
- }
- bool SocketIOclient::sendEVENT(const char * payload, size_t length) {
- return sendEVENT((uint8_t *)payload, length);
- }
- bool SocketIOclient::sendEVENT(String & payload) {
- return sendEVENT((uint8_t *)payload.c_str(), payload.length());
- }
- void SocketIOclient::loop(void) {
- WebSocketsClient::loop();
- unsigned long t = millis();
- if((t - _lastConnectionFail) > EIO_HEARTBEAT_INTERVAL) {
- _lastConnectionFail = t;
- DEBUG_WEBSOCKETS("[wsIOc] send ping\n");
- WebSocketsClient::sendTXT(eIOtype_PING);
- }
- }
- void SocketIOclient::handleCbEvent(WStype_t type, uint8_t * payload, size_t length) {
- switch(type) {
- case WStype_DISCONNECTED:
- 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
- // Engine.io upgrade confirmation message (required)
- WebSocketsClient::sendTXT(eIOtype_UPGRADE);
- runIOCbEvent(sIOtype_CONNECT, payload, length);
- } break;
- case WStype_TEXT: {
- if(length < 1) {
- break;
- }
- 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);
- WebSocketsClient::sendTXT(payload, length, false);
- break;
- case eIOtype_PONG:
- DEBUG_WEBSOCKETS("[wsIOc] get pong\n");
- break;
- case eIOtype_MESSAGE: {
- if(length < 2) {
- break;
- }
- socketIOmessageType_t ioType = (socketIOmessageType_t)payload[1];
- uint8_t * data = &payload[2];
- size_t lData = length - 2;
- 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;
- }
- runIOCbEvent(ioType, data, lData);
- } 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;
- }
- } 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;
- }
- }
|