• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

ESP8266 не хочет соединяться с компьютером в локальной сети ни через AT команды, ни после прошивки в Arduino IDE

HelpPlease

New member
Собственно, проблема такая: ESP должен соединяться с Wi-Fi и передавать на компьютер пару строк данных. Соединение с сетью проходит без проблем, а вот подключаться к компьютеру ESP не хочет (компьютер, естественно, подключен к тому же роутеру). Сервер организовываю с помощью socket test 3.0 (см. скрин), ввожу IP компьютера и порт, нажимаю "start listening". Вводимые AT команды для ESP можно посмотреть также на скриншоте (пробовал и через простой терминал CoolTerm, если это важно, единственное отличие - там после команды CIPSTART выводится ERROR 0, CLOSED). С CIPMUX=0 тоже пробовал, ошибка ровно та же (первый аргумент "0" убирал, само собой). SLEEP то же пробовал оставлять по умолчанию - результат одинаков всегда.

Что касается Socket test'а, то он работает - два компьютера связываются безо всякого бубна и обмениваются сообщениями. Поэтому я совершенно не понимаю, что мешает то же самое сделать ESP.

Отчаявшись, решил перепрошить модуль на более позднюю версию прошивки - совершенно ничего не изменилось.

Отчаявшись еще сильнее, скачал Arduino IDE и попробовал залить скетч WiFiClient:

#include <ESP8266WiFi.h>

#ifndef STASSID
#define STASSID "your-ssid"
#define STAPSK "your-password"
#endif

const char* ssid = STASSID;
const char* password = STAPSK;

const char* host = "djxmmx.net";
const uint16_t port = 17;

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

// We start by connecting to a WiFi network

Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);

/* Explicitly set the ESP8266 to be a WiFi-client, otherwise, it by default,
would try to act as both a client and an access-point and could cause
network-issues with your other WiFi-devices on your WiFi-network. */
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);

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

Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}

void loop() {
Serial.print("connecting to ");
Serial.print(host);
Serial.print(':');
Serial.println(port);

// Use WiFiClient class to create TCP connections
WiFiClient client;
if (!client.connect(host, port)) {
Serial.println("connection failed");
delay(5000);
return;
}

// This will send a string to the server
Serial.println("sending data to server");
if (client.connected()) {
client.println("hello from ESP8266");
}

// wait for data to be available
unsigned long timeout = millis();
while (client.available() == 0) {
if (millis() - timeout > 5000) {
Serial.println(">>> Client Timeout !");
client.stop();
delay(60000);
return;
}
}

// Read all the lines of the reply from server and print them to Serial
Serial.println("receiving from remote server");
// not testing 'client.connected()' since we do not need to send data here
while (client.available()) {
char ch = static_cast<char>(client.read());
Serial.print(ch);
}

// Close the connection
Serial.println();
Serial.println("closing connection");
client.stop();

delay(300000); // execute once every 5 minutes, don't flood remote service
}


Он заработал как по маслу (имя и пароль я взял для своей сети). Я подумал, что близок к успеху, поэтому, выкинув часть кода, решил опять попробовать подключиться:

#include <ESP8266WiFi.h>


const char* ssid = "Мое";
const char* password = "Тоже мое";

byte host[] = {192, 168, 1, 2};
const uint16_t port = 8888;

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

// We start by connecting to a WiFi network

Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);

/* Explicitly set the ESP8266 to be a WiFi-client, otherwise, it by default,
would try to act as both a client and an access-point and could cause
network-issues with your other WiFi-devices on your WiFi-network. */
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);

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

Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}

void loop() {
Serial.println("connecting");

// Use WiFiClient class to create TCP connections
WiFiClient client;
if (!client.connect(host, port)) {
Serial.println("connection failed");
delay(5000);
return;
}

// This will send a string to the server
Serial.println("sending data to server");
if (client.connected()) {
client.println("hello from ESP8266");
}

// Close the connection
Serial.println();
Serial.println("closing connection");
client.stop();

delay(60000);
}


Ничего не поменялось. В терминале выводится "connection failed", и так по кругу.

Я не знаю, может, сеть как-то не так настроена или славная десяточка спрятала какую-нибудь галочку конфиденциальности в своих настройках, но почему тогда компьютеры между собой соединяются спокойно?


Просьба к гуру сетевых технологий указать на варианты причин ошибки.

З. Ы. Порты тоже разные пробовал указывать, ничего не менялось
 

