我正在制作一个需要 Web 界面的设备,以下是我设置 WiFi 的方式(受我的智能插头的启发):
- 开放AP供设备连接
- 使其自身为 6.6.6.6,以便客户端可以向该 IP 发送请求
- 客户提出请求
- 设备尝试以 STA 身份连接 WiFi
- 设备响应客户端的请求
我遇到了一个问题,当 STA成功连接到 WiFi 时,连接会重置(httpd_txrx:httpd_sock_err:发送错误:113),如果没有,它会正常工作。有没有什么办法可以解决这个问题?用于存储和响应请求的代码:
esp_err_t connect_post_handler(httpd_req_t *req)
{
size_t size = req->content_len;
if (size > 1024) {
// too big
const char* response = "Content too massive, but you know what else is massive?";
httpd_resp_send_err(req, HTTPD_400_BAD_REQUEST, response);
return ESP_OK;
}
char content[1024];
int bytes_read = httpd_req_recv(req, content, size);
if (bytes_read == 0) {
// connection closed
return ESP_ERR_HTTPD_INVALID_REQ;
}
cJSON* jsonData = cJSON_ParseWithLength(content, size);
if (jsonData == NULL) {
// json parsing failed, bad request
const char* response = "Bad JSON format";
httpd_resp_send_err(req, HTTPD_400_BAD_REQUEST, response);
return ESP_OK;
}
char* ssid = cJSON_GetObjectItem(jsonData, "ssid")->valuestring;
char* password = cJSON_GetObjectItem(jsonData, "password")->valuestring;
reconnect_callback(ssid, password);
httpd_req_async_handler_begin(req, &request); // <--- this!!!
cJSON_Delete(jsonData);
return ESP_OK;
}
void wifi_setup_handle_response(bool boolean, const char * response)
{
cJSON* response_data = cJSON_CreateObject();
cJSON_AddBoolToObject(response_data, "success", boolean);
cJSON_AddStringToObject(response_data, "message", response);
char* response_string = cJSON_Print(response_data);
printf(response_string);
if (response_string == NULL) {
// failed
ESP_LOGE(LOG_TAG, "Could not write wifi connect response to string");
httpd_resp_send_500(request);
cJSON_Delete(response_data);
return;
}
httpd_resp_send(request, response_string, strlen(response_string));
httpd_req_async_handler_complete(request);
free(response_string);
cJSON_Delete(response_data);
}
httpd_req_t* request;
有没有办法解决这个问题,或者这是一种糟糕的设置或使用方式,我应该使用蓝牙来设置(和使用)而不是 WiFi?