Хочу сделать настройку IP адреса, но есть проблемы

arduino nano, w5500
Опишу проблему: связь с устройством с 2 пк по кабелю по локальной сети проходит четко. Но с телефона и с пк через wifi не загружается сайт… причем именно с моим кодом. а оригинал работает на все 100… почему так?

проблема 100% в этом куске кода:

byte dataArray_reads[4]={192,168,2,177};
byte dataArray_read[4]={dataArray_reads[0],dataArray_reads[1],dataArray_reads[2],dataArray_reads[3]};
EthernetServer server(80);
 
void setup() {
  pinMode(3, INPUT);
  if (EEPROM.read(10) != 51) { // первый запуск
    EEPROM.put(10, 51);    // записали ключ
    EEPROM.put(0, dataArray_read);    // записали стандартный ip 
  }
  EEPROM.get(0, dataArray_read);
  IPAddress ip(dataArray_read[0],dataArray_read[1],dataArray_read[2],dataArray_read[3]);
  delay(3000);

  Serial.begin(9600);
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("IP: ");
  Serial.println(Ethernet.localIP());

Оригинал работает на все 100%, и вот как он выглядит:

#include <SPI.h>
#include <Ethernet.h>
 
  byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
  IPAddress ip(10,0,0,177);
  EthernetServer server(80);
 
void setup() { 
  Serial.begin(9600);
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("IP: ");
  Serial.println(Ethernet.localIP());
}

Весь мой код:

#include <SPI.h>
#include <Ethernet.h>
#include <EEPROM.h>
byte mac[] = { 0xD5, 0xAD, 0xB6, 0xE6, 0xFE, 0xD0 };
 /**Стандартный IP адрес**/
byte ipUp =0;
int buttonState = 0; 
byte dataArray_reads[4]={192,168,2,177};
byte dataArray_read[4]={dataArray_reads[0],dataArray_reads[1],dataArray_reads[2],dataArray_reads[3]};
EthernetServer server(80);
 
void setup() {
  pinMode(3, INPUT);
  if (EEPROM.read(10) != 50) { // первый запуск
    EEPROM.put(10, 50);    // записали ключ
    EEPROM.put(0, dataArray_read);    // записали ключ
  }
  EEPROM.get(0, dataArray_read);
  IPAddress ip(dataArray_read[0],dataArray_read[1],dataArray_read[2],dataArray_read[3]);
  delay(50);

  Serial.begin(9600);
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("IP: ");
  Serial.println(Ethernet.localIP());
} 
void loop() {
  if(ipUp==1){
    byte ips[4]={192,168,2,17};
    EEPROM.put(0, ips);
    ipUp=0;delay(50);
asm volatile("jmp 0x00");
  }
  //Сброс на заводские настройки 
  buttonState = digitalRead(3);
  // если нажата, то buttonState будет HIGH:
  if (buttonState == HIGH) {
    delay(50);
    //Serial.println(dataArray_reads[0]);Serial.println(dataArray_reads[1]);Serial.println(dataArray_reads[2]);Serial.println(dataArray_reads[3]);
    EEPROM.put(0, dataArray_reads);
    delay(100);
    asm volatile("jmp 0x00");
  }
  
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
    boolean ok = true;
 
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
 
        if (c == '\n' && ok) {
 
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html><head><meta charset='UTF-8'><title>Привет !!!</title></head><body>Привет</body></html>");
          //client.println("<html><meta charset='UTF-8'>");
 
          //client.println("<h1>Привет Youtube!!!</h1>");
 
          //client.println("</html>");
 
          break;
        }
        if (c == '\n'){ok = true;}else if(c != '\r'){ok = false;}
      }
    }
 
    delay(1);
    client.stop();
    Serial.println("client disconnected");
  }
}



Что показывает ping 192.168.2.177 ?

Обмен пакетами с 192.168.2.177 по с 32 байтами данных:
Ответ от 192.168.2.177: число байт=32 время<1мс TTL=128
Ответ от 192.168.2.177: число байт=32 время<1мс TTL=128
Ответ от 192.168.2.177: число байт=32 время<1мс TTL=128
Ответ от 192.168.2.177: число байт=32 время<1мс TTL=128

Статистика Ping для 192.168.2.177:
    Пакетов: отправлено = 4, получено = 4, потеряно = 0
    (0% потерь)
Приблизительное время приема-передачи в мс:
    Минимальное = 0мсек, Максимальное = 0 мсек, Среднее = 0 мсек

Значит W5500 сконфигурирован нормально.

ping с телефона при моем скетче:

Спойлер

ping с телефона при оригинальном скетче:

Спойлер

Ничего не понимаю.

На хостах, которые не могут пропинговать, адреса из той же подсети, что и на тех, что могут?

В инициализации W5500 криминала я не вижу в обоих вариантах.

Может на роутере стоит что-то типа “изоляция клиентов”, когда они только пакеты на провайдера имеют слать право, а между ними все рубится? Хотя… Тогда бы в обоих случаях пинга не было бы.

Пк с вайфая пропинговывает пк на кабеле?

Да я тоже ничего не понимаю… уже несколько дней мучаюсь)
да, конечно. я вайфай в телефоне не трогаю, ничего не меняю кроме скетча. скетч оригинал работает. даже мой код работает, если шапку делаю такую:

Спойлер

`#include <SPI.h>
#include <Ethernet2.h>

byte mac = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip(10,0,0,177);
EthernetServer server(80);

void setup() {
Serial.begin(9600);
Ethernet.begin(mac, ip);
server.begin();
Serial.print("IP: ");
Serial.println(Ethernet.localIP());
}`

библиотека в оригинале Ethernet2 у меня Ethernet. но библиотека не влияет… пробовал и то и то

Мак попробуйте закопипастить из “правильного”, только последний октет смените.

да нууу… а как это работает? у меня все заработало

заветное магическое слово - DEAD BEEF FEED )))

1 лайк

У мака свои правила формирования, особенно в районе первого байта.

А может уже существующий в сети скопипастили, вот роутер и путался.

Часто бывает, что адрес поменяли, мак оставили и наоборот. Пока ARP не протухнет - такие фортеля можно наблюдать, что объяснить их можно только рептилоидным вторжением.

1 лайк

0xD5, 0xAD… - D5 на D4 смените-ка для эксперимента.

производитель обязан получить диапазон MAC адресов для своих устройств, а когда назначается хрен знает какой MAC в сети имеющий выход на сеть общего пользования…получим то, что сказал Садман

Никакой связи нет. ARP живет в L2-сегменте и роутингу не подлежит. Если только proxy-arp не устроить - можно одинаковый мак иметь в двух разных подсетях.

да, тоже работает

D5 не работает, D4 работает?
Значит в мультикаст удачно попали.

на сеть общего пользования я же не вывожу… у меня нет статического адреса и прочее. это чисто локальная сеть

То есть интернета нет в роутере?

та то есть… чисто ради эксперимента сейчас отключу интернет)