Esiste una libreria che mi permette di creare socket TCP con arduino... di default ho visto che c'è soltanto UDP
Le librerie ethernet che non usano il wiznet o chip equivalente hanno al loro interno la gestione dello stack tcp
in parole povere?
in parole povere se non erro la libreria di defautl ethernet possiede il codice per il TCP, ed è incorporato nelle classi Client e Server. dai un'occhiata al reference (arduino.cc->reference->libraries->Ethernet) per maggiori info.
In oltre puoi trovare i sorgenti nella cartella arduino->libraries->Ethernet
in effetti penso che sia questo a cui ti riferisci
// telnet defaults to port 23
Server server = Server(23);
void setup()
{
// initialize the ethernet device
Ethernet.begin(mac, ip, gateway, subnet);
// start listening for clients
server.begin();
}
void loop()
{
// if an incoming client connects, there will be bytes available to read:
Client client = server.available();
if (client == true) {
// read bytes from the incoming client and write them back
// to any clients connected to the server:
server.write(client.read());
}
}
e se volessi fare in modo che il server invii dei pacchetti a tutti gli host collegati in rete??
Allora ti spiego cosa sto realizzando, in questo momento su arduino ho abilitato un webserver e ho aperto una socket che resta in ascolto sulla porta 6000.
Quando un client (scritto in java) si connette al server attraverso socket, il server gli comunica lo stato attuale dei pin. Fin qui tutto normale...
I client, dopo aver richiesto lo stato delle cose al server, chiudono la socket sulla 6000 e ne aprono una sulla 7000 mettondosi in ascolto.
I client stanno in ascolto perchè ogni volta che cambia lo stato di un pin, il server invia al broadcast il cambiamento e tutti quanti connessi al server possono essere aggiornati sullo stato attuale.
Il problema è che inviando il Datagram in UDP, non sempre tutti quanti ricevono l'info e capita che alcuni host vengono aggiornati e altri no...
Pensavo che in tcp questo potrebbe essere gestito diversamente, tu cosa mi consiglieresti di fare??
il problema del TCP è che non può inviare dati broadcast o multicast.
Secondo me la cosa ideale è che i client in realtà siano server, quando cambia un pin arduino fa un multicast per avvisare del cambiamento, tutti i server rispondono "ok pin cambiato:X"
se arduino non riceve uno di questi messaggi o lo riceve sbagliato procede al reinvio, ma solo a quel server
ho letto in giro ma non ho capito bene come funziona il multicast, che indirizzi vengono riservati al multicast e che differenza ci sia con il broadcast... se io ho una classe di ip 192.168.0.x, qual'è l'ip di multicast??
PS:
grazie mille per il tuo aiuto, molte delle info le prendo sempre in rete, però alle volte ci si perde nelle svariate descrizioni che danno e ci si confonde... a quel punto è essenziale l'aiuto di qualcuno con esperienza... perciò grazie
easy man, mi piace aiutare chi si aiuta so benissimo che macello può essere trovare senza avere idea di cosa cercare
allora in teoria i 2 indirizzi di broadcast sicuri sono 192.168.0.0 e 192.168.0.255, ma non dovrebbero funzionare per il TCP. Sinceramente devo dare una riguardata all'argomento, stasera tiro fuori il libro di sistemi e poi ti dico
grazie mille, sei gentilissimo... intanto io stavo approfondendo l'argomento e mi è sorta una domanda, ma in una rete deve essere un router a supportare e gestirsi il multicast??
Nel frattempo...
l'articolo wiki è incompleto, l'elenco degli indirizzi l'ho trovato quì: http://www.noc.garr.it/index.php?option=com_content&view=article&id=115&Itemid=190
si avevo gi visto quei link... non mi è chiaro però come abilitare arduino in multicast e anche i client. Se devo avere un router che supporta il multicast... diciamo che mi sfugge la configurazione
no, in pratica anzichè l'ip dello shield ti metti in ascolto dell'ip di broadcast. Teoricamente se usi un indirizzo locale (239.0.0.0-239.255.255.255) il router in automatico evita che le tue comunicazioni escano dalla rete locale, così se fai danni li fai solo alla tua rete
Il router dovrebbe essere già configurato fichè resti all'interno della tua rete.
fammi capire, quindi io devo mettere il client in ascolto dell'ip di broadcast?? io semplicemente mi metto in ascolto su una porta, senza specificare alcun indirizzo.
Al server (arduino), invece, che deve inviare datagram imposto l'p di broadcast
eh no, se non erro puoi specificare un'IP di ascolto, nel server... altrimenti i pacchetti broadcast verranno ignorati