Arduino Ethernet Shield 2: Как автоматически определить MAC-адрес?
Я использую Arduino Mega. Я знаю, что Ethernet Shield 2 поставляется с наклейкой с напечатанным на ней MAC - адресом. Для меня это означало бы, что этот адрес жестко закодирован в щите. Есть ли какой-либо способ восстановить MAC без ручного ввода его в скетч? Спасибо!
@spiteful_moose, 👍2
2 ответа
Лучший ответ:
Нет, у чипа W5500 нет mac - адреса. Вы можете дать ему любой mac - адрес, который захотите. Однако маршрутизатору могут не понравиться некоторые mac-адреса.
Существуют онлайн-генераторы mac - адресов.
Наклейка с mac-адресом является дополнительной услугой. Это уникальный номер. Но это всего лишь номер на наклейке, он не связан с этим конкретным щитом.
Часто использовался mac - адрес DEADBEEFEED. Но когда две разные платы Arduino используют один и тот же mac-адрес, маршрутизатор думает, что это одно и то же устройство. Когда одновременно подключены два устройства с одним и тем же mac-адресом, это наверняка способ испортить маршрутизатор.
Это старый вопрос, но я хотел поделиться своим кодом, который исправляет это. В принципе, следующий код генерирует "локально управляемый адрес" и сохраняет его в EEPROM. При последующих запусках он считывает адрес с EEPROM, чтобы вы обычно получали тот же IP-адрес с DHCP-сервера.
Если у вас нет EEPROM, у вас может быть другая память, которая выдерживает циклы программирования (SPI Flash, RTC RAM и т. Д.) - для этого вам потребуется обновить скетч.
#include <EEPROM.h>
// If defined, report information about MAC ADDRESS INITIALISATION
#define ENABLE_MAC_INIT_MESSAGES
// Local mac address, initialiser can be removed (when using initMacAddress)
uint8_t mac[6] = {0x00,0x01,0x02,0x03,0x04,0x05};
void initMacAddress() {
// Rather than having a fixed MAC address for an Arduino sketch,
// this implements a different, random address which is persistant
// by storing it to EEPROM (which only works when EEPROM is available).
// Here the MAC ADDRESS IS LOCATED AT ADDRESS 0 OF THE EEPROM
for(int i=0;i<6;i++) {
mac[i]=EEPROM[i];
}
// Generating a new MAC address if the address found is not locally
// Administrated. This test requires that the 2 lower bits of the first
// byte are equal to "2" (bits 1 and 0).
// Normally it is only required that bit 1 is "1", but checking bit 0 for a 0
// allows to detect an uninitialized EEPROM.
if((mac[0]&0x03)!=2) { // Is this a locally administered address?
// No a locally managed address, generate random address and store it.
#ifdef ENABLE_MAC_INIT_MESSAGES
Serial.println("GENERATE NEW MAC ADDR");
#endif
// make sure random numbers used are not always the same
randomSeed(analogRead(0));
for(int i=0;i<6;i++) {
mac[i]=random(256);
if(i==0) {mac[0]&=0xFC;mac[0]|=0x2;} // Make locally administered address
EEPROM.update(i,mac[i]);
#ifdef ENABLE_MAC_INIT_MESSAGES
if(mac[i]<10) {Serial.print('0');} // Print two digets
Serial.print(mac[i],HEX);Serial.print(":");
#endif
}
#ifdef ENABLE_MAC_INIT_MESSAGES
Serial.println();
#endif
}
}
void setup() {
initMacAddress();
/*...*/
}
ИЗМЕНИТЬ: Анонимное использование предложило вызвать randomSeed(analogRead(0)); чтобы убедиться, что сгенерированное значение является случайным. Это (может) необходимо сделать только один раз в программе. Лучше всего это сделать в " setup ()", так как аналоговый вывод, который действительно можно использовать, зависит от приложения - можно также использовать более сложные и случайные схемы инициализации.
- Arduino Ethernet Shield при использовании контактов Arduino Mega
- Библиотека Arduino Mega Shield для Eagle CAD
- Удаленная загрузка кода на плату Arduino через интернет
- mcufriend 2.4 tft мега 2560
- Arduino GSM Shield GSM_READY никогда не готов
- Проблема с Ethernet-экраном W5100 на пользовательской плате
- Arduino Ethernet Shield 2 застрял на EthernetServer::begin()
- Как сделать веб сервер arduino через USB? Без ethernet shield и чипа wifi
Было бы так просто включить туда немного I2C, SPI или 1-проводной EEPROM с запрограммированным на заводе MAC - адресом. Разница в цене была бы незначительной. Такой позор, что они никогда не беспокоились..., @Majenko
Спасибо за информацию. Этого я и боялся. В принципе, этот прототип в конечном итоге будет запущен в крупномасштабное производство (с использованием запатентованной платы, разработанной на основе кода/схемы Arduino и т. Д. В итоге я получаю), поэтому использование случайно сгенерированного mac кажется плохим решением. Ну что ж, я уверен, что есть альтернатива сетевому щиту., @spiteful_moose