9 #ifndef _SINRICPRO_WEBSOCKET_H__
10 #define _SINRICPRO_WEBSOCKET_H__
13 #include <ESP8266WiFi.h>
20 #include <WebSocketsClient.h>
22 #include <ArduinoJson.h>
23 #include "SinricProDebug.h"
24 #include "SinricProConfig.h"
25 #include "SinricProQueue.h"
26 #include "SinricProInterface.h"
29 #if !defined(WEBSOCKETS_VERSION_INT) || (WEBSOCKETS_VERSION_INT < 2003003)
30 #error "Wrong WebSockets Version! Minimum Version is 2.3.3!!!"
33 class AdvWebSocketsClient :
public WebSocketsClient {
35 void onPong(std::function<
void(uint32_t)> cb) { _rttCb = cb; }
37 void messageReceived(WSclient_t * client, WSopcode_t opcode, uint8_t * payload,
size_t length,
bool fin) {
38 if ((opcode == WSop_pong)&& (_rttCb)) {
39 _rttCb(millis()-_client.lastPing);
41 WebSocketsClient::messageReceived(client, opcode, payload, length, fin);
44 std::function<void(uint32_t)> _rttCb =
nullptr;
47 class websocketListener
50 typedef std::function<void(
void)> wsConnectedCallback;
51 typedef std::function<void(
void)> wsDisconnectedCallback;
56 void begin(String server, String socketAuthToken, String deviceIds, SinricProQueue_t* receiveQueue);
59 bool isConnected() {
return _isConnected; }
60 void setRestoreDeviceStates(
bool flag) { this->restoreDeviceStates = flag; };
62 void sendMessage(String &message);
64 void onConnected(wsConnectedCallback callback) { _wsConnectedCb = callback; }
65 void onDisconnected(wsDisconnectedCallback callback) { _wsDisconnectedCb = callback; }
66 void onPong(std::function<
void(uint32_t)> cb) { webSocket.onPong(cb); }
68 void disconnect() { webSocket.disconnect(); }
71 bool _isConnected =
false;
72 bool restoreDeviceStates =
false;
74 AdvWebSocketsClient webSocket;
76 wsConnectedCallback _wsConnectedCb;
77 wsDisconnectedCallback _wsDisconnectedCb;
79 void webSocketEvent(WStype_t type, uint8_t * payload,
size_t length);
80 void setExtraHeaders();
81 SinricProQueue_t* receiveQueue;
83 String socketAuthToken;
86 void websocketListener::setExtraHeaders() {
87 String headers =
"appkey:" + socketAuthToken +
"\r\n";
88 headers +=
"deviceids:" + deviceIds +
"\r\n";
89 headers +=
"restoredevicestates:" + String(restoreDeviceStates?
"true":
"false") +
"\r\n";
90 headers +=
"ip:" + WiFi.localIP().toString() +
"\r\n";
91 headers +=
"mac:" + WiFi.macAddress() +
"\r\n";
93 headers +=
"platform:ESP8266\r\n";
96 headers +=
"platform:ESP32\r\n";
98 headers +=
"version:" + String(SINRICPRO_VERSION);
99 DEBUG_SINRIC(
"[SinricPro:Websocket]: headers: \r\n%s\r\n", headers.c_str());
100 webSocket.setExtraHeaders(headers.c_str());
103 websocketListener::websocketListener() : _isConnected(false) {}
105 websocketListener::~websocketListener() {
109 void websocketListener::begin(String server, String socketAuthToken, String deviceIds, SinricProQueue_t* receiveQueue) {
113 this->receiveQueue = receiveQueue;
114 this->socketAuthToken = socketAuthToken;
115 this->deviceIds = deviceIds;
118 DEBUG_SINRIC(
"[SinricPro:Websocket]: Connecting to WebSocket Server using SSL (%s)\r\n", server.c_str());
120 DEBUG_SINRIC(
"[SinricPro:Websocket]: Connecting to WebSocket Server (%s)\r\n", server.c_str());
127 webSocket.onEvent([&](WStype_t type, uint8_t * payload,
size_t length) { webSocketEvent(type, payload, length); });
128 webSocket.enableHeartbeat(WEBSOCKET_PING_INTERVAL, WEBSOCKET_PING_TIMEOUT, WEBSOCKET_RETRY_COUNT);
130 webSocket.beginSSL(server.c_str(), SINRICPRO_SERVER_SSL_PORT,
"/");
132 webSocket.begin(server.c_str(), SINRICPRO_SERVER_PORT,
"/");
136 void websocketListener::handle() {
140 void websocketListener::stop() {
142 webSocket.disconnect();
147 void websocketListener::sendMessage(String &message) {
148 webSocket.sendTXT(message);
152 void websocketListener::webSocketEvent(WStype_t type, uint8_t * payload,
size_t length)
156 case WStype_DISCONNECTED:
158 DEBUG_SINRIC(
"[SinricPro:Websocket]: disconnected\r\n");
159 if (_wsDisconnectedCb) _wsDisconnectedCb();
160 _isConnected =
false;
163 case WStype_CONNECTED:
165 DEBUG_SINRIC(
"[SinricPro:Websocket]: connected\r\n");
166 if (_wsConnectedCb) _wsConnectedCb();
167 if (restoreDeviceStates) {
168 restoreDeviceStates=
false;
173 SinricProMessage* request =
new SinricProMessage(IF_WEBSOCKET, (
char*)payload);
174 DEBUG_SINRIC(
"[SinricPro:Websocket]: receiving data\r\n");
175 receiveQueue->push(request);