SocketIOclient.cpp 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. /*
  2. * SocketIOclient.cpp
  3. *
  4. * Created on: May 12, 2018
  5. * Author: links
  6. */
  7. #include "WebSockets.h"
  8. #include "WebSocketsClient.h"
  9. #include "SocketIOclient.h"
  10. SocketIOclient::SocketIOclient() {
  11. }
  12. SocketIOclient::~SocketIOclient() {
  13. }
  14. void SocketIOclient::begin(const char * host, uint16_t port, const char * url, const char * protocol) {
  15. WebSocketsClient::beginSocketIO(host, port, url, protocol);
  16. WebSocketsClient::enableHeartbeat(60 * 1000, 90 * 1000, 5);
  17. }
  18. void SocketIOclient::begin(String host, uint16_t port, String url, String protocol) {
  19. WebSocketsClient::beginSocketIO(host, port, url, protocol);
  20. WebSocketsClient::enableHeartbeat(60 * 1000, 90 * 1000, 5);
  21. }
  22. /**
  23. * set callback function
  24. * @param cbEvent SocketIOclientEvent
  25. */
  26. void SocketIOclient::onEvent(SocketIOclientEvent cbEvent) {
  27. _cbEvent = cbEvent;
  28. }
  29. bool SocketIOclient::isConnected(void) {
  30. return WebSocketsClient::isConnected();
  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. if(!headerToPayload) {
  47. // webSocket Header
  48. ret = WebSocketsClient::sendFrameHeader(&_client, WSop_text, length + 2, true);
  49. // Engine.IO / Socket.IO Header
  50. if(ret) {
  51. uint8_t buf[3] = { eIOtype_MESSAGE, sIOtype_EVENT, 0x00 };
  52. ret = WebSocketsClient::write(&_client, buf, 2);
  53. }
  54. if(ret && payload && length > 0) {
  55. ret = WebSocketsClient::write(&_client, payload, length);
  56. }
  57. return ret;
  58. } else {
  59. // TODO implement
  60. }
  61. // return WebSocketsClient::sendFrame(&_client, WSop_text, payload, length, true, true, headerToPayload);
  62. }
  63. return false;
  64. }
  65. bool SocketIOclient::sendEVENT(const uint8_t * payload, size_t length) {
  66. return sendEVENT((uint8_t *)payload, length);
  67. }
  68. bool SocketIOclient::sendEVENT(char * payload, size_t length, bool headerToPayload) {
  69. return sendEVENT((uint8_t *)payload, length, headerToPayload);
  70. }
  71. bool SocketIOclient::sendEVENT(const char * payload, size_t length) {
  72. return sendEVENT((uint8_t *)payload, length);
  73. }
  74. bool SocketIOclient::sendEVENT(String & payload) {
  75. return sendEVENT((uint8_t *)payload.c_str(), payload.length());
  76. }
  77. void SocketIOclient::loop(void) {
  78. WebSocketsClient::loop();
  79. unsigned long t = millis();
  80. if((t - _lastConnectionFail) > EIO_HEARTBEAT_INTERVAL) {
  81. _lastConnectionFail = t;
  82. DEBUG_WEBSOCKETS("[wsIOc] send ping\n");
  83. WebSocketsClient::sendTXT(eIOtype_PING);
  84. }
  85. }
  86. void SocketIOclient::handleCbEvent(WStype_t type, uint8_t * payload, size_t length) {
  87. switch(type) {
  88. case WStype_DISCONNECTED:
  89. runIOCbEvent(sIOtype_DISCONNECT, NULL, 0);
  90. DEBUG_WEBSOCKETS("[wsIOc] Disconnected!\n");
  91. break;
  92. case WStype_CONNECTED: {
  93. DEBUG_WEBSOCKETS("[wsIOc] Connected to url: %s\n", payload);
  94. // send message to server when Connected
  95. // Engine.io upgrade confirmation message (required)
  96. WebSocketsClient::sendTXT(eIOtype_UPGRADE);
  97. runIOCbEvent(sIOtype_CONNECT, payload, length);
  98. } break;
  99. case WStype_TEXT: {
  100. if(length < 1) {
  101. break;
  102. }
  103. engineIOmessageType_t eType = (engineIOmessageType_t)payload[0];
  104. switch(eType) {
  105. case eIOtype_PING:
  106. payload[0] = eIOtype_PONG;
  107. DEBUG_WEBSOCKETS("[wsIOc] get ping send pong (%s)\n", payload);
  108. WebSocketsClient::sendTXT(payload, length, false);
  109. break;
  110. case eIOtype_PONG:
  111. DEBUG_WEBSOCKETS("[wsIOc] get pong\n");
  112. break;
  113. case eIOtype_MESSAGE: {
  114. if(length < 2) {
  115. break;
  116. }
  117. socketIOmessageType_t ioType = (socketIOmessageType_t)payload[1];
  118. uint8_t * data = &payload[2];
  119. size_t lData = length - 2;
  120. switch(ioType) {
  121. case sIOtype_EVENT:
  122. DEBUG_WEBSOCKETS("[wsIOc] get event (%d): %s\n", lData, data);
  123. break;
  124. case sIOtype_CONNECT:
  125. case sIOtype_DISCONNECT:
  126. case sIOtype_ACK:
  127. case sIOtype_ERROR:
  128. case sIOtype_BINARY_EVENT:
  129. case sIOtype_BINARY_ACK:
  130. default:
  131. DEBUG_WEBSOCKETS("[wsIOc] Socket.IO Message Type %c (%02X) is not implemented\n", ioType, ioType);
  132. DEBUG_WEBSOCKETS("[wsIOc] get text: %s\n", payload);
  133. break;
  134. }
  135. runIOCbEvent(ioType, data, lData);
  136. } break;
  137. case eIOtype_OPEN:
  138. case eIOtype_CLOSE:
  139. case eIOtype_UPGRADE:
  140. case eIOtype_NOOP:
  141. default:
  142. DEBUG_WEBSOCKETS("[wsIOc] Engine.IO Message Type %c (%02X) is not implemented\n", eType, eType);
  143. DEBUG_WEBSOCKETS("[wsIOc] get text: %s\n", payload);
  144. break;
  145. }
  146. } break;
  147. case WStype_BIN:
  148. case WStype_FRAGMENT_TEXT_START:
  149. case WStype_FRAGMENT_BIN_START:
  150. case WStype_FRAGMENT:
  151. case WStype_FRAGMENT_FIN:
  152. case WStype_PING:
  153. case WStype_PONG:
  154. break;
  155. }
  156. }