PDA

Visualizza la versione completa : Chiamata tramite POST o GET per attivazione relay da pagina web


viemme
31-03-2017, 18:27
Buongiorno
Utilizzo da diverso tempo dei web relay su di una scheda Arduino che attivo tramite script da linux con comando "wget http://indirizzo_ip_scheda/?r4=Pls" e tutto funziona tranquillamente.
Ora sto cercando di creare una pagina html su di un web server che raggruppi l'immagine di una telecamera ed i pulsanti per attivare i web relay.
Il codice che ho inserito nella pagina, per quanto riguarda i pulsanti, ha questo formato:

<form action="http://192.168.251.136/?r4=Pls" method="get">
<input name "Button1" type="submit" value="APRE" />
</form>

Il problema è che il metodo utilizzato è sbagliato. Il relay non scatta ed oltretutto la pagina, giustamente, viene sostituita con la pagina di errore generata dalla scheda web relay.
Nonostante diverse ricerche in rete, non ho però trovato un metodo per passare il comando al web relay, scartarne la risposta e rimanere sulla mia bella paginetta con l'immagine della telecamera ed i pulsanti.

I test li ho effettuati appoggiando la pagina html su xampp installato in locale.

Spero di aver inserito il post nella sezione corretta e sopratutto che qualcuno possa indirizzarmi sulla giusta via.

Vittorio

Vincent.Zeno
31-03-2017, 18:36
sposto in makers ;)

viemme
31-03-2017, 18:55
Grazie Vincent.Zeno
Pensavo che la sezione html fosse più adatta visto che si tratta di una pagina html non su arduino, che richiama qualcos'altro, ma sicuramente va meglio così.

Enzo SIMONELLI
06-04-2017, 23:17
name "Button1"
manca l' uguale =

La pagina web potresti farla che contiene un iframe dimodoché la pagina di errore, nel caso avvenga, si vada ad aprire e visualizzare nell' iframe senza abbandonare la pagina madre.

viemme
07-04-2017, 11:24
Ti ringrazio Enzo per la risposta ed avermi indirizzato nella giusta direzione per capire il problema. Ho ri-studiato il comportamento di "form" e capito che inviavo dei dati non corretti alla pagina.
Ora ho modificato completamente la logica inserendo un button che richiama uno script il quale gestisce apertura e chiusura della pagina relativa al relay.
Grazie

Vincent.Zeno
07-04-2017, 11:32
ho modificato completamente la logica inserendo un button che richiama uno script il quale gestisce apertura e chiusura della pagina relativa al relay.

puoi postare l'esempio pratico così che possa essere utile anche ad altri?;)

viemme
07-04-2017, 12:06
Certo che posto l'esempio :) Eccolo!
Sulla pagina ho messo un pulsante che richiama lo script Pulse_1.
Lo script apre la pagina richiamata dall'arduino in un popup di piccole dimensioni (30 x 30) e lo chiude dopo 100 millisecondi (un decimo di secondo)


<p>
<button onclick="Pulse_1()">APRE</button>
</p>

<script>

function Pulse_1()
{
var win = window.open( "http://192.1.1.52/system/status.xml?rpl=1", "myWindow","status = 1, height = 30, width = 30, resizable = 0" );
setTimeout( function()
{
win.close();
}, 100);
}

Vincent.Zeno
07-04-2017, 12:50
in una logica di igiene... è possibile eseguire il file in questione senza far apparire un popup?

viemme
07-04-2017, 13:16
in una logica di igiene... è possibile eseguire il file in questione senza far apparire un popup?

Mi piacerebbe ma non ne ho trovato il modo:bhò:
Chissà mai che non arrivi qualche suggerimento per farlo:confused:

U235
07-04-2017, 16:31
Mi piacerebbe ma non ne ho trovato il modo:bhò:
Chissà mai che non arrivi qualche suggerimento per farlo:confused:

Se vuoi posso provarci... ;)

fai eseguire la chiamata ad arduino dal server, non dal client. Inoltre in questo modo eviti che molti client facciano richieste simultanee, ma centralizzi tutte le richieste dando tu le priorità ed eliminando i "doppioni" e le chiamate errate, una volta ottenuto il risultato lo "giri" al client.
In pratica:
Fai fare una chiamata in background al client verso il server (predisponi webapi sul server) il server controlla lo stato e determina se fare o meno la chiamata ad arduino (inutile accendere una luce già accesa, questo può avvenire se due client si connettono e tentano di fare la stessa azione), una volta fatta la richiesta ed ottenuto una risposta da arduino, il server restituisce al client l'esito della chiamata. Tutto tramite ajax.
Oppure, se il controllo richiede un aggiornamento frequente (ad esempio devi rilevare continuamente lo stato di un sensore), puoi anche fare in modo che il server chiami in maniera cadenzata arduino memorizzando lo stato (o trasmettendolo direttamente al client vedi sistemi tipo signalr per windows) e quando il client richiede lo stato al server questo li da l'ultimo rilevato. In questo caso sarebbe ancora meglio se a comunicare il suo stato fosse arduino stesso, facendo chiamate da arduino verso il server inviando il suo stato, in questo modo ad ogni chiamata di arduino il server memorizza lo stato attuale e risponde con lo stato "desiderato". In pratica fai in modo che il client che vuole leggere lo stato, possa vedere l'ultimo memorizzato, e se vuole cambiarlo invia una richiesta al server che memorizza lo stato desiderato, e questo verrà inviato come risposta alla successiva chiamata che farà arduino.
Inoltre facendo comunicare SOLO il server con arduino, risolvi eventuali problemi di prestazioni ridotte di arduino, che nonostante faccia il suo dovere potrebbe risentire di molti client differenti connessi in simultanea. Oltre al fatto che sarebbe più facile da controllare sotto il punto di vista della sicurezza. Usando poi la tecnica della chiamata da arduino a server risolvi invece anche il problema di configurazione del router e di un eventuale ip dinamico.

Loading