Вложения

  • 15.3 KB Просмотры: 20
  • 24.7 KB Просмотры: 12

CodeNameHawk

Moderator
Команда форума
Попробуйте просто в компе с браузера зайти по адресу 192,168,1,2 или какой там адрес получила есп.
У вас не видно, что бы вы запустили на есп сервер.
Попробуйте пример сервера из ардуиноиде.
 
Последнее редактирование:

HelpPlease

New member
ESP выступает в роли клиента, компьютер - сервер. AT командами пробовал сделать сервер из ESP (чисто из интереса). Пишет OK, но с компьютера через Socket test не подключается

192.168.1.2 - это адрес компьютера
 

CodeNameHawk

Moderator
Команда форума
компьютер - сервер
Какой сервер? Как его запустили?
Для начала возьмите простой пример web clienta и проверьте работает ли он через интернет, через 80 порт.
И показывайте скриншотами все выводы с сериал.
 

HelpPlease

New member
Какой сервер? Как его запустили?
Таки я же сказал, программа Socket test, первый скрин в первом же сообщении Пробовал через нее один компьютер настраивать как клиент, другой - как сервер, обмен идет, а с ESP так не получается по какой-то причине.

Для начала возьмите простой пример web clienta и проверьте работает ли он через интернет, через 80 порт.
Простой web client на ESP из примеров ардуины работает, тоже в первом сообщении об этом писал, но там был порт не 80, а 17. Код примера еще раз скопирую:
Код:
#include <ESP8266WiFi.h>

#ifndef STASSID
#define STASSID "your-ssid"
#define STAPSK "your-password"
#endif

const char* ssid = STASSID;
const char* password = STAPSK;

const char* host = "djxmmx.net";
const uint16_t port = 17;

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

// We start by connecting to a WiFi network

Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);

/* Explicitly set the ESP8266 to be a WiFi-client, otherwise, it by default,
would try to act as both a client and an access-point and could cause
network-issues with your other WiFi-devices on your WiFi-network. */
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);

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

Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}

void loop() {
Serial.print("connecting to ");
Serial.print(host);
Serial.print(':');
Serial.println(port);

// Use WiFiClient class to create TCP connections
WiFiClient client;
if (!client.connect(host, port)) {
Serial.println("connection failed");
delay(5000);
return;
}

// This will send a string to the server
Serial.println("sending data to server");
if (client.connected()) {
client.println("hello from ESP8266");
}

// wait for data to be available
unsigned long timeout = millis();
while (client.available() == 0) {
if (millis() - timeout > 5000) {
Serial.println(">>> Client Timeout !");
client.stop();
delay(60000);
return;
}
}

// Read all the lines of the reply from server and print them to Serial
Serial.println("receiving from remote server");
// not testing 'client.connected()' since we do not need to send data here
while (client.available()) {
char ch = static_cast<char>(client.read());
Serial.print(ch);
}

// Close the connection
Serial.println();
Serial.println("closing connection");
client.stop();

delay(300000); // execute once every 5 minutes, don't flood remote service
}
 

CodeNameHawk

Moderator
Команда форума
Таки я же сказал, программа Socket test
Судя по названию это программа проверки соединения по Socket, так почему вы подключаетесь при помощи Web Client и ожидаете, что это будет работать?
Ищите Socket Client для есп и тогда пробуйте.
Есть например такое https://github.com/Links2004/arduinoWebSockets я не пробовал.
 

HelpPlease

New member
Судя по названию это программа проверки соединения по Socket, так почему вы подключаетесь при помощи Web Client и ожидаете, что это будет работать?
Я пробовал изначально работать AT командами, как показано здесь https://habr.com/ru/post/362623/. Автор поста использует эту программу и безо всяких проблем общается с ESP. Я решил это повторить, но CIPSTART выдает ERROR CLOSED, тогда я после долгих и бесплодных поисков ошибки решил запрограммировать через Arduino IDE аналогичное действие, но ESP все так же не хочет подключаться, при этом компьютеры между собой через эту программу спокойно обмениваются сообщениями
За ссылку спасибо, сегодня поковыряюсь
 

HelpPlease

New member
Проверил работу модуля у товарища, у него все работает адекватно. Соединение с Socket test происходит, модуль отправляет/принимает сообщения, в командной строке пинг проходит.

У меня же модуль даже не пингуется через командную строку. По всей видимости, есть какая-то проблема в роутере или компьютере, но не могу понять какая
 
Сверху Снизу