inviare dati ad arduino tramite pagina asp.net

Buongiorno ragazzi, avevo realizzato un piccolo progetto per la gestione (accensione e spegnimento) di pompe luci con arduino mega + ethernet sheild , dove arduino faceva da server. Tutto funzionante con adsl di casa. Ma il mio progetto doveva funzionare in campagna , quindi ho preso un router 3g ho messo una scheda dati vodafone e qui ho scoperto che non tutte le sim hanno ip pubblico , anzi sono pochi gli operatori che lo fanno e non è facile avere.
A questo punto ho pensato di cambiare sistema, cioè far diventare arduino client e gestirlo tramite pagina web in asp.net( perchè ho gia un sito su un server windows).
Ho fatto tante ricerche , ma non arrivo mai a comprendere il punto focale su come impostarlo. E capire perfettamente il funzionamento del GET.
In rete ho travato un codice che fa il contrario, cioè invia da arduino al server , ve lo mostro:

ARDUINO :

#include <SPI.h>
#include <Ethernet.h>
byte mac[] = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //assegnamo un mac addres alla nostra arduino
byte ip[] = {
192,168,2,20 }; //assegnamo un ip
byte server[] = {
46,16,168,17 }; //l’ip del web service
Client client(server, 80);
//istanziamo un client che lavora sull’ip del web service sulla porta 80
void setup() {
    Ethernet.begin(mac, ip);
    //istanziamo l’ethernet shield con mac ed ip
    Serial.begin(9600);
}
void loop()
{
    delay(1000);
    Serial.println(“connecting…”);
    client.connect(); //ci colleghiamo con i parametri di cui sopra
    if (client.connected()) {
        Serial.println(“connected”);
        //la nostra GET:
        client.println(“GET http://www.QUALCOSA.com/acquire.aspx?username=USERFROMARDUINO&password=PASSFROMARDUINO&
                        datastream=DATASTREAMFROMARDUINO&value=VALUEFROMARDUINO HTTP/1.1″);
        client.println ( “Host: http://www.QUALCOSA.com” ) ;
        client.println(); //chiudere sempre con uno spazio vuoto
    }
    else {
        Serial.println(“connection failed”);
    }
    if (client.available()) {
        //stampiamo tutti i caratteri in risposta dal web service
        do {
            char c = client.read();
            Serial.print(c);
        }
        while (client.available());
    }
    if (!client.connected()) { //stoppiamo il nostro client
        Serial.println();
        Serial.println(“disconnecting.”);
        client.stop();
    }
}
<%@ Page Language=”C#” AutoEventWireup=”true” CodeFile=”acquire.aspx.cs”
Inherits=”acquire” %>
    <!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
    <html xmlns=”http://www.w3.org/1999/xhtml”>
        <head runat=”server”>
            <title></title>
        </head>
        <body>
            <form id=”form1″ runat=”server”>
                <div>
                    <asp:TextBox ID=”TextBox1″ runat=”server”></asp:TextBox>
                    <asp:TextBox ID=”TextBox2″ runat=”server”></asp:TextBox>
                    <asp:TextBox ID=”TextBox3″ runat=”server”></asp:TextBox>
                    <asp:TextBox ID=”TextBox4″ runat=”server”></asp:TextBox>
                </div>
            </form>
        </body> 
    </html>

C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class acquire : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        TextBox1.Text = Request.QueryString["username"];
        TextBox2.Text = Request.QueryString["password"];
        TextBox3.Text = Request.QueryString["datastream"];
        TextBox4.Text = Request.QueryString["value"];
    }
}

Sapete aiutarmi in qualche modo?

Da quello che ho capito io , dovrei fare una richiesta ogni secondo sul server e vedere se ci sono richieste e a quel punto elaborale , ma il problema è ma come?

Grazie

Premetto che sono molto ignorante in materia, quindi forse scriverò inesattezze.
Hai pensato all'uso di una VPN? Cioè hai controllato se sul router 3g con SIM se ne può impostare una?
Una soluzione del genere potrebbe consentirti di non stravolgere il programma su Arduino.

  1. puoi avere IP non pubblico ed usare un servizio tipo NOIP o MYDNS (a pagamento) o dynDNS.it
  2. se Arduino diventa client devi pensarlo come se fosse un browser che spedisce richieste al tuo server (asp).
    Di solito fai richieste per avere risposta ma non è obbligatorio. Nella richiesta spedisci dei dati. Eventualmente la risposta potrebbe essere semplicemente okay.
    Prova a vedere esempi web dove il client Arduino interroga un server già esistente, tipo sito google.
    Arduino - EthernetClient

Grazie mille per le risposte!
Io vorrei fare la soluzione 2 , con arduino che diventa client. Ho fatto altre ricerche e ho capito che io in qualche modo devo leggere la risposta che mi da il server , e questo lato arduino ho capito come fare . Ma lato server ?
Come si fa a inserire un valore da poi cercare in asp.net o php ?
Ad esempio vorrei che tra la risposta che ricevo ci fosse motor1On.
C’è qualche guida da leggere ?
Altra domanda più importante ogni quanti secondi posso interrogare il server per vedere se c’è una nuova istruzione?1 volta al secondo si può ? O il server impazzisce?
Grazie

PaoloMonte:
Io vorrei fare la soluzione 2 , con arduino che diventa client. Ho fatto altre ricerche e ho capito che io in qualche modo devo leggere la risposta che mi da il server , e questo lato arduino ho capito come fare . Ma lato server ?
Come si fa a inserire un valore da poi cercare in asp.net o php ?
Ad esempio vorrei che tra la risposta che ricevo ci fosse motor1On.

Te l'ha detto nid69ita, "se Arduino diventa client devi pensarlo come se fosse un browser che spedisce richieste al tuo server (asp)" il che significa che puoi realizzare la tua applicazione ASP alla quale passare dei parametri nel GET (se non sai come leggere i parametri passati ad una pagina ASPX, mi sa che devi ripassare un poco di .NET, cosa che non possiamo consigliarti qui...), cosa che potrai testare anche senza Arduino ossia richiamandola a mano con un browser (es. "http://localhost/miaapp/arduino.aspx?action=motor1On").
E' questo che chiedevi?

Si più o meno è questo quello che chiedo , ma sulla mia seconda domanda ? Cioè qual'è il tempo minimo di richiesto da parte di arduino? Posso impostare una richiesta al secondo per avere una corrispondenza veloce ? Se no quanto dovrei mettere ?

La velocità di interrogazione (e quindi relativa risposta) dipende dal tuo web server, dalla qualità della linea dati, e dalla quantità di dati da scambiare, più che da Arduino (che potrebbe anche fartene un migliaio al secondo).

Ma in linea di massima direi che un poll al secondo solo per avere lo stato di un elemento lo gestisci pure con l'IIS di Windows XP. :slight_smile:

Ma non scartare il consiglio di krypton18, se il tuo router può gestire una VPN con quello di casa potresti risolvere senza modificare nulla.