Arduino Ethernet Shield 2: Как автоматически определить MAC-адрес?

Я использую Arduino Mega. Я знаю, что Ethernet Shield 2 поставляется с наклейкой с напечатанным на ней MAC - адресом. Для меня это означало бы, что этот адрес жестко закодирован в щите. Есть ли какой-либо способ восстановить MAC без ручного ввода его в скетч? Спасибо!

, 👍2


2 ответа


Лучший ответ:

3

Нет, у чипа W5500 нет mac - адреса. Вы можете дать ему любой mac - адрес, который захотите. Однако маршрутизатору могут не понравиться некоторые mac-адреса.

Существуют онлайн-генераторы mac - адресов.

Наклейка с mac-адресом является дополнительной услугой. Это уникальный номер. Но это всего лишь номер на наклейке, он не связан с этим конкретным щитом.

Часто использовался mac - адрес DEADBEEFEED. Но когда две разные платы Arduino используют один и тот же mac-адрес, маршрутизатор думает, что это одно и то же устройство. Когда одновременно подключены два устройства с одним и тем же mac-адресом, это наверняка способ испортить маршрутизатор.

,

Было бы так просто включить туда немного I2C, SPI или 1-проводной EEPROM с запрограммированным на заводе MAC - адресом. Разница в цене была бы незначительной. Такой позор, что они никогда не беспокоились..., @Majenko

Спасибо за информацию. Этого я и боялся. В принципе, этот прототип в конечном итоге будет запущен в крупномасштабное производство (с использованием запатентованной платы, разработанной на основе кода/схемы Arduino и т. Д. В итоге я получаю), поэтому использование случайно сгенерированного mac кажется плохим решением. Ну что ж, я уверен, что есть альтернатива сетевому щиту., @spiteful_moose


0

Это старый вопрос, но я хотел поделиться своим кодом, который исправляет это. В принципе, следующий код генерирует "локально управляемый адрес" и сохраняет его в 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 ()", так как аналоговый вывод, который действительно можно использовать, зависит от приложения - можно также использовать более сложные и случайные схемы инициализации.

,