• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Нужна помощь Подскажите про сервер и клиент на esp8266

Dronvip

Member
В общем суть такая необходимо, чтобы сервер на esp принимал данные от клиентов на esp. Точку доступа должен организовать сервер (на крайняк один из клиентов). Но увы сервер работает норм, т.е. с телефона подключаюсь к его точке доступа и он норм отвечает на запросы и данные получает, но клиенты не могут подключится к серверу. Но стоит вынести точку доступа на отдельный модуль. который не является ни сервером ни клиентом (или подключить всех к роутеру), то все пашет шикарно.
Может я чего то не знаю про библиотеку ESP8266WiFi ? уже все что можно перерыл
вот скетчи мои

Код:
#include <ESP8266WiFi.h>
#include <Esp.h>
#include "DHT.h"
#include <Wire.h>
#include <EEPROM.h>
#include <Adafruit_BMP085.h>
#define DHTPIN 2     // what digital pin we're connected to
#define DHTTYPE DHT11   // DHT 11

//Adafruit_BMP085 bmp;
DHT dht(DHTPIN, DHTTYPE);
const char* ssid = "Master_Sensor_NET";
const char* password = "1234567Test";
const char* host = "192.168.4.1";

void setup() {
  Serial.begin(115200);
  delay(10);
  dht.begin();
  // We start by connecting to a WiFi network
  //WiFi.softAP(ssid, password);
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  //WiFi.softAP(ssid, password);
  Serial.println("AP");
  delay(5000);
  WiFi.begin(ssid, password);
  //WiFi.config(ip, gateway, subnet);
 
  //while (WiFi.status() != WL_CONNECTED) {
    delay(500);
   // Serial.print(".");
  //}

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

int value = 0;

void loop() {
  delay(5000);
  ++value;

  Serial.print("connecting to ");
  Serial.println(host);
 
  // Use WiFiClient class to create TCP connections
  WiFiClient client;
  const int httpPort = 80;
  if (!client.connect(host, httpPort)) {
    Serial.println("connection failed");
    return;
  }
  //---------------------------------------------------
  //-----Reading sensor--------------------------------
  // Sensor readings may also be up to 2 seconds 'old' ( its a very slow sensor)
  //float humidity = dht.readHumidity();
  // Read temperature as Celsius (the default)
  //float temperature = dht.readTemperature();
  //--------------------------------------------------
  // We now create a URI for the request
  String url = "/gpio/1";
  //url += " Temp_DHT="+String(temperature);
  //url += " Hum_DHT="+String(humidity);
    //url += " BMP_Temp:";
  //url += String(bmp.readTemperature());
  //url += String(bmp.readPressure());
  //url += " Altitude = ";
  //url += String(bmp.readAltitude());
  Serial.print("Requesting URL: ");
  Serial.println(url);
 
  // This will send the request to the server
  client.print(url);
  delay(10);
 
  // Read all the lines of the reply from server and print them to Serial
  while(client.available()){
    String line = client.readStringUntil('\r');
    Serial.print(line);
  }
 
  Serial.println();
  Serial.println("closing connection");
  //ESP.deepSleep(1800000000, RF_CAL);
}
Код:
#include <ESP8266WiFi.h>

const char* ssid = "Master_Sensor_NET";
const char* password = "1234567Test";

// Create an instance of the server
// specify the port to listen on as an argument

IPAddress ip(192, 168, 4, 128); //Node static IP
IPAddress gateway(192, 168, 4, 1);
IPAddress subnet(255, 255, 255, 0);
WiFiServer server(80);
void setup() {
  Serial.begin(115200);
  delay(10);
  WiFi.mode(WIFI_AP);
  WiFi.softAPConfig(gateway, gateway, IPAddress(255, 255, 255, 0));
  WiFi.softAP(ssid, password);
  //IPAddress test = WiFi.softAPIP();
  //WiFi.softAP(ssid, password);
  Serial.println("AP");
  delay(5000);
  // prepare GPIO2
  //pinMode(2, OUTPUT);
  //digitalWrite(2, 0);
 
  //WiFi.mode(WIFI_AP_STA);
  // Connect to WiFi network
  Serial.println();
  Serial.println();
  Serial.print("Connecting to \n");
  Serial.println(ssid);
 
  //WiFi.begin(ssid, password);
 
// while (WiFi.status() != WL_CONNECTED) {
  //  delay(500);
  //  Serial.print(".");
  //}
  Serial.println("\n");
  Serial.println("WiFi connected\n");
  Serial.println(String(server.status()));
  // Start the server
  server.begin();
  Serial.println("Server started\n");

  // Print the IP address
  Serial.println(WiFi.localIP());
  Serial.println(WiFi.softAPIP());
  Serial.println(String(server.status()));
}

void loop() {
  // Check if a client has connected
  WiFiClient client = server.available();
  if (!client) {
    return;
  }
 
  // Wait until the client sends some data
  Serial.println("new client\n");
  while(!client.available()){
    delay(1);
  }
 
  // Read the first line of the request
  String req = client.readStringUntil('\r');
  Serial.println(req);
  client.flush();
 
  // Match the request
  int val;
  if (req.indexOf("/gpio/0") != -1)
    val = 0;
  else if (req.indexOf("/gpio/1") != -1)
    val = 1;
  else {
    Serial.println("invalid request\n");
    client.stop();
    return;
  }

  // Set GPIO2 according to the request
  digitalWrite(12, val);
 
  client.flush();

  // Prepare the response
  String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>\r\nGPIO is now ";
  s += (val)?"high":"low";
  s += "</html>\n";

  // Send the response to the client
  client.print(s);
  delay(1);
  Serial.println("Client disonnected\n");

  // The client will actually be disconnected
  // when the function returns and 'client' object is detroyed
}
 

fandy

Member
Возьмите подключите esp со стандартной AT прошивкой к компьютеру и экспериментируйте. У меня модуль esp в режиме клиента не может подключиться к серверу на esp в режиме точки доступа. Почему - не знаю. Но если после входа в сеть на клиенте дать команду изменения Mac адреса (все равно текущего или по-умолчанию), то все срастается.
 

Atom

Member
Во первых нужно всегда держать в уме о необходимости MultiClient режима. Он активирован?

Во вторых, по умолчанию при активации точки включается dhcp. Не лишне посмотреть какой адрес принимает клиент.
 

Dronvip

Member
Во первых нужно всегда держать в уме о необходимости MultiClient режима. Он активирован?

Во вторых, по умолчанию при активации точки включается dhcp. Не лишне посмотреть какой адрес принимает клиент.
а можно поподробнее как правильно настроить точку доступа на esp чтобы сервер и клиент норм общались...
 

Dronvip

Member
Examples/ESP8266WiFi/ESP8266Multi. на него навешивается потом клиент.
не помогает.... сделал на одной плате сервер с точкой доступа
Код:
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>

/* Set these to your desired credentials. */
const char *ssid = "ESPap";
const char *password = "thereisnospoon";

ESP8266WebServer server(80);

/* Just a little test message.  Go to http://192.168.4.1 in a web browser
* connected to this access point to see it.
*/
void handleRoot() {
    server.send(200, "text/html", "<h1>You are connected</h1>");
}

void setup() {
    delay(1000);
    Serial.begin(115200);
    Serial.println();
    Serial.print("Configuring access point...");
    /* You can remove the password parameter if you want the AP to be open. */
    WiFi.softAP(ssid, password);

    IPAddress myIP = WiFi.softAPIP();
    Serial.print("AP IP address: ");
    Serial.println(myIP);
    server.on("/", handleRoot);
    server.begin();
    Serial.println("HTTP server started");
}

void loop() {
    server.handleClient();
}
и клиент на основе Examples/ESP8266WiFi/ESP8266Multi.
Код:
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>

ESP8266WiFiMulti wifiMulti;
const char* host = "192.168.4.1";
void setup() {
    Serial.begin(115200);
    delay(10);
   
    wifiMulti.addAP("ESPap", "thereisnospoon");

    Serial.println("Connecting Wifi...");
    if(wifiMulti.run() == WL_CONNECTED) {
        Serial.println("");
        Serial.println("WiFi connected");
        Serial.println("IP address: ");
        Serial.println(WiFi.localIP());
    }
    delay(5000);
}
int value = 0;
void loop() {
    if(wifiMulti.run() != WL_CONNECTED) {
        Serial.println("WiFi not connected!");
        delay(1000);
    }

  delay(5000);
  ++value;

  Serial.print("connecting to ");
  Serial.println(host);
 
  // Use WiFiClient class to create TCP connections
  WiFiClient client;
  const int httpPort = 80;
  if (!client.connect(host, httpPort)) {
    Serial.println("connection failed");
    return;
  }
 
  // We now create a URI for the request
  String url = "/";
 
  Serial.print("Requesting URL: ");
  Serial.println(url);
 
  // This will send the request to the server
  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "Connection: close\r\n\r\n");
  delay(10);
 
  // Read all the lines of the reply from server and print them to Serial
  while(client.available()){
    String line = client.readStringUntil('\r');
    Serial.print(line);
  }
 
  Serial.println();
  Serial.println("closing connection");
}

