Публичный 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.
Любая помощь будет замечательной, спасибо за ваше время.
@Quike Moreno, 👍0
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-адреса.
- Клиент MQTT на Arduino + SIM900
- Удаленная загрузка кода на плату Arduino через интернет
- Отправка данных Arduino через Ethernet на сервер PHP.
- Простая веб-страница с Ethernet-шилдом Arduino на SD-карте
- Есть ли тайм-аут для Ethernet.begin?
- Как создать сервер сокетов Arduino для получения сообщений
- При подключении client.connect() возвращает 0
- Невозможно настроить Ethernet с помощью Arduino Uno R3
Большое спасибо!, @Quike Moreno