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 websocketListener
29 typedef std::function<void(
void)> wsConnectedCallback;
30 typedef std::function<void(
void)> wsDisconnectedCallback;
35 void begin(String server, String socketAuthToken, String deviceIds, SinricProQueue_t* receiveQueue);
38 bool isConnected() {
return _isConnected; }
39 void setRestoreDeviceStates(
bool flag) { this->restoreDeviceStates = flag; };
41 void sendMessage(String &message);
43 void onConnected(wsConnectedCallback callback) { _wsConnectedCb = callback; }
44 void onDisconnected(wsDisconnectedCallback callback) { _wsDisconnectedCb = callback; }
46 void disconnect() { webSocket.disconnect(); }
49 bool _isConnected =
false;
50 bool restoreDeviceStates =
false;
52 WebSocketsClient webSocket;
54 wsConnectedCallback _wsConnectedCb;
55 wsDisconnectedCallback _wsDisconnectedCb;
57 void webSocketEvent(WStype_t type, uint8_t * payload,
size_t length);
58 void setExtraHeaders();
59 SinricProQueue_t* receiveQueue;
61 String socketAuthToken;
64 void websocketListener::setExtraHeaders() {
65 String headers =
"appkey:" + socketAuthToken +
"\r\n";
66 headers +=
"deviceids:" + deviceIds +
"\r\n";
67 headers +=
"restoredevicestates:" + String(restoreDeviceStates?
"true":
"false") +
"\r\n";
69 headers +=
"platform:ESP8266\r\n";
72 headers +=
"platform:ESP32\r\n";
74 headers +=
"version:" + String(SINRICPRO_VERSION);
75 DEBUG_SINRIC(
"[SinricPro:Websocket]: headers: \r\n%s\r\n", headers.c_str());
76 webSocket.setExtraHeaders(headers.c_str());
79 websocketListener::websocketListener() : _isConnected(false) {}
81 websocketListener::~websocketListener() {
85 void websocketListener::begin(String server, String socketAuthToken, String deviceIds, SinricProQueue_t* receiveQueue) {
89 this->receiveQueue = receiveQueue;
90 this->socketAuthToken = socketAuthToken;
91 this->deviceIds = deviceIds;
93 DEBUG_SINRIC(
"[SinricPro:Websocket]: Connecting to WebSocket Server (%s)\r\n", server.c_str());
99 webSocket.onEvent([&](WStype_t type, uint8_t * payload,
size_t length) { webSocketEvent(type, payload, length); });
100 webSocket.enableHeartbeat(WEBSOCKET_PING_INTERVAL, WEBSOCKET_PING_TIMEOUT, WEBSOCKET_RETRY_COUNT);
101 webSocket.begin(server, SINRICPRO_SERVER_PORT,
"/");
104 void websocketListener::handle() {
108 void websocketListener::stop() {
110 webSocket.disconnect();
115 void websocketListener::sendMessage(String &message) {
116 webSocket.sendTXT(message);
120 void websocketListener::webSocketEvent(WStype_t type, uint8_t * payload,
size_t length)
123 case WStype_DISCONNECTED:
125 DEBUG_SINRIC(
"[SinricPro:Websocket]: disconnected\r\n");
126 if (_wsDisconnectedCb) _wsDisconnectedCb();
127 _isConnected =
false;
130 case WStype_CONNECTED:
132 DEBUG_SINRIC(
"[SinricPro:Websocket]: connected\r\n");
133 if (_wsConnectedCb) _wsConnectedCb();
134 if (restoreDeviceStates) {
135 restoreDeviceStates=
false;
140 SinricProMessage* request =
new SinricProMessage(IF_WEBSOCKET, (
char*)payload);
141 DEBUG_SINRIC(
"[SinricPro:Websocket]: receiving data\r\n");
142 receiveQueue->push(request);