Node.js Can';t将ESP32连接到部署到Heroku的websocket服务器
这是我的ESP32代码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
#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