Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Cannot connect to Socket.IO serve #866

Open
Xarbenence opened this issue Jan 23, 2024 · 1 comment
Open

Cannot connect to Socket.IO serve #866

Xarbenence opened this issue Jan 23, 2024 · 1 comment

Comments

@Xarbenence
Copy link

Xarbenence commented Jan 23, 2024

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);
}

`

@shmuliko
Copy link

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...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants