我的ESP32也是一个路由器。因此,如果我用我的手机连接到ESP32传播的WiFi,并使用浏览器调用IP地址和特殊路径,就会提供一个网站。这里显示一个按钮。到这一点为止,它运作得很好。现在,如果我点击该按钮,将发送一个HTTPS Web请求(方法:GET)到特殊机器。该机器回答并返回JSON。这可能需要几秒钟时间。从JSON字符串中提取一个值后,应该显示该值。
为了实现这一点,我正在使用以下库:
- ESPAsyncWebServer
- AsyncTCP
- WiFiClientSecure
- WiFi.h
- HTTPClient.h
我知道(通过另一个草图),最后三个可以正常工作。
不幸的是,当我点击按钮时,以下输出会显示在我的串行监视器上:
开始连接服务器...[HTTPS] 开始... 路径: https://192.168.4.101/api/unlock/generate_pin
[HTTPS] GET...
E (137906) task_wdt: 任务看门狗被触发。以下任务未能及时重置看门狗:
E (137906) task_wdt: - async_tcp (CPU 0/1)
E (137906) task_wdt: 当前正在运行的任务:
E (137906) task_wdt: CPU 0: IDLE0
E (137906) task_wdt: CPU 1: loopTask
E (137906) task_wdt: 中止。
PC 0x400e08af 上的 abort() 已被调用,核心 0
回溯:0x4008cc18:0x3ffbe170 0x4008ce49:0x3ffbe190 0x400e08af:0x3ffbe1b0 0x40084f21:0x3ffbe1d0 0x4016581b:0x3ffbc120 0x400e1c66:0x3ffbc140 0x4008ab21:0x3ffbc160 0x4008932d:0x3ffbc180
正在重新启动...
ets Jun 8 2016 00:22:57
rst:0xc (SW_CPU_RESET),boot:0x17 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0018,len:4
load:0x3fff001c,len:1044
load:0x40078000,len:8896
load:0x40080400,len:5816
entry 0x400806ac
串行初始化完成
有人知道正在发生什么以及如何解决这个问题吗?使GET请求得到正确发送/接收答案?
我正在使用Heltec WiFi Kit 32。
非常感谢每一个回答,提前致谢。
最好的问候
P.S .:请允许我最后添加我的代码:
#include <heltec.h>
#include "WiFi.h"
#include "ESPAsyncWebServer.h"
#include <WiFiClientSecure.h>
#include <HTTPClient.h>
const char* ssid = "MyWiFiSSID";
const char* password = "MyWiFiPW";
AsyncWebServer server(80);
void setup() {
Heltec.begin(true, false, true, true, 470E6);
WiFi.softAP(ssid, password);
IPAddress IP = WiFi.softAPIP();
Serial.print("AccessPoint IP address: ");
Serial.println(IP);
server.on("/hello", HTTP_GET, [](AsyncWebServerRequest *request){
request->send(200, "text/html", "<!DOCTYPE html><html><head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" charset=\"UTF-8\"><link rel=\"icon\" href=\"data:,\"><style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}.button { background-color: #4CAF50; border: none; color: white; padding: 16px 40px; text-decoration: none; font-size: 30px; margin: 2px; cursor: pointer;}</style></head><body><h1>Welcome to the Landing Page of the Web Server</h1><p><a href=\"/get_unlock_pin\"><button class=\"button\">Click Me</button></a></p></body></html>");
});
server.on("/get_unlock_pin", HTTP_GET, [](AsyncWebServerRequest *request){
String firstpartofrawhtmlcode = "<!DOCTYPE html><html><head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" charset=\"UTF-8\"><link rel=\"icon\" href=\"data:,\"><style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}.button { background-color: #4CAF50; border: none; color: white; padding: 16px 40px; text-decoration: none; font-size: 30px; margin: 2px; cursor: pointer;}</style></head><body><h2>Received Pin: </h2><h2 style=\"color: #FF0000\">";
String receivedPin = getPin("192.168.4.101");
String secondpartofrawhtmlcode = "</h2></body></html>";
String fullrawhtmlcode;
firstpartofrawhtmlcode = firstpartofrawhtmlcode.concat(receivedPin);
fullrawhtmlcode = firstpartofrawhtmlcode.concat(secondpartofrawhtmlcode);
request->send(200, "text/html", fullrawhtmlcode);
});
server.begin();
}
void loop() {
}
String getPin(String ip){
Serial.println("\nStarting connection to server...");
WiFiClientSecure *wificlient = new WiFiClientSecure;
HTTPClient https;
https.setAuthorization("MyUserName", "MyPassword");
String path = "https://" + ip + "/api/unlock/generate_pin";
Serial.print("[HTTPS] begin... Path: " + path + "\n");
if (https.begin(*wificlient, path)) {
Serial.print("[HTTPS] GET...\n");
int httpCode = https.GET();
if (httpCode > 0) {
Serial.printf("[HTTPS] GET... code: %d\n", httpCode);
if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY) {
String payload = https.getString();
Serial.println(payload);
//Extract Pin from JSON
String tmp = payload.substring(payload.indexOf(':'), payload.indexOf('}'));
String tmp2 = tmp.substring(tmp.indexOf('"')+1,tmp.lastIndexOf('"'));
if(tmp2.substring(0,1) == "-"){
return "-";
}else{
return tmp2;
}
}
} else {
Serial.printf("[HTTPS] GET... failed, error: %s\n", https.errorToString(httpCode).c_str());
}
https.end();
} else {
Serial.printf("[HTTPS] Unable to connect\n");
}
}