arduinoWebSockets
arduinoWebSockets copied to clipboard
Cannot connect to Socket.IO serve
Hello,
I am trying to connect to a Socket.IO server. I have tried a lot of different things. Interestingly enough, I am able to connect to the server using the ArduinoWebSockets library, and I can successfully ping the server, but the ESP32 does not receive any events or messages.
On the other hand, when trying to use this library to connect to the server using the SocketIOClient class, I cannot even establish a connection. I just get the "[IOc] Disconnected!" event printout over and over again.
Here is my code, for reference:
` #include <Arduino.h> #include <WiFi.h> #include <WiFiMulti.h> #include <WiFiClientSecure.h> #include <ArduinoJson.h> #include <WebSocketsClient.h> #include <SocketIOclient.h> #include <time.h>
WiFiMulti WiFiMulti; SocketIOclient socketIO;
#define USE_SERIAL Serial
const char* ssid = "hotspot"; // Replace with your WiFi SSID const char* password = "easierpass"; // Replace with your WiFi Password const char* host = "www.my-smart-inter.com"; // Server host const uint16_t port = 443; // Server port (typically 443 for HTTPS)
// SSL Certificate
const char echo_org_ssl_ca_cert[] PROGMEM =
"-----BEGIN CERTIFICATE-----\n"
"MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw\n"
"TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh\n"
"cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4\n"
"WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu\n"
"ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY\n"
"MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc\n"
"h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+\n"
"0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U\n"
"A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW\n"
"T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH\n"
"B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC\n"
"B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv\n"
"KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn\n"
"OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn\n"
"jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw\n"
"qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI\n"
"rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV\n"
"HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq\n"
"hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL\n"
"ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ\n"
"3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK\n"
"NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5\n"
"ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur\n"
"TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC\n"
"jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc\n"
"oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq\n"
"4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA\n"
"mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d\n"
"emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc=\n"
"-----END CERTIFICATE-----\n";
// Event handler for Socket.IO events void socketIOEvent(socketIOmessageType_t type, uint8_t * payload, size_t length) { switch(type) { case sIOtype_DISCONNECT: USE_SERIAL.printf("[IOc] Disconnected!\n"); break; case sIOtype_CONNECT: USE_SERIAL.printf("[IOc] Connected to url: %s\n", payload); socketIO.send(sIOtype_CONNECT, "/"); break; case sIOtype_EVENT: // Handle events here // For example, if an event with a specific name is received, you can respond accordingly USE_SERIAL.printf("[IOc] Event received: %s\n", payload); break; // Add other cases if necessary } }
void setup() { USE_SERIAL.begin(115200); USE_SERIAL.setDebugOutput(true); USE_SERIAL.println();
WiFiMulti.addAP(ssid, password);
while(WiFiMulti.run() != WL_CONNECTED) {
delay(100);
}
USE_SERIAL.printf("[SETUP] WiFi Connected\n");
// Initialize NTP
configTime(0, 0, "pool.ntp.org", "time.nist.gov");
// Wait until time is synchronized
Serial.print("Synchronizing time");
struct tm timeinfo;
while (!getLocalTime(&timeinfo)) {
Serial.print(".");
delay(1000);
}
Serial.println("Time synchronized");
// Display the current time
char timeString[64];
strftime(timeString, sizeof(timeString), "%Y-%m-%d %H:%M:%S", &timeinfo);
Serial.print("Current time: ");
Serial.println(timeString);
// Set SSL certificate
WiFiClientSecure *client = new WiFiClientSecure();
client->setCACert(echo_org_ssl_ca_cert);
// Connect to the Socket.IO server
socketIO.beginSSL(host, port, "/socket.io/?EIO=4&transport=websocket", "", 0, 0, 0);
// Attach event handler
socketIO.onEvent(socketIOEvent);
}
void loop() { socketIO.loop(); delay(100); // Adjust delay as needed } `
Below is the code that successfully connects but does not receive any events or messages
`
#include <ArduinoWebsockets.h> #include <WiFi.h> #include <time.h> #include <ArduinoJson.h>
#define RELAY 14 #define BUZZER 25
// Define variables to track ping timestamp and timeout duration unsigned long lastPingTime = 0; const unsigned long pingInterval = 5000; // Ping every 5 seconds
using namespace websockets; const char* ssid = "hotspot"; //Enter SSID const char* password = "easierpass"; //Enter Password
const char* websockets_connection_string = "wss://www.my-smart-inter.com/socket.io/?EIO=4&transport=websocket"; //Enter server adress
const char echo_org_ssl_ca_cert[] PROGMEM =
"-----BEGIN CERTIFICATE-----\n"
"MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw\n"
"TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh\n"
"cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4\n"
"WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu\n"
"ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY\n"
"MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc\n"
"h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+\n"
"0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U\n"
"A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW\n"
"T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH\n"
"B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC\n"
"B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv\n"
"KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn\n"
"OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn\n"
"jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw\n"
"qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI\n"
"rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV\n"
"HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq\n"
"hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL\n"
"ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ\n"
"3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK\n"
"NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5\n"
"ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur\n"
"TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC\n"
"jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc\n"
"oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq\n"
"4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA\n"
"mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d\n"
"emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc=\n"
"-----END CERTIFICATE-----\n";
struct doorbell_flags { uint32_t last_ring_time = 0; bool ring_flag = 0; bool client_connected = 0; };
doorbell_flags db_flags; WebsocketsClient client;
/* Function Prototypes */
void ringDoorbell() { DynamicJsonDocument doc(1024); doc["ring_doorbell"] = true;
// Serialize the JSON object into a string
String message;
serializeJson(doc, message);
// Send the message to the server
if (client.send(message)) {
Serial.println("Ringing doorbell!");
} else {
Serial.println("Failed to ring the doorbell.");
}
db_flags.last_ring_time = millis();
db_flags.client_connected = 0;
}
void sendPing(uint32_t currentTime) { // Check if it's time to send a ping if (currentTime - lastPingTime >= pingInterval) { // Send a ping message client.ping(); Serial.println("Sent ping to server at " + String(currentTime)); lastPingTime = currentTime; // Update the last ping time } }
void onMessageCallback(WebsocketsMessage message) { Serial.print("Got Message: "); Serial.println(message.data()); }
void onEventsCallback(WebsocketsEvent event, String data) { if(event == WebsocketsEvent::ConnectionOpened) { Serial.println("Connnection Opened"); } else if(event == WebsocketsEvent::ConnectionClosed) { Serial.println("Connnection Closed"); } else if(event == WebsocketsEvent::GotPing) { Serial.println("Got a Ping!"); } else if(event == WebsocketsEvent::GotPong) { Serial.println("Got a Pong!"); } else{ Serial.println("Some other event occurred"); } }
bool connected = 0; void setup() { Serial.begin(115200);
pinMode(2,OUTPUT); // onboard LED
pinMode(RELAY,OUTPUT); // pin for triggering relay
pinMode(BUZZER,INPUT_PULLDOWN); // pin for reading buzzer (use internal pulldown)
digitalWrite(RELAY,1); // make sure relay is open
pinMode(26,INPUT_PULLDOWN);
// Connect to wifi
WiFi.begin(ssid, password);
// Wait some time to connect to wifi
while( WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(1000);
}
Serial.println("WiFi Connected");
// Initialize NTP
configTime(0, 0, "pool.ntp.org", "time.nist.gov");
// Wait until time is synchronized
Serial.print("Synchronizing time");
struct tm timeinfo;
while (!getLocalTime(&timeinfo)) {
Serial.print(".");
delay(1000);
}
Serial.println("Time synchronized");
// Display the current time
char timeString[64];
strftime(timeString, sizeof(timeString), "%Y-%m-%d %H:%M:%S", &timeinfo);
Serial.print("Current time: ");
Serial.println(timeString);
// run callback when messages are received
client.onMessage(onMessageCallback);
// run callback when events are occuring
client.onEvent(onEventsCallback);
// Before connecting, set the ssl fingerprint of the server
client.setCACert(echo_org_ssl_ca_cert);
// Connect to server
client.connect(websockets_connection_string);
if(client.available()){
connected = 1;
}
// Send a message
client.send("Hello Server");
// Send a ping
client.ping();
}
uint32_t cntr = 0; char buf[100];
void loop() { cntr ++; db_flags.client_connected = client.available(); sprintf(buf,"Cntr: %d, Connection Status: %d",cntr,db_flags.client_connected); Serial.println(buf); client.poll(); if(!db_flags.client_connected){ client.connect(websockets_connection_string); // reconnect Serial.println("reconnected"); } sendPing(millis()); if(digitalRead(BUZZER)){ ringDoorbell(); } delay(100); }
`
First: try connecting to the socketIO server via Postman. and add events to listen go to settings tab for postman, and try with version 2 too. (see the "handshake path" for v2)
Final: don't upload certificates to the public...