Шлюз не работает в 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();
///////////////////////////////// Другой код ////////////////// /////////////////////
...
////////////////////////////////////////////////// ////////////////////////////////
}
@ArgusLibovski, 👍3
1 ответ
Из-за пределов вашей локальной сети (т.е. из Интернета) вы можете пропинговать только внешний IP-адрес вашего маршрутизатора, локальные IP-адреса, такие как 192.168.11.242, не маршрутизируются в Интернете. Кроме того, многие домашние маршрутизаторы настроены так, чтобы не отвечать на внешние эхо-запросы. Я вижу, что вы используете snmp для связи с вашим Arduino, вы можете перенаправить порт snmp (обычно порт 161) с вашего маршрутизатора на Arduino на 192.168.11.42:161, чтобы достичь того, что вы хотите, но это угроза безопасности. Затем вы подключите свой менеджер snmp к вашему внешнему IP-адресу, а ваш маршрутизатор подключится к вашему Arduino и выполнит необходимую трансляцию сетевых адресов для связи. Это предполагает, что ваш маршрутизатор и интернет-провайдер разрешают переадресацию порта snmp.
- Как создать сервер сокетов Arduino для получения сообщений
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
- Не удается снова загрузиться после смены платы
- Генерация стабильной частоты
- В чем разница между ATMEGA32 и ATMEGA328?
- Клиент MQTT на Arduino + SIM900
- Arduino UNO для получения подписи чипа ATmega328P-PU
- Удаленная загрузка кода на плату Arduino через интернет
Я использую корпоративную сеть, а не Интернет, где я пингую свое устройство через систему мониторинга. Многие другие устройства работают по тому же принципу в этой корпоративной сети. Поэтому все, что мне нужно, это чтобы Arduino правильно маршрутизировала пакеты к шлюзу., @ArgusLibovski
Я думаю, что этот ответ правильный. Вам необходимо использовать внешний IP-адрес и, возможно, настроить переадресацию портов на ваш сервер., @Rohit Gupta