Socket TCP con Arduino

Ciao a tutti. Sono abbastanza "fresco" nel mondo arduino.
Vengo subito al dunque, esiste una libreria che permette di creare un pacchetto tcp da mandare ad un altro dispositivo connesso in rete, tramite socket?
Aggiungo che sto usando una consueta ethernet shield W5100.
Ho googlato ma in relazione alla libreria ethernet.h ho trovato solo l'implementazione di pacchetti udp.
Grazie.

Buongiorno, :slight_smile:
essendo il tuo primo post nella sezione Italiana del forum, nel rispetto del regolamento di detta sezione (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il su citato REGOLAMENTO ... Grazie.

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread, nessuno ti potrà rispondere, quindi ... ti consiglio di falra al più presto. :wink:

Si scusate non sapevo fosse necessario ri-presentarsi nella sezione regionale, l'ho appena fatto comunque

Mi sembra che questo articolo presenti bene tutte le possibilità/usi della scheda ETH (immagino eventualmente portabili quasi paro paro su ESP8266). Non sono entrato nel merito della correttezza o meno degli esempi.

Finora ho usato solo la comunicazione UDP. Per il TCP mi sembra che non ci sia l'accesso diretto al socket a basso livello, ma si parte da un livello più alto client/server.

Grazie, molto utile. Nel pomeriggio me lo studio, vediamo di capirci qualcosa.
PS per quanto riguarda UDP ho fatto delle prove tra ieri ed oggi, instaurando un socket fra la w5100 ed un listener in ascolto sul mio pc, scritto in c#, e sembra tutto funzionare correttamente.
Vi aggiorno

Se serve, ho provato ad eseguire l'esempio di lettura server NTP ma non funzia, l'ho modificato così e funziona (richiede e stampa l'ora una volta al minuto):

#include <SPI.h>         
#include <Ethernet.h>
#include <EthernetUdp.h>

IPAddress ip(..., ..., ..., ...);                    // IP locale Arduino
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // MAC Arduino
const int localPort = 8888;                          // porta UDP locale

char timeServer[] = "time.nist.gov";
const int NTP_PACKET_SIZE = 48;
byte packetBuffer[NTP_PACKET_SIZE];

EthernetUDP Udp;

byte B50 = 0;  // variabile fase programma
byte ore = 0;
byte minuti = 0;
byte secondi = 0;
uint32_t t0;

//--------------------------------------------------------------------

void setup() 
{
    Serial.begin(9600);
    delay(100);
    Ethernet.begin(mac, ip);
    delay(100);
    Udp.begin(localPort);
    delay(100);
}

//--------------------------------------------------------------------

void loop()
{
    if (0 == B50)
    {
        sendNTPpacket(timeServer);
        t0 = millis();
        B50 = 1;
    }

    if (1 == B50  &&  Udp.parsePacket()) 
    {  
        Udp.read(packetBuffer, NTP_PACKET_SIZE);

        uint32_t z = packetBuffer[40];
        z = (z << 8) | packetBuffer[41];
        z = (z << 8) | packetBuffer[42];
        z = (z << 8) | packetBuffer[43];

        z %= 86400;                 // secondi giorno attuale
        ore = (z/3600 + 2) % 24;    // +2 da Greenwich
        z %= 3600;                  // secondi residui giorno attuale
        minuti  = z / 60;
        secondi = z % 60;
        stampa(ore, minuti, secondi); 
    }

    if (1 == B50  &&  (millis()-t0 > 60000UL)) { B50 = 0; }
}

//--------------------------------------------------------------------

unsigned long sendNTPpacket(char address[])
{
    memset(packetBuffer, 0, NTP_PACKET_SIZE); 
    packetBuffer[0] = 0b11100011;   // LI, Version, Mode
    packetBuffer[1] = 0;            // Stratum, or type of clock
    packetBuffer[2] = 6;            // Polling Interval
    packetBuffer[3] = 0xEC;         // Peer Clock Precision
    // 8 bytes of zero for Root Delay & Root Dispersion
    packetBuffer[12]  = 49; 
    packetBuffer[13]  = 0x4E;
    packetBuffer[14]  = 49;
    packetBuffer[15]  = 52;
    Udp.beginPacket(address, 123);
    Udp.write(packetBuffer, NTP_PACKET_SIZE);
    Udp.endPacket(); 
}

//--------------------------------------------------------------------

void stampa(byte h, byte m, byte s)
{
    if (h < 10) Serial.print(' ');
    Serial.print(h);
    Serial.print(':');
    if (m < 10) Serial.print('0');
    Serial.print(m);
    Serial.print(':');
    if (s < 10) Serial.print('0');
    Serial.println(s);
}

Ciao Claudio, grazie. Su che scheda l'hai fatto girare?

Una normale UNO con ethernet shield, ma anche una mega non farebbe differenza.