Consulta TCP Ethernet Server

Hola, escribia porque queria saber si es que alguien contaba con algun ejemplo de programación de protocolo TCP.

Lo que necesito es enviar data desde mi arduino a un servidor. Cabe destacar que la ip del servidor la tengo.

Alguien cuenta con algun ejemplo?

De antemano, gracias.

¿Datos?
¿Qué datos?
¿Un código de página web a un cliente que pregunte?
¿Valores para almacenar en base de datos en un servidor?
¿?

chema_zgz:
¿Datos?
¿Qué datos?
¿Un código de página web a un cliente que pregunte?
¿Valores para almacenar en base de datos en un servidor?
¿?

Estoy trabajando para una empresa y requiero enviar datos desde X ciudad a el servidor. Lo que se me dijo, es que debia hacerlo por protocolo TCP.

Ahora, tengo la IP del server. Realice una configuración Telnet Client donde debo ingresar la mac, la IP del arduino y la IP del server, pero al momento de conectarlo ... no se conecta ...

Lo que pienso que puede pasar es que el puerto 23 (que esta por default para esta configuración) esta ocupado y quizas requiero otro.

Si tienes que comunicarte con un servidor, no basta con saber la IP, tienes que conocer, desde luego, el puerto, aparte de saber el lenguaje que vais a hablar.
Si no te responde el 23, más que porque esté ocupado, suena a que no estuviera habilitado. Por lo general, en un puerto se aceptarán múltiples conexiones concurrentes.
Para depurar estas cosas, siempre te será más fácil determinar los parámetros necesarios, ver las posibles respuestas y demás, a través de una conexión desde un PC, por ejemplo, con un programa tipo putty.
Una vez que ahí veas en qué puerto obtienes respuesta, y conozcas el protocolo de "charla" con el servidor, ya podrás trasladar y automatizar eso a tu Arduino.

chema_zgz:
Si tienes que comunicarte con un servidor, no basta con saber la IP, tienes que conocer, desde luego, el puerto, aparte de saber el lenguaje que vais a hablar.
Si no te responde el 23, más que porque esté ocupado, suena a que no estuviera habilitado. Por lo general, en un puerto se aceptarán múltiples conexiones concurrentes.
Para depurar estas cosas, siempre te será más fácil determinar los parámetros necesarios, ver las posibles respuestas y demás, a través de una conexión desde un PC, por ejemplo, con un programa tipo putty.
Una vez que ahí veas en qué puerto obtienes respuesta, y conozcas el protocolo de "charla" con el servidor, ya podrás trasladar y automatizar eso a tu Arduino.

Muchas gracias, por tu respuesta.

#include <SPI.h>
#include <Ethernet.h>
#include <Client.h>
#include <SD.h>
float distancia;
float Inch=0.00;
float cm=0.00;
int sensorValue;
long volumen;
byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
};
IPAddress ip(10,250, 191,200 );
IPAddress gateway(10, 250,191,254);
IPAddress subnet(255,255,255,0);
IPAddress server(10,247,80,36);
//byte ip[]={10, 250, 191, 200};
//byte gateway[]={10, 250, 191, 254};
//byte subnet[]={255,255,255,0};
//byte server[]={10,247,80,36};

EthernetClient client;

void setup() {
  // start the Ethernet connection:
  //Ethernet.begin(mac,ip,gateway);
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  Ethernet.begin(mac,ip);
    Serial.println("connecting...");
  if (client.connect(server,30)) {
  Serial.println("connected");
  } else {
    // if you didn't get a connection to the server:
    Serial.println("connection failed");
  }
}

void loop() {
  
  if (client.available()) {
  sensorValue=analogRead(0);
  delay(50);

  Inch=(sensorValue*0.497);
  delay(10);

  cm=Inch*2.54;

  distancia=cm/100;

  volumen=1065.13254329+884.542070023*distancia+(-4623.36169824)*pow(distancia,2)+2641.21874428*pow(distancia,3);

  delay(1000);
 
  client.print(" Litros: ");
  client.println(volumen);
  Serial.print(" Litros: ");
  Serial.print(volumen);
    
  }

   // if the server's disconnected, stop the client:
  if (!client.connected()) {
    Serial.println();
    Serial.println("disconnecting.");
    while (true);
  }
}

Adjunto mi codigo, no se error tiene. Llame a la empresa y me dice que los puertos estan todos habilitados, pero no me puedo conectar.

Quiero suponer que has hecho las pruebas necesarias:

1- que desde la zona de red donde tienes tu Arduino, con una máquina, usando como gateway el 10.250.191.254, puedes alcanzar la máquina servidor: 10.247.80.36 (que responde al ping, por ejemplo).

