Go Down

Topic: Numero massimo connessioni simultanee WebDuino (Read 2610 times) previous topic - next topic

monty14

Come da titolo vorrei gentilmente sapere se esiste un numero massimo di connessioni simultanee ad arduino.
Sto utilizzando la libreria WebDuino per creare delle pagine web che leggono dei dati dalla seriale.
Grazie,
Stefano.

brunol949

#1
Mar 05, 2012, 04:58 pm Last Edit: Mar 05, 2012, 05:03 pm by brunol949 Reason: 1

Come da titolo vorrei gentilmente sapere se esiste un numero massimo di connessioni simultanee ad arduino.

In giro per il forum parlano che il Wiz... gestisce 4 socket
Poi se questo voglia dire riuscire a gestire 4 client non lo so
Da parte mia , come client , ho fatto prove per collegarmi a 2 Server

Se ne parlava qui
http://arduino.cc/forum/index.php/topic,91968.msg690766.html#msg690766
Le mie opere : Flusso correnti nell'impianto fotovoltaico http://arduino.webveneto.net/energy_control/     PING ed E.Mail http://arduino.web

pitusso

Ciao
direttamente dalla pagina HW dello shield
http://arduino.cc/en/Main/ArduinoEthernetShield
si legge:
Quote
It supports up to four simultaneous socket connections.

monty14

Usando l'arduino ethernet non avevo visto la ethernet shield  che monta lo stesso chip.
Grazie mille per le risposte.
Stefano

pablos

#4
May 06, 2012, 01:43 am Last Edit: May 06, 2012, 01:58 am by pablos Reason: 1
Ciao mi aggrego a questo treadh visto l'argomento compatibile e non trovando info utili su san google.
A me interesserebbe invece sapere come si potrebbe impostare il numero massimo di connessioni simultanee, vorrei che se ne potesse fare una sola

nella libreria ethernet.h troviamo #define MAX_SOCK_NUM 4 , ho provato a cambiarlo, ma non varia nulla, sono sempre possibili più connessioni.

Mi serve limitarlo a 1 per questioni di autorizzazioni alla connessione, una volta che un utente si è connesso si apre una pagina login con metodo post e cifratura su base64, arduino decifra e porta a 1 una variabile auth, con questa posso far funzionare il client.print e quindi l'upload di tutte le pagine verso il browser client.
Il problema è quando far capire ad arduino che c'e' una disconnessione? dato che ogni volta che invia una stinga troviamo in fondo alla funzione un client.stop. Ogni client.stop in teoria risulta essere una disconnessione, ma der resto non posso mettere uno stop alla fine del download della pagina, il buffer è troppo piccolo il chip si schianta alla terza riga.

Una prima soluzione sarebbe mettere un tasto sulla pagina web disconnetti, arduino porterebbe auth a 0 rinviando tutte le richieste successive nuovamente alla pagina login, ma nessuno preme disconnetti, di solito si preme la X e si chiude il browser, arduino rimmarrebbe con autorizzazione aperta  e non va bene

Una seconda soluzione potrebbe essere fatta con un timeout, nessuna richiesta entro 20-30 secondi porta auth a 0, rimarrebbero sempre quei 20-30 sec scoperti, insomma non è proprio il massimo.

Una terza soluzione creare un cookie in javascript contenuto nella pagina html che salva la password e ogni stringa inviata contenga con metodo post la stringa pass+messaggio magari anche criptata, il cookie viene eliminato alla chiusura del browser, ma diventa troppo complicato e poco fluido.

Ecco perchè dovrei limitarlo a uno solo, quando c'e' una connessione autenticata, basterebbe connettersi col secondo che non viene più chiesta la pass essendo auth a 1..... il secondo utente è libero difare cio' che vuole e questo non mi piace.
Il poter limitare a 1 client solo è un passo avanti, non risolve comunque il problema dicsonnessione.

ciao
no comment

bigjohnson

Ciao,
io ho avuto un problema simile con un server telnet basato su arduino, purtroppo con la libreria ethernet attuale non è possibile capire da quale socket stai ricevendo i dati per cui non si può fare una discriminazione tra le 4 connessioni possibili tramite wiznet.
Il mio schetch prevede una connessione aperta e il rifiuto delle altre con un messaggio d'errore.
Ho aperto una richiesta su google code:
http://code.google.com/p/arduino/issues/detail?id=892&start=300
se hai un problema simile vota la mia richiesta così magari implementano prima la soluzione che gli ho proposto.

Alberto

pablos

#6
May 06, 2012, 12:11 pm Last Edit: May 06, 2012, 12:16 pm by pablos Reason: 1
grazie bigjohnson, ci do un occhiata, è possibile però con una piccola modifica della libreria leggere il pacchetto di risposta e vedere con quale browser sei connesso non so quanto può servirti, ma potremmo studiare qualcosa leggendo le risposte.

Connessione ad arduino da browser firefox:
User-Agent: (Windows NT 5.1; rv:12.0) Gecko/20100101 Firefox/12.0

Connessione ad arduino da browser Chrome:
User-Agent: (Windows NT 5.1) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.168 Safari/535.19

Connessione ad arduino da browser MS Explorer:
User-Agent: (compatible; MSIE 7.0; Windows NT 5.1)

Connessione ad arduino da browser Mobile Android HTC Sensation:
User-Agent: (Linux; U; Android 4.0.3; it-it; Sensation_Z710e Build/IML74K) AppleWebKit/534.30 Mobile Safari/534.30

