我想使用 ArduiniWebsockets.h 建立从 ESP32 到安全 Websocket 服务器的连接。但是,我收到以下错误:
[ 59943][E][WiFiClientSecure.cpp:144] connect(): start_ssl_client: -1
[ 59944][E][WiFiClient.cpp:313] setSocketOption(): fail on 0, errno: 9, "Bad file number"
我设置了 CACert,并且 websocket 服务器与 chrome websocket 测试客户端配合使用。我还尝试使用 setInsecure() ,它没有改变结果或错误。 我的代码分为 wifi.cpp 和 websockets.cpp。这是我的 wifi.cpp:
#include <Arduino.h>
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include "websockets.h"
WiFiClientSecure wifiClient;
boolean connectWiFi(String ssid, String password)
{
Serial.println("Booting");
WiFi.begin(ssid.c_str(), password.c_str());
delay(500);
int attempts = 0;
while (WiFi.status() != WL_CONNECTED && attempts < 15)
{
delay(500);
Serial.print(".");
attempts++;
}
if (WiFi.status() == WL_CONNECTED)
{
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
wifiClient.setCACert(getCACert().c_str());
setupWebsocket();
return true;
}
else
{
Serial.println("");
Serial.println("Could not connect to WiFi");
return false;
}
}
还有 websockets.cpp:
#include <Arduino.h>
#include <ArduinoJson.h>
#include <ArduinoWebsockets.h>
#include <WiFi.h>
// TODO save websockets server adress in Preferences
const char *websockets_server_host = "domain"; // Enter server adress
const uint16_t websockets_server_port = 8080; // Enter server port
const char *websockets_path = "/";
using namespace websockets;
const char echo_org_ssl_ca_cert[] PROGMEM = "-----BEGIN CERTIFICATE-----\n"
"CERT\n"
"-----END CERTIFICATE-----\n";
void onMessageCallback(WebsocketsMessage message)
{
Serial.print("Got Message: ");
Serial.println(message.data());
handleWebsocketMessage(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!");
}
}
WebsocketsClient client;
bool setupWebsocket()
{
// 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);
client.setInsecure();
// Connect to server
bool connected = client.connectSecure(websockets_server_host, websockets_server_port, websockets_path);
if (connected)
{
Serial.println("Websocket connected!");
}
else
{
Serial.println("Not Connected!");
return false;
}
// Send a message
client.send("Hello Server");
// Send a ping
client.ping();
return true;
}
void loopWebsocket()
{
// let the websockets client check for incoming messages
if (client.available())
{
client.poll();
}
else
{
// if client is disconnected then try to reconnect again
Serial.println("Websocket disconnected");
setupWifi();
setupWebsocket();
}
delay(500);
}
void handleWebsocketMessage(String message)
{
Serial.println("Handling Websocket Message");
Serial.println(message);
handleMessageString(message, "websockets");
}
void sendWebsocketMessage(String message)
{
client.send(message);
}
String getCACert()
{
return echo_org_ssl_ca_cert;
}
这方面有任何更新吗? 我也有同样的问题