9 #ifndef _SINRICPRO_WEBSOCKET_H__
10 #define _SINRICPRO_WEBSOCKET_H__
13 #include <ESP8266WiFi.h>
19 #include <WebSocketsClient.h>
20 #include <ArduinoJson.h>
21 #include "SinricProDebug.h"
22 #include "SinricProConfig.h"
23 #include "SinricProQueue.h"
24 #include "SinricProInterface.h"
26 class AdvWebSocketsClient :
public WebSocketsClient {
28 void onPong(std::function<
void(uint32_t)> cb) { _rttCb = cb; }
30 void messageReceived(WSclient_t * client, WSopcode_t opcode, uint8_t * payload,
size_t length,
bool fin) {
31 if ((opcode == WSop_pong)&& (_rttCb)) {
32 _rttCb(millis()-_client.lastPing);
34 WebSocketsClient::messageReceived(client, opcode, payload, length, fin);
37 std::function<void(uint32_t)> _rttCb =
nullptr;
40 class websocketListener
43 typedef std::function<void(
void)> wsConnectedCallback;
44 typedef std::function<void(
void)> wsDisconnectedCallback;
49 void begin(String server, String socketAuthToken, String deviceIds, SinricProQueue_t* receiveQueue);
52 bool isConnected() {
return _isConnected; }
53 void setRestoreDeviceStates(
bool flag) { this->restoreDeviceStates = flag; };
55 void sendMessage(String &message);
57 void onConnected(wsConnectedCallback callback) { _wsConnectedCb = callback; }
58 void onDisconnected(wsDisconnectedCallback callback) { _wsDisconnectedCb = callback; }
59 void onPong(std::function<
void(uint32_t)> cb) { webSocket.onPong(cb); }
61 void disconnect() { webSocket.disconnect(); }
64 bool _isConnected =
false;
65 bool restoreDeviceStates =
false;
67 AdvWebSocketsClient webSocket;
69 wsConnectedCallback _wsConnectedCb;
70 wsDisconnectedCallback _wsDisconnectedCb;
72 void webSocketEvent(WStype_t type, uint8_t * payload,
size_t length);
73 void setExtraHeaders();
74 SinricProQueue_t* receiveQueue;
76 String socketAuthToken;
79 void websocketListener::setExtraHeaders() {
80 String headers =
"appkey:" + socketAuthToken +
"\r\n";
81 headers +=
"deviceids:" + deviceIds +
"\r\n";
82 headers +=
"restoredevicestates:" + String(restoreDeviceStates?
"true":
"false") +
"\r\n";
83 headers +=
"ip:" + WiFi.localIP().toString() +
"\r\n";
84 headers +=
"mac:" + WiFi.macAddress() +
"\r\n";
86 headers +=
"platform:ESP8266\r\n";
89 headers +=
"platform:ESP32\r\n";
91 headers +=
"version:" + String(SINRICPRO_VERSION);
92 DEBUG_SINRIC(
"[SinricPro:Websocket]: headers: \r\n%s\r\n", headers.c_str());
93 webSocket.setExtraHeaders(headers.c_str());
96 websocketListener::websocketListener() : _isConnected(false) {}
98 websocketListener::~websocketListener() {
102 void websocketListener::begin(String server, String socketAuthToken, String deviceIds, SinricProQueue_t* receiveQueue) {
106 this->receiveQueue = receiveQueue;
107 this->socketAuthToken = socketAuthToken;
108 this->deviceIds = deviceIds;
111 DEBUG_SINRIC(
"[SinricPro:Websocket]: Connecting to WebSocket Server using SSL (%s)\r\n", server.c_str());
113 DEBUG_SINRIC(
"[SinricPro:Websocket]: Connecting to WebSocket Server (%s)\r\n", server.c_str());
120 webSocket.onEvent([&](WStype_t type, uint8_t * payload,
size_t length) { webSocketEvent(type, payload, length); });
121 webSocket.enableHeartbeat(WEBSOCKET_PING_INTERVAL, WEBSOCKET_PING_TIMEOUT, WEBSOCKET_RETRY_COUNT);
124 webSocket.beginSSL(server, SINRICPRO_SERVER_SSL_PORT,
"/");
126 webSocket.begin(server, SINRICPRO_SERVER_PORT,
"/");
130 void websocketListener::handle() {
134 void websocketListener::stop() {
136 webSocket.disconnect();
141 void websocketListener::sendMessage(String &message) {
142 webSocket.sendTXT(message);
146 void websocketListener::webSocketEvent(WStype_t type, uint8_t * payload,
size_t length)
149 case WStype_DISCONNECTED:
151 DEBUG_SINRIC(
"[SinricPro:Websocket]: disconnected\r\n");
152 if (_wsDisconnectedCb) _wsDisconnectedCb();
153 _isConnected =
false;
156 case WStype_CONNECTED:
158 DEBUG_SINRIC(
"[SinricPro:Websocket]: connected\r\n");
159 if (_wsConnectedCb) _wsConnectedCb();
160 if (restoreDeviceStates) {
161 restoreDeviceStates=
false;
166 SinricProMessage* request =
new SinricProMessage(IF_WEBSOCKET, (
char*)payload);
167 DEBUG_SINRIC(
"[SinricPro:Websocket]: receiving data\r\n");
168 receiveQueue->push(request);