Pages: [1]   Go Down
Author Topic: Numero massimo connessioni simultanee WebDuino  (Read 2402 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 54
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Malo ( VI )
Offline Offline
Sr. Member
****
Karma: 0
Posts: 372
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
« Last Edit: March 05, 2012, 11:03:19 am by brunol949 » Logged

Le mie opere : Flusso correnti nell'impianto fotovoltaico http://arduino.webveneto.net/energy_control/     PING ed E.Mail http://arduino.web

0
Offline Offline
Edison Member
*
Karma: 24
Posts: 2309
Have you mooed today?
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 54
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Genova
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3391
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
 
« Last Edit: May 05, 2012, 06:58:56 pm by pablos » Logged

no comment

Milan, Italy
Offline Offline
Sr. Member
****
Karma: 0
Posts: 346
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged


Genova
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3391
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley
ciao
« Last Edit: May 06, 2012, 05:16:20 am by pablos » Logged

no comment

Milan, Italy
Offline Offline
Sr. Member
****
Karma: 0
Posts: 346
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Alberto
Logged


Bergamo
Offline Offline
God Member
*****
Karma: 1
Posts: 663
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
  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...
Logged

lucadentella.it

Genova
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3391
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley magari non uso termini scientifici, spero sia +/- chiaro cosa voglio dire. Se dico qualche fregnaccia insultatemi pure, ma con cautela smiley 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
« Last Edit: May 06, 2012, 05:00:32 pm by pablos » Logged

no comment

Milan, Italy
Offline Offline
Sr. Member
****
Karma: 0
Posts: 346
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
« Last Edit: May 06, 2012, 05:08:19 pm by bigjohnson » Logged


Genova
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3391
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

no comment

Bergamo
Offline Offline
God Member
*****
Karma: 1
Posts: 663
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.

Logged

lucadentella.it

Genova
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3391
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley ... 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 smiley
grazie !!

mmmmm.... ma arduino come cancella la chiave a sessione scaduta? bho proverò un timeout ....
« Last Edit: May 07, 2012, 03:57:59 am by pablos » Logged

no comment

Pages: [1]   Go Up
Jump to: