PlatformIO 安全 WebSocket 客户端

问题描述 投票:0回答:1

我想使用 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;
}
c++ websocket esp32 platformio
1个回答
0
投票

这方面有任何更新吗? 我也有同样的问题

© www.soinside.com 2019 - 2024. All rights reserved.