Шлюз не работает в Arduino EthernetENC

Я использую ENC28J60 и библиотеку EthernetENC для подключения Arduino UNO с ATmega328 к сети. В локальной сети все работает нормально, а вот за ее пределами я не могу пропинговать устройство. В чем может быть проблема? Настройки сети верны на 100% (другие устройства работают нормально, примеры из библиотеки Ethernet тоже реагируют на пинги).

////////////////////////////////////// Настройки ///// //////////////////////////////////
#define DHCP false          // правда/ложь
#define CUSTOM_MAC true     // true/false

#if CUSTOM_MAC              // если true, вы можете ввести свой собственный MAC-адрес
#define MAC 0x00,0x5f,0x1C,0x05,0x5f,0x1C
#else
#define MAC 0x00,0x5f,0x1C  // Уникальный идентификатор организации (OUI)
#endif

#define IP_ADDRESS  192,168, 11,242
#define SUBNET      255,255,255,248
#define GATEWAY     192,168, 11,241
#define DNS         192,168, 11,241


// # определить UIP_CONF_MAX_CONNECTIONS 0
///////////////////////////////////// Библиотеки ///////////// ///////////////////////////
#include <Arduino.h>
#include <EthernetENC.h>  // Подключаем библиотеку Ethernet
#include <Agentuino.h>    // SNMP-библиотека
#include <EEPROM.h>
#include <microDS18B20.h>
/////////////////////////////// Контакты датчиков Arduino ///////////////// ///////////////////
#define TEMPERATURE_1_PIN 0
#define TEMPERATURE_2_PIN 1
#define TEMPERATURE_3_PIN 2
#define TEMPERATURE_4_PIN 3
#define SENSOR_220V_PIN   4
#define SERVO_PIN         5
#define LED_ALERT_PIN     6
#if !SOUND_MUTE
#define SPEAKER_PIN       7
#else
#define SPEAKER_PIN       8
#endif
#define FLOOD_PIN         A0
#define DOOR_PIN          A1
#define GAS_PIN           A2


///////////////////////////// Инициализация Ethernet / SNMP ////////////////// ///////////////////
#if !DHCP
IPAddress ip(IP_ADDRESS);   // IP-адрес для ардуино
IPAddress gateway(GATEWAY); // Шлюз для ардуино
IPAddress subnet(SUBNET);   // Маска подсети для ардуино
IPAddress myDns(DNS);       // DNS для ардуино
#endif

byte mac[] = {MAC};

///////////////////////////////////// Мои OID ///////////// //////////////////////////////
...
////////////////////////////////////////////////// /////////////////////////////////////

//////////////////////////////// Функция SNMP сохранена ///////////////// ////////////////
void pduReceived(){...}
////////////////////////////////////////////////// /////////////////////////////////////

void setup(){
  ///////////////////////////////// контакты инициализации /////////////// //////////////////////
  pinMode(TEMPERATURE_1_PIN, INPUT);
  pinMode(TEMPERATURE_2_PIN, INPUT);
  pinMode(TEMPERATURE_3_PIN, INPUT);
  pinMode(TEMPERATURE_4_PIN, INPUT);
  pinMode(SENSOR_220V_PIN, INPUT);
  // pinMode(SERVO_PIN, INPUT);
  pinMode(FLOOD_PIN, INPUT);
  pinMode(DOOR_PIN, INPUT);
  pinMode(GAS_PIN, INPUT);
  pinMode(LED_ALERT_PIN, OUTPUT);
  #if !SOUND_MUTE
  pinMode(SPEAKER_PIN, OUTPUT);
  #endif

  ////////////////////////////// инициализация другого /////////////////// /////////////////////
  Serial.begin(9600); // Инициализация серийного монитора
  Agentuino.begin();  // Запуск агента Snmp на экране Ethernet

  ///////////////////////// Генерация случайного mac-адреса ////////////////////// /////
#if !CUSTOM_MAC
  if (EEPROM[0] == 255 && EEPROM[1] == 255 && EEPROM[2] == 255){
    for (int i = 3; i < 6; i++){
      randomSeed(analogRead(A5)); 
      mac[i] = random(0xFF);
      EEPROM.put(i - 3, mac[i]);
    }
  }
  else{
    for (int i = 3; i < 6; i++){ 
      EEPROM.get(i - 3, mac[i]); // Рид сохранил mac-адреса из EEPROM
    }
  }
#endif

#if DHCP
  Ethernet.begin(mac) // Инициализировать Ethernet Shield в режиме DHCP
#else
  Ethernet.begin(mac, ip, myDns ,gateway, subnet); // Инициализировать Ethernet Shield в статическом режиме
#endif

///////////////////////////////////// Отладка ///////////// ///////////////////////////
Serial.println();
Serial.println();
  if (Ethernet.hardwareStatus() == EthernetNoHardware) {
    Serial.println(F("Ethernet shield was not found.  Sorry, can't run without hardware. :("));
    while (true) {
      delay(1); // ничего не делать, нет смысла работать без оборудования Ethernet
    }
  }
  if (Ethernet.linkStatus() == LinkOFF) {
    delay(500);
    if (Ethernet.linkStatus() == LinkOFF) {
      Serial.println("Ethernet cable is not connected.");
    }
  }

  Serial.print(F("localIP: "));
  Serial.println(Ethernet.localIP());
  Serial.print(F("dnsServerIP: "));
  Serial.println(Ethernet.dnsServerIP());
  Serial.print(F("gatewayIP: "));
  Serial.println(Ethernet.gatewayIP());
  Serial.print(F("subnetMask: "));
  Serial.println(Ethernet.subnetMask());
  Serial.print(F("mac: "));
  for (int i = 0; i < 6; i++){
    Serial.print(mac[i], HEX);
    if (i <= 4) Serial.print(F("."));
  }
  
  Serial.println();
  ////////////////////////////////////////////////// ////////////////////////////////
  
  Agentuino.onPduReceive(pduReceived);
  delay(10);
}


void loop(){
  Agentuino.listen();

  ///////////////////////////////// Другой код ////////////////// /////////////////////
  ...
  ////////////////////////////////////////////////// ////////////////////////////////
}

, 👍3


1 ответ


1

Из-за пределов вашей локальной сети (т.е. из Интернета) вы можете пропинговать только внешний IP-адрес вашего маршрутизатора, локальные IP-адреса, такие как 192.168.11.242, не маршрутизируются в Интернете. Кроме того, многие домашние маршрутизаторы настроены так, чтобы не отвечать на внешние эхо-запросы. Я вижу, что вы используете snmp для связи с вашим Arduino, вы можете перенаправить порт snmp (обычно порт 161) с вашего маршрутизатора на Arduino на 192.168.11.42:161, чтобы достичь того, что вы хотите, но это угроза безопасности. Затем вы подключите свой менеджер snmp к вашему внешнему IP-адресу, а ваш маршрутизатор подключится к вашему Arduino и выполнит необходимую трансляцию сетевых адресов для связи. Это предполагает, что ваш маршрутизатор и интернет-провайдер разрешают переадресацию порта snmp.

,

Я использую корпоративную сеть, а не Интернет, где я пингую свое устройство через систему мониторинга. Многие другие устройства работают по тому же принципу в этой корпоративной сети. Поэтому все, что мне нужно, это чтобы Arduino правильно маршрутизировала пакеты к шлюзу., @ArgusLibovski

Я думаю, что этот ответ правильный. Вам необходимо использовать внешний IP-адрес и, возможно, настроить переадресацию портов на ваш сервер., @Rohit Gupta