Самостоятельно прописать мак и имя клиента для ESP8266

DyadyaGenya
Offline
Зарегистрирован: 23.06.2022

Доброго времени суток. Учусь работать с ардуино, и почти сразу начал с настройки ESP8266. Получается подключить плату к роутеру. Но если подключить несколько, то начинаются конфликты, потому что мак у них один и тот же. Возможно потому что взял самые дешевые для тренировки и с другими такой проблемы не будет. Но пока вожусь с ними. Подключаюсь так:

#include <ESP8266WiFi.h>                                                // Библиотека для создания Wi-Fi подключения (клиент или точка доступа)
#include <WiFiClient.h>
#include <ESP8266WebServer.h>                                           // Библиотека для управления устройством по HTTP (например из браузера)
#include <FS.h>                                                         // Библиотека для работы с файловой системой
#include <ESP8266FtpServer.h>                                           // Библиотека для работы с SPIFFS по FTP

const char* ssid = "";
const char* password = "";

// Пробовал сделать так: IPAddress mac = (0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xED);

void setup() {
  Serial.begin(9600);                                                   // Инициализируем вывод данных на серийный порт со скоростью 9600 бод
  WiFi.begin(ssid, password);                                           // Инициализируем подключение к указанной вайфай сети
// И вот тут вставить WiFi.config(mac); Но ругается.
  }  
}

void loop() {
  // put your main code here, to run repeatedly:

}

А про имя клиента вообще мыслей нет

inspiritus
Offline
Зарегистрирован: 17.12.2012
например можно так

const char* ssid = "SSID_NAME";
const char* password = "password";

IPAddress ip(192, 168, 1, 200);
IPAddress gateway(192, 168, 1, 1);
IPAddress subnet(255, 255, 255, 0);

uint8_t mac[6] {0xA8, 0xD9, 0xB3, 0x00, 0x00, 0x02};

…….

void WiFi_conn() {
  WiFi.mode(WIFI_OFF);
  delay(1000);
  WiFi.mode(WIFI_STA);
  Serial.println();

  Serial.print("OLD ESP8266 MAC: ");
  Serial.println(WiFi.macAddress());
  wifi_set_macaddr(0, const_cast<uint8*>(mac));
  Serial.print("NEW ESP8266 MAC: ");
  Serial.println(WiFi.macAddress());

  WiFi.begin(ssid, password);
  WiFi.config(ip, gateway, subnet);
  Serial.println("");
  // ждем соединения:
  while (WiFi.status() != WL_CONNECTED) {
    for (int i = 0 ; i < 10 ; i++) led_blink(50);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

}

 

DyadyaGenya
Offline
Зарегистрирован: 23.06.2022

inspiritus пишет:

например можно так

В принципе получилось. Только почему-то у меня не захотело работать без функции void setup(). Пришлось в неё перенести все, что в вашей void WiFi_conn(). Хотя по идее можно было сделать отдельно void setup() (тут напр, инициализировать вывод данных и указать скорость) и void WiFi_conn(). Но так почему-то не получилось.

И мне не нужно было прописывать адрес, гетвей, маску. Я их убрал.

Но вопросы остались. Этот новый мак как надолго? Старый где-то сохранился? Как вернуть старый?

Я поэксперементировал. Тупо перезагрузил плату и заново залил скетч. Выдало:

OLD ESP8266 MAC: старый мак
NEW ESP8266 MAC: новый мак.

Тоесть получается, что новый действует пока залит скетч? Тоесть можно тут же вернуть старый? Или залить новый, где нет подмены и там будет старый?

DyadyaGenya
Offline
Зарегистрирован: 23.06.2022

inspiritus пишет:

uint8_t mac[6] {0xA8, 0xD9, 0xB3, 0x00, 0x00, 0x02};

…….

  wifi_set_macaddr(0, const_cast<uint8*>(mac));

Кстати, попробовал эти строки заменить на:

byte arduino_mac[] = { 0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xED };

// .....

wifi_set_macaddr(0, const_cast<byte*>(arduino_mac));

И тоже получилось. Только не совсем понятна разница между этими вариантами.

 

И хотелось бы понять, что значат ваши строки (интуитивно догадываюсь, что остановка вайфая и запуск):

  WiFi.mode(WIFI_OFF);
  delay(1000);
  WiFi.mode(WIFI_STA);

Но где об этом можно прочитать? Пробовал читать   библиотеку WiFiClient, но либо там этого нет, либо я не понял.