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";
68 headers +=
"ip:" + WiFi.localIP().toString() +
"\r\n";
69 headers +=
"mac:" + WiFi.macAddress() +
"\r\n";
71 headers +=
"platform:ESP8266\r\n";
74 headers +=
"platform:ESP32\r\n";
76 headers +=
"version:" + String(SINRICPRO_VERSION);
77 DEBUG_SINRIC(
"[SinricPro:Websocket]: headers: \r\n%s\r\n", headers.c_str());
78 webSocket.setExtraHeaders(headers.c_str());
81 websocketListener::websocketListener() : _isConnected(false) {}
83 websocketListener::~websocketListener() {
87 void websocketListener::begin(String server, String socketAuthToken, String deviceIds, SinricProQueue_t* receiveQueue) {
91 this->receiveQueue = receiveQueue;
92 this->socketAuthToken = socketAuthToken;
93 this->deviceIds = deviceIds;
96 DEBUG_SINRIC(
"[SinricPro:Websocket]: Connecting to WebSocket Server using SSL (%s)\r\n", server.c_str());
98 DEBUG_SINRIC(
"[SinricPro:Websocket]: Connecting to WebSocket Server (%s)\r\n", server.c_str());
105 webSocket.onEvent([&](WStype_t type, uint8_t * payload,
size_t length) { webSocketEvent(type, payload, length); });
106 webSocket.enableHeartbeat(WEBSOCKET_PING_INTERVAL, WEBSOCKET_PING_TIMEOUT, WEBSOCKET_RETRY_COUNT);
109 webSocket.beginSSL(server, SINRICPRO_SERVER_SSL_PORT,
"/");
111 webSocket.begin(server, SINRICPRO_SERVER_PORT,
"/");
115 void websocketListener::handle() {
119 void websocketListener::stop() {
121 webSocket.disconnect();
126 void websocketListener::sendMessage(String &message) {
127 webSocket.sendTXT(message);
131 void websocketListener::webSocketEvent(WStype_t type, uint8_t * payload,
size_t length)
134 case WStype_DISCONNECTED:
136 DEBUG_SINRIC(
"[SinricPro:Websocket]: disconnected\r\n");
137 if (_wsDisconnectedCb) _wsDisconnectedCb();
138 _isConnected =
false;
141 case WStype_CONNECTED:
143 DEBUG_SINRIC(
"[SinricPro:Websocket]: connected\r\n");
144 if (_wsConnectedCb) _wsConnectedCb();
145 if (restoreDeviceStates) {
146 restoreDeviceStates=
false;
151 SinricProMessage* request =
new SinricProMessage(IF_WEBSOCKET, (
char*)payload);
152 DEBUG_SINRIC(
"[SinricPro:Websocket]: receiving data\r\n");
153 receiveQueue->push(request);