Node.js Can';t将ESP32连接到部署到Heroku的websocket服务器

Node.js Can';t将ESP32连接到部署到Heroku的websocket服务器,node.js,http,heroku,websocket,esp32,Node.js,Http,Heroku,Websocket,Esp32,这是我的ESP32代码 #include <WiFi.h> #include <WebSocketClient.h> #include <ArduinoJson.h> const char* ssid = "###"; const char* password = "###"; char path[] = "/"; char host[] = "https://hidden-t

这是我的ESP32代码

#include <WiFi.h>
#include <WebSocketClient.h>
#include <ArduinoJson.h> 
const char* ssid     = "###";
const char* password = "###";
 
char path[] = "/";
char host[] = "https://hidden-thicket-03510.herokuapp.com";
 
WebSocketClient webSocketClient;
WiFiClient client;

int timer=0;
void connnect(){
   if (client.connect(host,443)) {
    Serial.println("Connected");
  } else {
    Serial.println("Connection failed.");
  }
 
  webSocketClient.path = path;
  webSocketClient.host = host;
  if (webSocketClient.handshake(client)) {
    Serial.println("Handshake successful");
  } else {
    Serial.println("Handshake failed.");
  }
}
void setup() {
  Serial.begin(115200);
 
  WiFi.begin(ssid, password);
 
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
 
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
 
  delay(5000);
 
 connnect();

 if (client.connected()) {
   webSocketClient.sendData("Info to be echoed back");
 }
 
}
 
void loop() {
  String data;
  
    if (client.connected()) {

    webSocketClient.getData(data);
    Serial.println(data);
    int data_len = data.length() + 1; 
    char char_array[data_len];
    data.toCharArray(char_array, data_len);
    StaticJsonDocument<1200> doc;

    DeserializationError err=deserializeJson(doc,char_array);

    const char* a=doc["message"];
    
    if (data_len > 1) {
      Serial.print("Received data: ");
      Serial.println(a);
    }
    
  } else {
    Serial.println("Client disconnected.");
    connnect();
  }
 
  delay(3000);
 
}

当我在PC上本地运行服务器时,ESP32将连接到服务器。但是,当我将服务器部署到Heroku并尝试连接ESP32握手时,会出现失败。这是我得到的串行监视器的输出

Connected
Waiting...
Waiting...
Waiting...
Handshake failed.
Client disconnected.
Connected
Waiting...
Waiting...
Waiting...
Handshake failed.
Client disconnected.
Connected
Waiting...
Waiting...
Waiting...
Waiting...
Waiting...
Handshake failed.
部署到服务器没有问题,因为当我使用nodejs websocket客户机(来自repo的示例)时,它成功地连接到部署的Heroku服务器。我已尝试将端口号更改为80并使用'http://hidden-thicket-03510.herokuapp.com“在Arduino脚本上,但仍然不起作用

为什么我的ESP32能够连接到本地运行的服务器,但部署到服务器时却无法连接

另外,如果你想测试一下,上面的服务器仍然在工作


任何帮助都将不胜感激

这是因为您正在连接到TLS端点,但WiFiClient类(用于创建基础连接)没有实现TLS。WebSocketClient类期望接收一个工作数据管道,但它获得一个TCP连接,必须在其中设置TLS

Espressif提供了TCP+TLS实现,因此请使用它而不是WiFiClient

请注意,与garden variety桌面OS-s和浏览器不同,ESP默认情况下不包含任何根证书。因此,它无法验证远程服务器,将拒绝连接。您必须手动将服务器的证书添加到您的ESP32项目中—CA、intermediate或leaf(CA可能是最佳选择)。关于如何做到这一点的文档在项目的自述文件中

要获取与服务器关联的证书,我使用
openssl

openssl s_client -showcerts -connect hidden-thicket-03510.herokuapp.com:443
我看到您的CA证书可能是名为“DigiCert High Assurance EV Root CA”的证书。复制输出中的最后一个PEM块(base64,以
----开始证书------
开始,以
----结束证书------
结束,包括在内),将其粘贴到文件“ca.PEM”中,并按照说明将其添加到ESP项目中

要验证此文件是否为CA证书,请运行

openssl x509 -in ca.pem -text -noout

输出应包括
主题:C=US,O=DigiCert Inc,OU=www.DigiCert.com,CN=DigiCert高保证EV根CA

我会检查并查看。谢谢你的回答我对此有一些问题,我已经把它作为一个问题发布了。你能看一下吗。链接是:你能解释一下“以…开头的base 64”是什么意思吗。谢谢你这是看起来像这样的东西。它是二进制数据,base64编码为可表示为文本<代码>miidxtccaq2gawibagqqxcjmolqjupc3nRkyldzanbgkqhkig9w0baqufadbs mqswcqydvqgewjvuzevmbGa1echmmrglnaunlcnqgsw5jmrkwwydvqlexb3
openssl x509 -in ca.pem -text -noout