ESP32 HTTPS POST JSON to AWS



我试图通过HTTPS发布一些数据到AWS,但似乎没有到达那里。

设置主机为服务器地址和路径到/prod该方法还不需要身份验证。当我连接的时候,它就死机了,没有反应,尽管说这是有联系的

还尝试不使用path并设置主机的完整路径

不知道为什么会这样,我试了两种方法:

void postToAmazonSecure(String jsonToSend){
WiFiClientSecure client;

Serial.print("connecting to : '");
Serial.print(emonDataAPI);
Serial.println("'");
Serial.println(emonDataAPI.c_str());
client.connect(emonDataAPI.c_str(), 443);

Serial.print("requesting URL: '");
Serial.print(emonDataAPI);
Serial.println("'");
String requestString = String("POST ") + emonDataAPIPath + " HTTP/1.1rn" +
"Host: " + emonDataAPI + "rn" +
"Connection: closern" +
"Content-Type: application/json" +
//"Authorization: Bearer " + authorization_code + "rn" +
"Content-Length: " + jsonToSend.length() + "rn" +
"rn" +
jsonToSend + "rn";
Serial.println(requestString);
client.print(requestString);

Serial.println("request sent");
unsigned long timeout = millis();
while (client.available() == 0) {
if (millis() - timeout > 5000) {
Serial.println(">>> Client Timeout !");
client.stop();
return;
}
}
}
void postSecure(String jsonToSend){
WiFiClientSecure client;
Serial.print("connect: "); Serial.println(emonDataAPI);
while ( ! client.connect(emonDataAPI.c_str(), 443)) {
Serial.print(".");
}
Serial.println("Connected");
String msg = "POST " + emonDataAPIPath + " HTTP/1.1rn"
"Host: " + emonDataAPI + "rn"
"Content-Type: application/jsonrn"
"Content-Length: " + jsonToSend.length() + "rn"
"rn" + jsonToSend;

client.print(msg);
Serial.print(msg);

Serial.print("n*** Request sent, receiving response...");
while (!!!client.available()) {
delay(50);
Serial.print(".");
}

Serial.println();
Serial.println("Got response");  
while(client.available()){
Serial.write(client.read());
}
Serial.println(); Serial.println("closing connection");
client.stop();
}

您在Content-Type行末尾忘记了rn。应该是:

"Content-Type: application/jsonrn" +

您也没有向WiFiClientSecure提供指纹或证书,以便它可以验证您连接到的服务器。这也会使您的代码无法工作。您应该为保护您试图连接到的端点的证书链提供根证书:

const char* test_root_ca= 
"-----BEGIN CERTIFICATE-----n" 
...
"-----END CERTIFICATE-----n";

...
client.setCACert(test_root_ca);
client.connect(emonDataAPI.c_str(), 443);

您可以在WiFiClientSecure库示例中找到更完整的示例。

您也可以查看WiFiClientSecure的README以获取更多详细信息。

没有根证书,WiFiClientSecure不能验证您所连接的服务器的身份。Windows、Linux和macOS系统都可以自动处理这个问题;这样做的开销超出了ESP32的操作环境所能承受的范围。

你可以告诉WiFiClientSecure不要费心验证服务器,但这样做你也在说"我并不真正关心安全"。你可以在调试时这样做,但是把它留在实际使用的代码中是一种非常糟糕和危险的做法。

client.setInsecure();
client.connect(emonDataAPI.c_str(), 443);

这些类型的错误是为什么你几乎总是使用像HTTPClient这样的库而不是自己实现HTTP(S)的一个重要原因。

最新更新