Запрос POST (HTTPClient) с ESP8266, не работающим на локальном хосте (код http = -1)
Я искал решение, но не смог его найти. Я хочу отправить почтовый запрос от ESP8266 по локальному API. Вот мой код:
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClient.h>
String ssid = "HUAWEI P30 lite";
String password = "testazerty";
String serverName = "http://192.168.56.1:3030/drink/voltron";
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
Serial.println("Connecting");
while(WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to WiFi network with IP Address: ");
Serial.println(WiFi.localIP());
}
void loop() {
if(WiFi.status()== WL_CONNECTED){
WiFiClient client;
HTTPClient http;
http.begin(client, serverName);
http.addHeader("Content-Type", "application/json");
int httpResponseCode = http.POST("{\"city\":\"toronto\"}");
Serial.print("HTTP Response code: ");
Serial.println(httpResponseCode);
http.end();
}
}
Мой компьютер и ESP8266 подключены к моей телефонной сети (HUAWEI).
192.168.56.1 — это IP-адрес моего компьютера.
API запущен, и я могу успешно отправить запрос от почтальона (см. изображение ниже).
В качестве http-кода всегда возвращается -1. Я активировал уровень отладки HTTP_CLIENT, вот что у меня на последовательном мониторе:
11:07:41.645 -> SDK:2.2.2-dev(38a443e)/Core:3.0.2=30002000/lwIP:STABLE-2_1_2_RELEASE/glue:1.2-48-g7421258/BearSSL:6105635
11:07:41.645 -> fpm close 1
11:07:41.645 -> mode : sta(30:83:98:b1:da:62)
11:07:41.645 -> add if0
11:07:41.645 -> Connecting
11:07:42.160 -> .....scandone
11:07:45.348 -> state: 0 -> 2 (b0)
11:07:45.348 -> .state: 2 -> 3 (0)
11:07:45.441 -> state: 3 -> 5 (10)
11:07:45.441 -> add 0
11:07:45.441 -> aid 6
11:07:45.441 -> cnt
11:07:45.441 ->
11:07:45.441 -> connected with HUAWEI P30 lite, channel 6
11:07:45.441 -> dhcp client start...
11:07:45.864 -> ....ip:192.168.43.88,mask:255.255.255.0,gw:192.168.43.1
11:07:47.870 -> .
11:07:47.870 -> Connected to WiFi network with IP Address: 192.168.43.88
11:07:47.870 -> [HTTP-Client][begin] url: http://192.168.56.1:3030/drink/voltron
11:07:47.870 -> [HTTP-Client][begin] host: 192.168.56.1 port: 3030 url: /drink/voltron
11:07:47.870 -> [HTTP-Client][sendRequest] type: 'POST' redirCount: 0
11:07:53.021 -> [HTTP-Client] failed connect to 192.168.56.1:3030
11:07:53.021 -> [HTTP-Client][returnError] error(-1): connection failed
11:07:53.021 -> HTTP Response code: -1
11:07:53.021 -> [HTTP-Client][end] tcp is closed
@Nicoji_, 👍-1
Обсуждение1 ответ
Лучший ответ:
TLDR:
Это проблема сети, а не проблемы программирования. Попробуйте изменить маску подсети на 255.255.0.0 в конфигурации маршрутизатора/сети или убедитесь, что они действительно подключены к одному и тому же маршрутизатору. Если используются разные маршрутизаторы, попробуйте изменить один из них на «Беспроводная точка доступа». конфигурация. Если вы не можете получить их в той же сети, вам придется предоставить доступ к вашему API в Интернете.
Длинная версия:
Вы находитесь в разных подсетях. IP-адрес вашего API — 192.168.56.1, IP-адрес вашего устройства — 192.168.43.88, но маска вашей подсети — 255.255.255.0. Это помещает эти устройства в отдельные подсети внутри сети.
В Интернете есть много сложных объяснений подсетей и масок подсетей. Я связал один из лучших ниже. Технически вы находитесь не просто в разных подсетях, а в разных сетях. У вас есть IP-адрес 192.xxx, что делает его сетью класса C. Это делает ваш шаблон адреса одним из «network.network.network.node». В зависимости от конфигурации вашего маршрутизатора или другого сетевого оборудования вы можете обновить его до сети класса B, настроив маску подсети на 255.255.0.0 ("network.network.node.node"). Адреса класса B могут потребовать значительной настройки с вашей стороны в зависимости от ваших конкретных обстоятельств. Используя маску подсети 255.255.0.0 для адреса класса B, вы классифицируете части IP-адреса .56.1 и .43.88 как относящиеся к одной сети И подсети. Если вы измените его на адресацию класса B без изменения подсети, .56 будет одной подсетью, а .43 будет другой подсетью.
Иногда эта адресация выполняется автоматически на основе установленного оборудования. Это особенно проблематично в домашних сетях, содержащих несколько беспроводных маршрутизаторов, но подключенных к одному и тому же модему. Многие домашние маршрутизаторы имеют функцию «Беспроводная точка доступа». параметр, который удаляет большую часть более сложной конфигурации маршрутизатора. Это может убедить ваш маршрутизатор (маршрутизаторы) подключить вас к той же подсети. Если это работает, теперь ваши устройства могут подключаться локально! Может потребоваться дополнительная настройка маршрутизатора, чтобы открыть порты для вашего API для входящих запросов из подсетей.
Если класс вашей сети определяется вашим интернет-провайдером, и вы не можете подключить свои устройства к той же сети, вы должны открыть свой API для доступа к сети Wild Wild Web :D Я бы посоветовал прочитать https://www.ionos.com /digitalguide/server/tools/free-dynamic-dns-providers-an-overview/ и выберите тот, который соответствует вашим потребностям. Это потребует расширенной настройки маршрутизатора для предоставления портов в Интернет. Пожалуйста, выберите службы динамического DNS, обеспечивающие защиту от DDOS. После того, как он будет раскрыт, ваш ESP8266 сможет атаковать ваш API, как и любой общедоступный API. Включите аутентификацию в свой API.
Ссылки:
- Объяснение подсети – http://www.steves-internet-guide.com/subnetting-subnet-masks-explained /
- Поставщики динамических DNS – https://www.ionos.com/digitalguide/server/tools /free-dynamic-dns-providers-an-обзор/
- Как подключить Wi-Fi Shield ESP-12E-ESP8266-UART-WIFI-Wireless-Shield к Arduino
- Как подключить ESP8266 с помощью адаптера ESP-01 к Arduino Uno?
- HTTP GET запрос с использованием Arduino Uno и ESP8266
- Как установить связь между веб-камерой и Arduino UNO и получать прямую трансляцию на мобильном телефоне с помощью ESP8266?
- ESP8266 - Один сервер, отправляющий данные нескольким клиентам
- Могу ли я использовать выход 3,3 В Arduino напрямую к esp8266?
- Чтение данных из Google Таблиц с помощью Nodemcu
- Проанализировать большой ответ json с помощью ESP8266
брандмауэр на ПК?, @Juraj
Я полностью отключил Защитник Windows, но результат тот же., @Nicoji_
Может ли ваш компьютер пинговать ESP32?, @Majenko
Я попытался сделать это, подключившись к моему домашнему маршрутизатору, и это сработало отлично! Проблема возникает из-за совместного использования Интернета с моим мобильным телефоном, но, по крайней мере, он может работать с маршрутизатором. Я посмотрел, и кажется, что это может быть из-за используемого протокола (IPv4/IPv6). [Здесь] (https://serverfault.com/questions/980367/post-requests-from-mobile-network-hotspot-or-not-always-fail) — вот что я нашел., @Nicoji_
localhost
- это само устройство... синоним 127.0.0.1... вместо этого вы хотели сказать "локальный хост"?, @jsotolaпопробуйте отключить брандмауэр Windows или добавить расширение, чтобы разрешить доступ, @ViPeR5000
Вы находитесь в разных подсетях. Ваш API — 192.168.56.1, ваше устройство — 192.168.43.88, но ваша маска подсети — 255.255.255.0. Это помещает эти устройства в отдельные подсети внутри сети. Попробуйте изменить маску подсети на 255.255.0.0. Ссылка: http://www.steves-internet-guide.com/subnetting-subnet-masks-explained/, @David R.