Documente Academic
Documente Profesional
Documente Cultură
WebCl
ient-PHP-User
Problemas que vamos a evitar en modo Cliente
La aplicacin sobre Arduino ser del tipo WebClient y no Server, dado que en
modo WebClient no vamos a depender de las direcciones IP pblicas que se
modifican cada determinado tiempo si tuvisemos el modo Server en Arduino.
En modo Servidor, nuestro Router le asigna una direccin IP a Arduino para
poder distinguirlo dentro de nuestra red local . El Router le asigna una direccin
de IP de manera dinmica por medio del servicio de DHCP, esto quiere decir
que la IP de Arduino se va a modificar cada determinado tiempo, por lo que
ser necesario decirle al Router que dicha IP se mantenga fija ya que en
nuestro sketch de arduino debemos indicarla. DHCP asigna la IP de acuerdo a la
direccin fsica MAC de la placa que suele venir identificada sobre la W5100,
caso contrario se puede usar cualquiera. Se puede tambin asignar a nuestro
arduino un IP fija pero como los dems dispositivos conectados al Router en
una red local (celulares, Pcs, etc) son de IP dinmica, pueden colisionar en
algn momento con otras IP dejar de funcionar. Dependiendo del Router, se
puede configurar que DHCP siempre asigne la misma IP a una direccin MAC
determinada y aunque no es el objetivo en este trabajo, generalmente es la
opcin DHCP Settings y MAC assignment. Hasta aqu podremos usar siempre
nuestro sistema pero de forma local, es decir va LAN, si queremos acceder a
nuestro sistema desde fuera como internet WAN habr que abrir un puerto
adicional en el Router para redireccionar el trfico de datos desde internet
P
agina Hosting que ve usuario , no el WebClient
P
agina Hosting Usuario
La esttica la dejo para otro momento ya que no es importante colocar
maquetado, estilos, colores, etc. No obstante he agregado un archivo estilo.css
para dar algo de color a la tabla de estas 4 salidas.
PHP
<html>
// Con Hostinger acceder como
<head>
<html>
2
3
<head>
</head>
<body>
<?php
$ar=fopen("archivocontrol.txt","r") or
10
11
12
while (!feof($ar))
13
14
15
16
$linea=fgets($ar);
17
//echo $linea;
18
19
20
21
}
fclose($ar);
// En $linea tengo el estado de las salidas en una cadena debo
procesarla
22
$estado1= substr($linea,5,1);
23
//echo $estado1;
24
$estado2= substr($linea,11,1);
25
//echo $estado2;
26
$estado3= substr($linea,17,1);
27
//echo $estado3;
28
$estado4= substr($linea,23,1);
29
//echo $estado4;
30
$idcambio=0;
31
$cambio="No realizado";
32
$cantidad= strlen($linea);
33
//echo $cantidad;
34
35
36
37
$confirma=substr($linea,24,1);
38
//echo $confirma;
39
40
{$cambio="Cambio realizado";
41
$idcambio=1;
42
43
44
45
46
47
48
49
?>
<p><h3>CONTROL DE SALIDAS</h3></p>
<form name="salidas" method="post" action="ArchivoControl.php">
<table border=1 bordercolor=blue >
<tr>
50
<?php if ($estado1==1)
51
52
53
54
55
else{
56
57
58
}
if ($estado2==1)
59
60
61
62
{
echo "<td class=col><h4>SALIDA_2</h4><input type=\"checkbox\"
name=\"sal2\" value=\"1\" checked ></td>";
63
64
else{
65
66
67
68
}
if ($estado3==1)
{
69
70
71
72
else{
73
74
75
76
if ($estado4==1)
{
77
78
79
80
81
82
83
84
?>
85
86
</tr>
87
<tr></tr><tr></tr>
88
</table>
89
<br>
90
<?php
91
92
if($idcambio==0)
{
93
echo $cambio;
94
95
else{
96
97
98
?>
99
<br>
10
0
<br>
10
1
ArchivoControl.php
2
3
<html>
<head>
</head>
<body>
<?php
$estado1=0;
$estado2=0;
1
0
$estado3=0;
$estado4=0;
1
1
1
2
if (isset($_REQUEST['sal1']))
{
$estado1=$_REQUEST['sal1'];
1
3
1
4
1
5
1
6
1
7
1
8
1
9
2
0
if (isset($_REQUEST['sal2']))
$estado2=$_REQUEST['sal2'];
}
if (isset($_REQUEST['sal3']))
{
$estado3=$_REQUEST['sal3'];
}
if (isset($_REQUEST['sal4']))
{
$estado4=$_REQUEST['sal4'];
}
2
1
$cadena="sal1=".$estado1."sal2=".$estado2."sal3=".$estado3."sal4=".
$estado4."NO REALIZADO";
2
2
2
3
2
4
2
5
2
6
2
//echo $cadena;
$ar=fopen("archivocontrol.txt","w") or
die("Problemas en la creacion");
fputs($ar,$cadena);
//fputs($ar,"br");
fclose($ar);
7
2
8
2
9
3
0
3
1
3
2
3
3
3
4
3
5
3
6
3
7
3
8
3
9
4
0
4
1
4
2
4
echo "
";
echo "
";
echo "Los datos se cargaron correctamente.";
echo "
";
echo "
";
?>
<a href="salidas.php">Volver</a>
3
4
4
4
5
4
6
4
7
4
8
Esta pgina ArchivosControl.php simplemente detecta las variables pasadas
por mtodo POST desde la pgina anterior y saber cules salidas se han
tildado, o destildado y de esta manera rescribir el archivocontrol.txt , para
actualizar la cadena nueva concatenado ahora con NO REALIZADO ya que la
cadena ha cambiado y el Webclient (Arduino), debe saber de esta manera, al
hacer su consulta, que debe efectuar sus modificaciones.
El botn LeerEstado es redundante y no hara falta pero lo que hace es llamar a
otra pgina LecturaArchivo.php
<form name=estadoActual method=post action=LecturaArchivo.php>
<input type=submit name=botonLeer value=LeerEstado>
</form>
LecturaArchivo.php
Esta pgina lo que hace ( ya dije que redundante) es leer el archivo y presentar
en otro formato la informacin de las salidas.
Vista Salidas
PHP
LecturaArchivo.php
<html>
<head>
</head>
LecturaArchivo.php
<html>
<head>
</head>
<body>
<?php
$ar=fopen("archivocontrol.txt","r") or
while (!feof($ar))
10
11
12
$linea=fgets($ar);
13
14
15
fclose($ar);
16
//echo $linea;
17
echo '';
18
echo '';
19
$estado1= substr($linea,5,1);
20
//echo $estado1;
21
$estado2= substr($linea,11,1);
22
//echo $estado2;
23
$estado3= substr($linea,17,1);
24
//echo $estado3;
25
$estado4= substr($linea,23,1);
26
//echo $estado4;
27
$est1="Desactivada";
28
$est2="Desactivada";
29
$est3="Desactivada";
30
$est4="Desactivada";
31
if($estado1==1)
32
{$est1="Activada";}
33
if($estado2==1)
34
{$est2="Activada";}
35
if($estado3==1)
36
{$est3="Activada";}
37
if($estado4==1)
38
{$est4="Activada";}
39
?>
requerimiento.php
Esta pgina no est accesible al usuario y es la pgina que va a consultar el
WebClient (Arduino) mediante peticiones del tipo GET.
PHP
</head>
<body>
<?php
</head>
<body>
<?php
4
5
6
// http://www.guscir.hol.es/requerimiento.php?consulta=2 se llama de
esta manera
// No necesariamente habra que pedir con una variable, puede que solo el
servidor responda sin necesidad de pasarle una variable, segn sea la
necesidad
// http://www.guscir.hol.es/requerimiento.php
1
0
$ar=fopen("archivocontrol.txt","r") or
1
1
1
2
1
3
1
4
1
5
}
fclose($ar);
if(!empty($_GET['consulta']) && $_GET['consulta']==1) // El cliente pide
consulta de las salidas, su estado
1
6
1
7
echo $linea;
1
8
1
9
2
0
2
1
2
2
{
$linea=substr($linea,0,24); // Captura el estado de las salidas para
filtrar el NO REALIZADO
$ar=fopen("archivocontrol.txt","w") or
2
3
die("Problemas en la creacion");
2
4
date_default_timezone_set('America/Argentina/Cordoba'); // Actualiza a
zona horaria America ya que sino devuelve hora Espaa
2
5
2
6
2
7
2
8
2
9
3
0
3
1
3
2
3
3
3
fclose($ar);
echo "okey";
}
?>
4
3
5
3
6
3
7
Peticiones WebClient
El cliente acceder a esta pgina mediante:
http://www.guscir.hol.es/requerimiento.php?consulta=1
Si observamos bien, el parmetro que pasa el WebClient a la pgina es
consulta con un valor de 1, en este caso.Consulta=1, le indicar a la pgina
Php que solo debe leer el archivo archivocontrol.txt para extraer la cadena de
salida.
if(!empty($_GET['consulta']) &&
{
echo $linea; // RENVIA LA CA
}
1
2
3
4
5
6
7
$ar=fopen("archivocontrol.txt","w") or
die("Problemas en la creacion");
1
0
1
1
1
2
date_default_timezone_set('America/Argentina/Cordoba'); // Actualiza a
zona horaria America ya que sino devuelve hora Espaa $time = date("Ym-d | h:N:s |", time() ) ;
fputs($ar,$linea."REALIZADO"."-".$time); // Reescribe archivo con la
indicacin de realizado
//fputs($ar,"br");
fclose($ar);
echo "okey";
}
/*
Web client
*/
6
7
#include <SPI.h>
#include <Ethernet.h>
9
10
11
12
13
14
15
16
17
18
19
20
21
22
EthernetClient client;
23
24
25
26
27
28
29
30
31
String cadena="";
32
33
34
35
36
37
void setup() {
38
39
Serial.begin(9600);
40
41
42
43
44
45
46
Ethernet.begin(mac, Myip);
47
}
48
49
delay(1000);
50
cadena = cadConsulta;
51
52
}// setup
53
54
55
56
57
58
59
60
61
62
void loop()
{
// if there are incoming bytes available
// from the server, read them and print them:
if(millis()-start>=periodoConexion)
{
start=millis();
if(flagMod==1) // hay que enviar un GET consulta=2 para notificar
que se hizo el cambio
{ cadena = cadRespuesta;
63
64
Serial.println(cadena);
65
66
67
68
else {
69
cadena = cadConsulta;
70
Serial.println("Enviando connsulta");
71
Serial.println(cadena);
72
73
if(httpRequest(cadena)==1)
74
75
respuesta();
76
77
78
}// millis
79
80
81
82
83
84
Serial.println("connecting...");
85
86
87
Serial.println("connected");
88
flagCon=1;
89
90
91
esta forma
92
client.println(cad);
93
94
//client.println("Host: www.google.com");
95
client.println("Host: www.guscir.hol.es");
96
97
98
}
99
else {
10
0
10
1
Serial.println("connection failed");
Serial.println("desconectando");
10
2
client.stop();
flagCon=0;
10
3
10
4
10
5
10
6
10
7
10
8
10
9
11
}
delay(2000); // damos tiempo
return flagCon;
}
11
1
c = client.read();
11
2
11
3
11
4
11
5
11
6
11
7
11
8
11
9
12
0
12
1
12
2
12
3
12
4
12
5
12
6
rx+=c; // Concatenamos
Serial.print(c);// A su vez vamos viendo en el monitor todo lo que
recibimos caracter por vez
} // while
client.stop(); // Detenemos el cliente , es decir cerramos la conexin del
cliente cuando termina la respuesta
// Si no se hace esto y se vuelve a intentar conectar da FALLA
// ANALIZAMOS LA CADENA DE RESPUESTA
//**********************************
//int longitud= rx.length(); // tomamos longitud de la cadena
int pos; // Posicin de inicio de subcadena sal1= , por GET consulta=1
int posok; // Posicion de inicio de subcadena okey por GET consulta=2
pos=rx.indexOf("sal1="); // Tomo la posicin del inicio de la subcadena
posok=rx.indexOf("okey");
//Serial.print("posicion de sal :");
//Serial.println(pos);
// Lo que me interesa son los 24 caracteres a partir de la posicin
detectada que incluye la N de no realizado y la R de realizado
if(pos!=-1) // indica que encontro subcadena sal1=
{
subx=rx.substring(pos,pos+25); // el parametro TO es no inclusivo,
por eso es 25 y no pos+24
Serial.print("La subcadena filtrada de interes es :");
12
7
12
8
Serial.println(subx);
12
9
{
Serial.println("NO HAY QUE MODIFICAR NADA !!!!!!!");
13
0
flagMod=0;
13
1
13
2
13
3
13
4
13
5
}
if (subx.charAt(24)=='N') // Hay que modificar las salidas ya que es
la N de no realizado
{
Serial.println("HAY QUE MODIFICAR lAS SALIDAS DIGITALES");
modificarSalida(subx); // funcion que procesa el estado de las
salidas, las separa
}
13
6
13
7
}// pos
if(posok!=-1) // indica que encontro subcadena okey en respuesta de
consulta=2
{
13
8
13
9
14
0
14
1
}
}
14
2
14
nuestra aplicacin
14
4
14
5
*/
int salida1,salida2,salida3,salida4;
14
6
salida1=cade.charAt(5)-'0';
14
7
salida2=cade.charAt(11)-'0';
14
8
salida4=cade.charAt(23)-'0';
salida3=cade.charAt(17)-'0';
Serial.print("SALIDA 1: ");
14
9
Serial.println(salida1);
15
0
Serial.print("SALIDA 2: ");
Serial.println(salida2);
15
1
Serial.print("SALIDA 3: ");
Serial.println(salida3);
15
2
Serial.print("SALIDA 4: ");
15
3
Serial.println(salida4);
flagMod=1;
15
4
15
5
15
6
15
7
15
8
15
9
16
0
16
1
16
2
16
3
16
4
16
5
16
6
16
7
16
8
16
9
17
0
17
1
17
2
17
3
Caracteristicas del Software
boolean httpRequest (String cad ) Es una funcin que se encarga de realizar la
conexin al servidor y realizar las consultas GET que pueden ser, como vimos ,
de dos tipos:
Es
quema Aplicacion WebClient
Capturas en el Monitor serie de Arduino WebClient
Consulta WebClient, donde No hay Modificaciones
Consulta
Peticin con valor=1
Consulta WebClient, donde hay Modificaciones que realizar
Consulta con
Valor=1 y cadena modificada por Usuario
Consulta WebClient de Confirmacin y acuse de recibo