Публичный IP-адрес для Arduino с экраном Ethernet и Arduino Uno

Я новичок в Arduino и хочу, чтобы вы мне помогли. Хотелось бы иметь публичный IP, чтобы любой желающий мог получить к нему доступ, не только с домашнего домена. Что я мог сделать?. Я использую Arduino Uno, Arduino Ethernet Shield w5500 и RTC. Мой код:

#include <SPI.h>
#include <Ethernet.h>
#include "RTClib.h"
#include <EEPROM.h>

#define time 1
// Введите ниже MAC-адрес и IP-адрес вашего контроллера.
// IP-адрес будет зависеть от вашей локальной сети:
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip(192, 168, 0, 177);

// Инициализируем библиотеку сервера Ethernet
// с IP-адресом и портом, который вы хотите использовать
// (порт 80 по умолчанию для HTTP):
EthernetServer server(80);
//------------------------------------------------ -------------------------------------------------- --------------
 int i=0;
String hora="";
String readString;


RTC_DS1307 RTC;


void setup() {

  pinMode(2,OUTPUT);
  // Открытие последовательной связи и ожидание открытия порта:
  Serial.begin(9600);   
RTC.begin(); // Инициация связи с RTC

RTC.adjust(DateTime(__DATE__, __TIME__)); // Establece la fecha y hora (Commentar una vez establecida la hora)


  while (!Serial) {
    ; // ждем подключения последовательного порта. Требуется только для родного порта USB
  }
  Serial.println("Sistemas Digitales");

  // запускаем соединение Ethernet и сервер:
  Ethernet.begin(mac, ip);

  // Проверяем наличие оборудования Ethernet
  if (Ethernet.hardwareStatus() == EthernetNoHardware) {
    Serial.println("Ethernet shield no se encontro.  No se puede correr el programa sin el hardware. :(");
    while (true) {
      delay(1); // ничего не делать, нет смысла работать без оборудования Ethernet
    }
  }
  if (Ethernet.linkStatus() == LinkOFF) {
    Serial.println("El cable Ethernet no esta onectado.");
  }

  // запускаем сервер
  server.begin();
  Serial.print("El servidor esta en: ");
  Serial.println(Ethernet.localIP());
}






void loop() {
  // прослушивание входящих клиентов


delay(1000);  
DateTime now = RTC.now(); // Получить ла fecha y hora del RTC




  EthernetClient client = server.available();
  if (client) {
    while (client.connected()) {
      if (client.available()) {
//------------------------------------------------ -------------------------------------------------- -------------------------------
        char c = client.read();


if(i==11 || i==12 || i==16 || i==17){
 if(i==16){
  hora +=':';
 }
  hora += c;
}


        if(readString.length()< 100){
          readString += c;
        }
        i++;
        //Este написать el texto en pantalla letra por letra
        Serial.write(c);




        // если вы дошли до конца строки (получили перевод строки
        // символ) и строка пуста, HTTP-запрос завершился,
        // чтобы вы могли отправить ответ
        if (c == '\n') {
            Serial.println("acabo lectura");

            Serial.println(hora);
             Serial.println(readString);


client.println("HTTP/1.1 200 OK"); // Enviar una respuesta tipica
             client.println("Content-Type: text/html");
             client.println("Connection: close");  
             client.println("Refresh: 10");
           client.println();
           client.println("<!DOCTYPE HTML>");
          client.println(" <html lang='en-US'>");
          client.println("<html>");
          client.println("<head><meta charset='UTF-8'><title>Sistemas Digitales</title></head>");
          client.println("<body>");
          client.println("<div style='text-align:center;'>");
client.print("<h1>Fecha y hora del servidor:");
client.print(now.day(), DEC);
client.print('/');
client.print(now.month(), DEC);
client.print('/');
client.print(now.year(), DEC);
client.print(' ');
client.print(' ');
int horini;
horini=now.hour();
String horartc = "0";
if(horini<10){
  horartc += horini;
}else{
horartc= String(horini);
}
client.print(horartc);
client.print(':');
int minuto;
minuto=now.minute();
String mainut;
if(minuto<10){
  mainut='0'+ String(minuto);
}else{
mainut= String(minuto);
}
client.print(mainut); 
client.println("</h1>");
client.println("<form method='get'>");
client.println("<br /><h2>¿A que horas le quiere dar de comer al chucho?</h2><br />");
client.println("<input type='time' name='hora'>");
client.println("<br/><h2>que dias lo quiere alimentar?</h2><br />");
//установить флажок
//client.println("<label><input type='checkbox' name='cbox1' value='?LunesOn'>Lunes</label><br><label><input type= 'checkbox' name='cbox2' value='?MartesOn'>Martes</label><br><label><input type='checkbox' name='cbox3' value='?MiercolesOn'> Miercoles</label><br><label><input type='checkbox' name='cbox4' value='?JuevesOn'>Jueves</label><br><label><input type='checkbox' name='cbox5' value='?ViernesOn'>Viernes</label><br><label><input type='checkbox' name='cbox6' value='?SabadoOn' >Sabado</label><br><label><input type='checkbox' name='cbox7' value='?DomingoOn'>Domingo</label><br>");
client.println("<input type='submit' value='Enviar' id='enviar'> ");
client.println("</form>");
if (readString.length() >0) {
Serial.println("hora del rtc");
String horiux = horartc +':'+ mainut;
Serial.println(horiux);
EEPROM.put(0, hora);

if(EEPROM.get( 0, hora ) == horiux){
digitalWrite(2, HIGH);
delay(10000);  
digitalWrite(2, LOW);
delay(60000);
}
readString="";
i=0;
hora="";


          client.println("</body>");
          client.println("</html>");

          delay(1);
    // закрыть соединение:
    client.stop();

        }

      }
    }

  }

  }
}

Вот это часть кода:

IPAddress ip(192, 168, 0, 177);

Я хотел бы сделать этот IP-адрес общедоступным, чтобы вы могли получить доступ из любого места, вместо того, чтобы находиться в одном и том же соединении Ethernet.

Любая помощь будет замечательной, спасибо за ваше время.

, 👍0


1 ответ


1

Та же тема обсуждается на форуме Arduino здесь. Самый ценный комментарий был таким:

Чтобы получить статический IP-адрес в Интернете, обратитесь к своему интернет-провайдеру. Вероятно, вам придется заплатить за это дополнительно. Большинство людей используют службы динамического IP-адреса, такие как www.noip.com, для перенаправления трафика на ваш текущий IP-адрес в Интернете. Вы помещаете URL-адрес своего динамического IP-адреса на свою веб-страницу, чтобы запрос браузера направлялся правильно.

Я предполагаю (по адресу), что вы хотите сделать что-то вроде этого:

У устройства NAT может быть функция переадресации портов. Вы можете использовать это. Предположим, что IP-адрес WAN — 198.51.100.1, а IP-адрес сервера — 10.1.1.1, сервер прослушивает порт 80. Таким образом, конфигурация переадресации портов будет примерно такой: 198.51.100.1 80 ---> 10.1.1.1 80 Извне вы подключаетесь к публичному IP - 198.51.100.1 80 Когда устройство NAT получает пакет, оно пересылает его на 10.1.1.1. дополнительная информация здесь

Это прямое копирование из источника. Таким образом, в вашем случае IP-адрес WAN — это статический IP-адрес (или другой), который виден вам за пределами вашей сети, а частный — это 192.168.0.177, который вы использовали. Как указано в первом желтом поле, вы также можете использовать службу динамического IP-адреса.

,

Большое спасибо!, @Quike Moreno