Connessione ad arduino da browser Mobile Android Samsung gt-s5830
User-Agent: (Linux; U; Android 2.2.1; it-it; GT-S5830 Build/FROYO) AppleWebKit/533.1 Mobile Safari/533.1

non ho provato con iphone

però diciamo che se entro pochissimi secondi si legge un altro user agent, lo buttiamo fuori :)
ciao
no comment

bigjohnson

Tragicamente il mio server è telnet, e i client non sono browser web.
Grazie comunque.

Alberto

lucadentella

Ciao

guardando un po' il codice della libreria (in particolare EthernetServer.cpp) è strano che modificando la costante MAX_SOCK_NUM questo accetti comunque 4 connessioni, se guardate infatti è pieno di cicli for tipo

Code: [Select]
  for (int sock = 0; sock < MAX_SOCK_NUM; sock++) {
    EthernetClient client(sock);


se quindi MAX_SOCK_NUM fosse posto ad 1, verrebbe comunque sempre istanziato un solo oggetto EthernetClient in ascolto sulla porta...
lucadentella.it

pablos

#9
May 06, 2012, 11:29 pm Last Edit: May 07, 2012, 12:00 am by pablos Reason: 1
Ciao luca, in effetti ho smanettato un po' sulla libreria e stampato diversi print di debug, ho notato che la variabile _sock restituisce effettivamente il numero di client connessi sono arrivato a visualizzare anche un 4 con 6 connessioni aperte.
La fregatura sta nel fatto (penso io) che ogni pacchetto inviato ci sia un client.connected e un client.stop
Il contatore _sock aggiunge 1 solo nel momento in cui ti trovi dentro il connected e lo stop, varia troppo velocemente per sapere  quante connessioni ci sono in quel preciso istante.
Ne puoi fare anche 15 connessioni contemporanee (attenzione intendo da browsers) la libreria in realtà ne gestisce 4 e vengono aperte e chiuse immediatamente, il primo che fa la richiesta viene servito e chiuso passando a quello successivo, certo il processo diventa barbosamente lento, ottenere un messaggio di "ci dispiace è stato superato il limite delle connessioni" la vedo duretta. Si potrebbe determinare il numero esatto se la memoria del buffer fosse sufficientemente grande da non mettere il client.close per un bel po di dati. Non so se mi sono capito :) magari non uso termini scientifici, spero sia +/- chiaro cosa voglio dire. Se dico qualche fregnaccia insultatemi pure, ma con cautela :) grazie

Quello che mi chiedo: un server è in grado di ricevere più connessioni contemporanee e di soddisfarle tutte, ma è anche in grado di sapere se quello è autenticato e l'altro no, da cosa lo ricosce? dall'ip? una intranet come fastweb dove 1000 utenti escono con lo stesso ip? ogni pacchetto di richiesta è accompagnato da un chiave di riconoscimento? .... come fa?

ciao
no comment

bigjohnson

#10
May 07, 2012, 12:05 am Last Edit: May 07, 2012, 12:08 am by bigjohnson Reason: 1
Dunque,

  • la wiznet mette a disposizione 4 socket

  • tutti i webserver arduiniani che ho visto in giro ne usano solo uno


ma come fanno

  • ricevono un client con available

  • continuano a leggere e a scrivere sul client con read e write

  • chiudono il client o se lo trovano chiuso

  • passano al client successivo


tutte le nuove connessioni che arrivano, mentre arduino serve il client connesso, vengono messe in attesa sui tre socket inutilizzati, se ne arrivano più di tre quelli in eccesso vengono respinti, è difficile accorgersene perché i browser ritentano un po di volte la connessione prima di sparare l'errore, le tre connessioni accettate vengono man mano passate al webserver tramite la chiamata ad available, arduino però comunica solo con un client alla volta e completa tutto il trasferimento dei dati tramite http prima di passare al client successivo.
Il client connect e il client stop non avvengono ad ogni pacchetto ma all'inizio della sessione http e alla fine.

pablos

Hai ragione inteso come sessione http, ho definito pacchetto, perchè in realtà io invio al client una sola stringa zippata con tutte le info di arduino quindi ogni 500ms rispondo a una richiesta web JS 

if client.connected
client.print (stringa compressa)
client.close

grazie per la correzione

ciao
no comment

lucadentella

pablos:

normalmente un webserver in fase di autenticazione crea una "sessione" per il client e invia un identificativo (session_id) tramite cookie al browser. nelle connessioni successive il browser invia al server il cookie contenente il session_id, il server accede alla sessione in base a tale valore e se questa è valida (non è scaduta...) ritiene il client autenticato.

lucadentella.it

pablos

#13
May 07, 2012, 10:48 am Last Edit: May 07, 2012, 10:57 am by pablos Reason: 1

pablos:

normalmente un webserver in fase di autenticazione crea una "sessione" per il client e invia un identificativo (session_id) tramite cookie al browser. nelle connessioni successive il browser invia al server il cookie contenente il session_id, il server accede alla sessione in base a tale valore e se questa è valida (non è scaduta...) ritiene il client autenticato.




Perfetto, sei un pozzo di scienza :) ... farò così, arduino potrebbe creare una chiave casuale dopo l'autenticazione e spedirla al client che poi la mette nel cookie, ho visto come creare i cookie e non è difficile.
In questo modo contando il numero di chiavi create posso sapere quante persone sono collegate, è geniale :)
grazie !!

mmmmm.... ma arduino come cancella la chiave a sessione scaduta? bho proverò un timeout ....
no comment

Go Up