2- en caso de que 1 ok, que al "llamar" al puerto 30 del servidor éste está escuchando ahí.

chema_zgz:
Quiero suponer que has hecho las pruebas necesarias:

1- que desde la zona de red donde tienes tu Arduino, con una máquina, usando como gateway el 10.250.191.254, puedes alcanzar la máquina servidor: 10.247.80.36 (que responde al ping, por ejemplo).

2- en caso de que 1 ok, que al "llamar" al puerto 30 del servidor éste está escuchando ahí.

Lo probe hace una semana y estaba todo bien, llegaba al router.

Volvi a hacerlo y llego al servidor, pero no tengo acceso a internet ... he ahi el problema ... fuck! ...

Ahora me dieron otra IP para el server, hice ping si hay conexión. Cambie por el puerto 23 y nada.

No tengo conexión.

Cual puede ser el problema? ... es de vida o muerte ...

Hola!yo creo que este articulo te puede servir Conexión Ethernet TCP con Arduino - Polaridad.es (soy principiante y aun estoy informandome)

Este es el ejemplo que usan en el articulo que te he pasado

// #include <Ethernet.h> // Librería Ethernet estándar

#define INTERVALO_CONSULTA 60000 // Enviar datos cada minuto
#define INTERVALO_RECONEXION 10000 // Reintentar la conexión 10 segundos más tarde si no ha sido posible hacerlo cuado correspondía
#define CANTIDAD_SENSORES 6 // Número de sensores analógicos empezando en A0

byte direccion_mac[]={0x12,0x34,0x56,0x78,0x9a,0xbc}; // Dirección MAC inventada
IPAddress direccion_ip_fija(192,168,1,69); // Dirección IP elegida para el módulo
IPAddress servidor_dns(87,216,170,85); // Servidor OpenNIC (de Alejandro Bonet, http://opennic.alargador.org)
IPAddress puerta_enlace(192,168,1,14); // Dirección IP del router
IPAddress mascara_red(255,255,255,0); // Máscara de la red
//IPAddress ip_servidor_web(192,168,1,21); // Dirección IP del servidor web (en la intranet)
char url_servidor_web[]="sleepmanager.onironauta.es"; // URL poético para un gestor de sueño (en Internet)
EthernetClient cliente;
byte estado_conexion;
String texto_consulta;
unsigned long cronometro_consulta;
byte contador;

void setup()
{
Serial.begin(9600);
while(!Serial){;} // Esperar al puerto serie de la placa Leonardo
Serial.println("Conectando con el servidor SleepManager...");
Ethernet.begin(direccion_mac,direccion_ip_fija,servidor_dns,puerta_enlace,mascara_red);
cronometro_consulta=millis()+INTERVALO_CONSULTA;
}

void loop()
{
if(millis()>cronometro_consulta)
{
//estado_conexion=cliente.connect(ip_servidor_web,80); // Conexión desde la intranet
estado_conexion=cliente.connect(url_servidor_web,80); // Conexión desde Internet
while(estado_conexion==0) // esperar a que se establezca la conexión o se produzca un error
{
switch(estado_conexion)
{
case 1:
Serial.println("Conexión con el servidor SleepManager establecida correctamente");
break;
case -1:
Serial.println("Ha pasado el tiempo de espera sin que se establezca la conexión");
break;
case -2:
Serial.println("No se ha encontrado el servidor o no responde correctamente");
break;
case -3:
Serial.println("La conexión se ha interrumpido antes de establecerse completamente");
break;
case -4:
Serial.println("La respuesta del servidor es incorrecta");
break;
}
}
if(cliente.connected()) // Si ha sido posible conectar realizar la consulta
{
cronometro_consulta=millis()+INTERVALO_CONSULTA;
texto_consulta="GET /pruebas/guardar_sensores_analogicos.php?origen=SleepManager";
for(contador=0;contador<CANTIDAD_SENSORES;contador++)
{
texto_consulta="&sensor_"+String(contador+1,DEC)+"="+String(analogRead(contador),DEC);
delay(1); // Como tarda 100 μs en obtener el valor analógico, con 1 ms seguro le da tiempo
}
texto_consulta+=" HTTP/1.1\r\nHost: "+String(url_servidor_web)+"\r\nUser-Agent: sleep_inspector\r\n\r\n";
cliente.print(texto_consulta);
cliente.flush();
cliente.stop();
}
else // Si no ha sido posible conectar reintentarlo más tarde pero no tanto como si hubiera sido posible hacerlo
{
cronometro_consulta=millis()+INTERVALO_RECONEXION;
}
}
}

Yo tengo contratada un hosting con este servicio y no he tenido problemas :slight_smile: Espero que lo soluciones y que te valga de ayuda