gpt4 book ai didi

https - 无法使用 WifiClientSecure 将 https 协议(protocol)与 ESP8266 连接

转载 作者:行者123 更新时间:2023-12-04 17:31:45 26 4
gpt4 key购买 nike

我正在尝试通过 unwiredlabs 获得 ESP8266 的位置.我跟着这个 introduction .
这是我的 arduino 代码:

#include <ESP8266HTTPClient.h>
#include <ArduinoJson.h>
#include "ESP8266WiFi.h"

char myssid[] = "Your wifi/hotspot name";
char mypass[] = "Your password";

const char* Host = "www.unwiredlabs.com";
String endpoint = "/v2/process.php";

String token = "d99cccda52ec0b";

String jsonString = "{\n";

double latitude = 0.0;
double longitude = 0.0;
double accuracy = 0.0;

void setup(){
Serial.begin(115200);

// Set WiFi to station mode and disconnect from an AP if it was previously connected
WiFi.mode(WIFI_STA);
WiFi.disconnect();
Serial.println("Setup done");

// We start by connecting to a WiFi network
Serial.print("Connecting to ");
Serial.println(myssid);
WiFi.begin(myssid, mypass);

while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(".");
}

void loop() {
char bssid[6];
DynamicJsonBuffer jsonBuffer;

// WiFi.scanNetworks will return the number of networks found
int n = WiFi.scanNetworks();
Serial.println("scan done");

if (n == 0 ) {
Serial.println("No networks available");
} else {
Serial.print(n);
Serial.println(" networks found");
}

// now build the jsonString...
jsonString = "{\n";
jsonString += "\"token\" : \"";
jsonString += token;
jsonString += "\",\n";
jsonString += "\"id\" : \"saikirandevice01\",\n";
jsonString += "\"wifi\": [\n";
for (int j = 0; j < n; ++j) {
jsonString += "{\n";
jsonString += "\"bssid\" : \"";
jsonString += (WiFi.BSSIDstr(j));
jsonString += "\",\n";
jsonString += "\"signal\": ";
jsonString += WiFi.RSSI(j);
jsonString += "\n";
if (j < n - 1) {
jsonString += "},\n";
} else {
jsonString += "}\n";
}
}
jsonString += ("]\n");
jsonString += ("}\n");
Serial.println(jsonString);

WiFiClientSecure client;

//Connect to the client and make the api call
Serial.println("Requesting URL: https://" + (String)Host + endpoint);
if (client.connect(Host, 443)) {
Serial.println("Connected");
client.println("POST " + endpoint + " HTTP/1.1");
client.println("Host: " + (String)Host);
client.println("Connection: close");
client.println("Content-Type: application/json");
client.println("User-Agent: Arduino/1.0");
client.print("Content-Length: ");
client.println(jsonString.length());
client.println();
client.print(jsonString);
delay(500);
}

//Read and parse all the lines of the reply from server
while (client.available()) {
String line = client.readStringUntil('\r');
JsonObject& root = jsonBuffer.parseObject(line);
if (root.success()) {
latitude = root["lat"];
longitude = root["lon"];
accuracy = root["accuracy"];

Serial.println();
Serial.print("Latitude = ");
Serial.println(latitude, 6);
Serial.print("Longitude = ");
Serial.println(longitude, 6);
Serial.print("Accuracy = ");
Serial.println(accuracy);
}
}

Serial.println("closing connection");
Serial.println();
client.stop();

delay(5000);
}

当代码已经刷到esp8266时,显示无法连接到 https://www.instructables.com/v2/process.php .

ESP串行输出:
... // some initial setup string
Requesting URL: https://unwiredlabs.com/v2/process.php
// if connected, "connected" was printed here, but not
closing connection

然后,我尝试使用 url https://unwiredlabs.com/v2/process.php在 Chrome 浏览器上。这是消息:
{
status: "error",
message: "Invalid request",
balance: 0,
help: "Check for misplaced commas and use double quotes to encapsulate strings"
}

这证明了这个 url 存在,但是当我尝试时 Postman , 这显示了:
Postman response

然后,我关掉了 SSL certificate verifycation在 postman 。它回复了 403 Forbidden错误。
所以我认为引起问题的原因是 WifiClientSecure的SSL证书验证.

任何人都可以帮忙吗?

最佳答案

SSL - 至少此代码尝试使用它的方式 - 需要您尝试连接的站点的指纹。在尝试连接到该站点之前,该代码需要告诉其客户端对象该站点的指纹。

步骤1:从站点手动检索指纹:
我浏览到 https://www.unwiredlabs.com在 Chrome 中复制站点证书,然后在 Windows 上的 git bash 中使用 openSSL 提取指纹:

openssl x509 -noout -fingerprint -sha1 -inform pem -in certificate-file.cer > fingerprint.txt

然后我编辑了生成的指纹.txt 文件,用空格替换每个“:”。

在网上搜索有关如何使用 Chrome 或您使用的任何浏览器复制引用证书的详细信息。

第二步:编辑代码将指纹添加到Sketch中:
我添加了常量'sslFingerprint',并在调用client.connect() 之前添加了对client.setFingerprint() 的调用。

然后我删除了与连接到站点无关的代码,创建了一个示例 Sketch 来说明与 unwiredlabs.com 的成功连接:
#include <ESP8266HTTPClient.h>
#include "ESP8266WiFi.h"

// The SSL Fingerprint of https://www.unwiredlabs.com
// Certificate expires ‎October ‎9, ‎2020
const char *sslFingerprint
= "C3 3E 2F 21 CB 15 4E 02 D5 27 E5 F6 EF FB 31 AE 91 51 A3 5D";

char myssid[] = "yourWiFiSSID";
char mypass[] = "yourWiFiPassword";

const char* Host = "www.unwiredlabs.com";
String endpoint = "/v2/process.php";

void setup() {
Serial.begin(9600);

// Set WiFi to station mode and disconnect from an AP if it was previously connected
WiFi.mode(WIFI_STA);
WiFi.disconnect();
Serial.println("Setup done");

// We start by connecting to a WiFi network
Serial.print("Connecting to ");
Serial.println(myssid);
WiFi.begin(myssid, mypass);

while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(".");
}

void loop() {
WiFiClientSecure client;

//Connect to the client and make the api call
Serial.println("Requesting URL: https://" + (String)Host + endpoint);
client.setFingerprint(sslFingerprint);
if (client.connect(Host, 443)) {
Serial.println("Connected");
}
Serial.println("closing connection");
Serial.println();
client.stop();

delay(5000);
}

在 Sparkfun ESP8266 Thing Dev 板上运行时,Sketch 会产生以下输出:
......
Requesting URL: https://www.unwiredlabs.com/v2/process.php
Connected
closing connection

关于https - 无法使用 WifiClientSecure 将 https 协议(protocol)与 ESP8266 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59005181/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com