и все равно не конектится
 

NutsXXXL

New member
@Dronvip в начальном коде что-то мало WiFi.mode
мой пример такой примерно:

клиент:
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);

сервер:
IPAddress apIP(192, 168, 1, 1);
WiFi.mode(WIFI_AP);
WiFi.softAPConfig(apIP, apIP, IPAddress(255, 255, 255, 0));
WiFi.softAP("Server example");

то есть отличия есть и в коде клиента и сервера
apIP 192, 168, 1, 1 являться адресом и сервера и гейтвея
 

Atom

Member
Вы немного не то сделали. Multi - это свойство сервера, позволяюще нескольким клиентам без конкуренции иметь доступ к серверу. Стандартная шема подразумевает, что один клиент имеет дотуп к тушки сервера, а все остальные получают отказ. В этом случае нам не нужно нумеровать подключения и любой ответ сервера автоматически попадает нужному адресату. В Мулти шема другая: каждое соединение имеет список. И ответ должен идти только номеру из списка.
 

Dronvip

Member
@Dronvip в начальном коде что-то мало WiFi.mode
мой пример такой примерно:

клиент:
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);

сервер:
IPAddress apIP(192, 168, 1, 1);
WiFi.mode(WIFI_AP);
WiFi.softAPConfig(apIP, apIP, IPAddress(255, 255, 255, 0));
WiFi.softAP("Server example");

