Thread Rating:
  • 1 Vote(s) - 5 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Risolto! Comandare upanel in modo asincrono anche da browser
#2
Ciao Enzo,

si, è possibile inviare comandi tramite browser utilizzando le socket TCP. Per prima cosa devi installare un server su una porta, ad esempio 2020:

$TCP0:LAHQ::2020:OK

in pratica questo comando installa sulla porta 2020 un server che processa richieste HTTP. Appena il browser si collega, legge la richiesta GET e la invia ad Arduino (flag H), rispondendo al browser con il messaggio "OK" e chiudendo la connessione subito dopo (flag Q).

A questo punto devi processare la richiesto con Arduino. Ad esempio, inserendo nel browser:

http://192.168.1.103:2020/CMD?W10 

la risposta sarà del tipo:

Code:
$TCP0:CONNECTED
$TCP0:>H:GET /CMD?W11 HTTP/1.1
$TCP0:SENT:1
$TCP0:DISCONNECTED

Basta quindi andare a processare la seconda riga, estraendo tutto quello che segue il punto di domanda fino al primo spazio. 
Il codice che segue ad esempio preleva il testo dopo il punto di domanda, aggiunge il simbolo # e lo invia al modulo uPanel.


Code:
 if (WaitMessage(1))
 {
   if (Msg.substring(0,18).equals("$TCP0:>H:GET /CMD?"))
   {
     int p = Msg.substring(18).indexOf(" ");
     if (p > 0) Serial1.println("#"+Msg.substring(18,18+p));
   }
 }

Con questo codice potrai inviare qualunque aggiornamento del pannello da browser. Ad esempio:

http://192.168.1.103:2020/CMD?W10
http://192.168.1.103:2020/CMD?W11
http://192.168.1.103:2020/CMD?L11

etc..

Per ragioni di sicurezza cambierei CMD con una stringa più lunga, che funge da password.

Per completezza, allego tutto il codice provato su KIT3 (Cactus)


Code:
#define PIN_GPIO_0   12
#define PIN_CH_PD    13
#define PIN_RESET    22

void setup() {
 // put your setup code here, to run once:

 pinMode(PIN_GPIO_0, OUTPUT);
 pinMode(PIN_CH_PD,  OUTPUT);
 pinMode(PIN_RESET,  OUTPUT);
 
 digitalWrite(PIN_GPIO_0,1);
 digitalWrite(PIN_CH_PD,1);
 
 digitalWrite(PIN_RESET,0);  // Reset
 
 Serial.begin(57600);
 
 delay(250);
 
 digitalWrite(PIN_RESET,1);  // Release Reset
 
 delay(5000);
 Serial1.begin(57600);
 
 delay(5000);
 
 Serial1.println("$TCP0:LAHQ::2020:OK");
 Serial1.println("$P:W1:0;L1G:0:Test Led;");
 
}


String Msg = "";
/*****************************************************
* This function waits a data message from the uPanel
*
* Input: timeout_ms time to wait for message
*        -1 for forever
* Return: 0 = Timeout, 1 = Message received
******************************************************/
int WaitMessage(int timeout_ms)
{
 int c;                                // the received byte
 unsigned long entrytime = millis();   // Read the time at the function entry
 static char KeepBuffer = 0;           // This tells if we have a partial message in the buffer

 if (!KeepBuffer) Msg = "";            // If Keepbuffer is false than clear the old message
 KeepBuffer = 0;                       // in any case set now the keep buffer to false
 
 do
 {
   while ((c = Serial1.read()) > '\n') {Msg += (char) c;}  // Read incoming chars, if any, until new line
   if (c == '\n')                                       // is message complete?
   {
     //Serial.println(Msg);
     if (Msg.substring(0,1).equals("#")) return 1;      // if it is a data message return 1
     if (Msg.substring(0,1).equals("$")) return 1;      // if it is a data message return 1
     Msg = "";                                          // otherwise, wait for another one
   }
 } while ((timeout_ms < 0) || (millis()-entrytime < timeout_ms));  // has max time passed?
 
 KeepBuffer = 1;                                                   // Keep the partial buffer content
 return 0;                                                         // if time passed, return 0
}


void loop() {
 // put your main code here, to run repeatedly:

 int c = 0;
 
 if (WaitMessage(1))
 {
    if (Msg.substring(0,18).equals("$TCP0:>H:GET /CMD?"))
   {
     int p = Msg.substring(18).indexOf(" ");
     if (p > 0)
     {
       Serial1.println("#"+Msg.substring(18,18+p));
     }
   }
   
 }
 
 c = 0;  
 while(c >= 0)
 { c = Serial.read();  if (c >= 0) Serial1.write(c); }

}
Reply


Messages In This Thread
RE: Comandare upanel in modo asincrono anche da browser - by Simone - 06-11-2016, 06:26 PM

Forum Jump:


Users browsing this thread: 1 Guest(s)