то есть отличия есть и в коде клиента и сервера
apIP 192, 168, 1, 1 являться адресом и сервера и гейтвея
Вы оказались правы...

есть еще небольшой вопрос... можно ли на одном модуле поднять точку доступа(1) и сервер, на втором поднять точку доступа(2) и подключится к точке (1), на третьем модуле подключиться к точке (2) и подключится к серверу на модуле 1
 

NutsXXXL

New member
@Dronvip ну это уже mesh - ячеистая топология то ..
можно как минимум свою программу написать для этого
 

alexgum

New member
Вы оказались правы...

есть еще небольшой вопрос... можно ли на одном модуле поднять точку доступа(1) и сервер, на втором поднять точку доступа(2) и подключится к точке (1), на третьем модуле подключиться к точке (2) и подключится к серверу на модуле 1

У меня та же проблема. Хочу у вас спросить, у вас получилось?
Не могли бы вы мне подсказать что и как?
 

Vlad-&-mir

New member
Возьмите подключите esp со стандартной AT прошивкой к компьютеру и экспериментируйте. У меня модуль esp в режиме клиента не может подключиться к серверу на esp в режиме точки доступа. Почему - не знаю. Но если после входа в сеть на клиенте дать команду изменения Mac адреса (все равно текущего или по-умолчанию), то все срастается.
Подтверждаю! Две ESP (сервер и клиент) подключенные к роутеру прекрасно общаются, а когда напрямую ESP к ESP, то подключаются, но клиент не коннектится к серверу.
Вопрос решается заменой МАК адреса, например, добавлением в скетч вот таких строчек:

Код:
extern "C" {
#include <cstdint>
#include "user_interface.h"
const  uint8_t mac[] = {0xFC, 0x95, 0xF2, 0x4E, 0x98, 0x0A};
}
bool changeMac(const uint8_t mac[6])
{
  return wifi_set_macaddr(STATION_IF, const_cast<uint8*>(mac));
}

Замену МАК адреса следует делать до инициализации WiFi
Код:
changeMac(mac);
WiFi.begin(ssid, password);
Источники: How to Change the MAC Address of ESP8266? и Set MAC address? · Issue #413 · esp8266/Arduino .
 
Сверху Снизу