Ethernet TCP-yhteys Arduinon kanssa
Ohjelmiston näkökulmasta yhteyden muodostaminen Ethernet kanssa Työläs Se on hyvin yksinkertainen. Käytä tätä varten Ethernet-kirjasto. Tämä kirjasto on suunniteltu a Ethernet-suoja joka perustuu integroituun W5100, mutta on olemassa muitakin erilaisia kortteja tai moduuleja ja/tai jotka käyttävät muita integroituja, kuten ENC28J60. Yksinkertaistaakseen sen käyttöä ja lisätäkseen yhteensopivuutta, muut kirjastot käyttävät (melkein) samaa API että Ethernet-kirjasto, sinun tulee vain korvata vaihtoehtoinen kirjasto alkuperäisellä tai sisällyttää se (kun nimi on eri) sen tilalle, vaikka koodissa käytettäisiin samoja (tai hyvin samankaltaisia) toimintoja. Omassa tapauksessani käytän UIPEthernet-kirjasto de Norbert Truchsess noudattaen samaa prosessia, jota aion kuvata tässä tekstissä.
1. Määritä Ethernet-yhteys
Aiotteko omaksua roolin asiakas kuten yksi palvelin, sinun on ensin määritettävä yhteys funktioon alkaa () joka voidaan välittää parametrina vain MAC-osoite ja odota palvelinta DHCP määritä verkossa a IP-osoite ja loput kokoonpanosta tai on myös mahdollista ilmoittaa (valinnaisesti) lisää parametreja, kunnes täydellinen konfiguraatio on määritetty:
- Dirección MAC (joka on jo mainittu)
- IP-osoite suojasta tai moduulista
- Palvelimen IP-osoite DNS (vain yksi palvelin)
- IP-osoite Yhdyskäytävä
- Verkon naamio
On suositeltavaa ilmoittaa kaikki parametrit, ellei niiden vähennys ole tavallinen, jotta konfiguraatio ei ole oikea (esimerkiksi se, että yhdyskäytävä ei ole verkon ensimmäinen osoite).
Edellä olevan perusteella näyttää selvältä, että IP-osoitteita edustavaa dataa on käytettävä melko usein, minkä vuoksi kirjasto sisältää luokan IP-osoite josta IP-osoiteobjektit luodaan. Sen määrittävät parametrit ovat osoitteen neljä tavua IPV4
La MAC-osoite Se on määritelty tälle kirjastolle 6-tavuiseksi taulukoksi. MAC-osoite on (oletettavasti) yksilöllinen tunniste, jonka ensimmäiset tavut osoittavat valmistajan ja mallin ja viimeiset tavut tietyn laitteen. Integroitu ENC28J60 ei sisällä MAC-osoitetta, ellet päätä ostaa myös a Integroitu MAC-osoite Microchipistä (tai koko lohko KYLLÄ osoitteista IEEE jos laitteiden määrä on tarpeeksi suuri, jotta se kannattaa). Kun sinulla ei ole MAC-osoitetta, voit keksiä sellaisen varmistaen, että se ei ole ristiriidassa muiden verkon kanssa, jossa laite sijaitsee.
Jos konfigurointi tehdään DHCP-palvelimella "käsin" sijaan, toiminto localIP() On hyödyllistä tarkistaa osoite, jonka palvelin on määrittänyt moduulille. Uusiaksesi osoitetun osoitteen (jos vastaava aika on umpeutunut) Ethernet-kirjasto tarjoaa toiminnon ylläpitää () joka myös ilmoittaa palauttamalla koodin, joka vastaa uusimisen tilaa:
- Operaatiolla ei ole ollut vaikutusta
-
Virhe uusittaessa IP-osoitetta
Määritetyn IP-osoitteen käyttöä samalla palvelimella ei voitu laajentaa - IP-osoitteen uusiminen onnistui
-
IP-osoitteen uudelleensidonta epäonnistui
Annetun IP-osoitteen käyttöä ei voitu laajentaa millään palvelimella - IP-osoitteen uudelleenmääritys onnistui
Tähän mennessä nähtyjen tietojen avulla voit kirjoittaa esimerkin siitä, kuinka Ethernet-yhteys käynnistetään määrittämällä IP-osoite verkossa olevan DHCP-palvelimen kautta. Seuraava esimerkkikoodi yrittää uusia IP-osoitteen tietyn ajan välein ja raportoi tuloksen.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
//#include <UIPEthernet.h> // Librería Ethernet que usaré después con el módulo ENC28J60
#include <Ethernet.h> // Librería Ethernet estándar
#define ESPERA_RENOVACION_IP 60000 // Un minuto
unsigned long reloj;
byte direccion_mac[]={0x12,0x34,0x56,0x78,0x9a,0xbc}; // Dirección MAC inventada
byte estado_DHCP;
void setup()
{
Serial.begin(9600);
Ethernet.begin(direccion_mac);
mostrar_direccion_ip();
reloj=millis()+ESPERA_RENOVACION_IP;
}
void loop()
{
if(millis()>reloj) // Tratar de renovar la IP cada ESPERA_RENOVACION_IP milisegundos
{
estado_DHCP=Ethernet.maintain();
switch(estado_DHCP)
{
case 0:
Serial.println(“Sin cambios”);
break;
case 1:
Serial.println(“Error al renovar la dirección IP”);
break;
case 2:
Serial.println(“Dirección IP renovada correctamente”);
break;
case 3:
Serial.println(“Error al reasignar la dirección IP”);
break;
case 4:
Serial.println(“Dirección IP reasignada correctamente”);
break;
default:
Serial.println(“Error desconocido”);
}
mostrar_direccion_ip();
reloj=millis()+ESPERA_RENOVACION_IP;
}
}
void mostrar_direccion_ip()
{
Serial.print(“Dirección IP actual [“);
Serial.print(Ethernet.localIP()); // Mostrará la dirección IP asignada por el servidor DHCP
Serial.println(“]”);
}
|
Alla oleva esimerkki määrittää IP-osoitteen ja muun kokoonpanon manuaalisesti objektien avulla IP-osoite Lukemisen helpottamiseksi ja (jos kyseessä on monimutkaisempi koodi) välttääksesi virheet, joita saattaa ilmetä, jos osoite kirjoitetaan (väärin) joka kerta, kun sitä käytetään.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
#include <UIPEthernet.h> // Librería Ethernet usada con el módulo ENC28J60
// #include <Ethernet.h> // Librería Ethernet estándar
byte direccion_mac[]={0x12,0x34,0x56,0x78,0x9a,0xbc}; // Dirección MAC inventada
IPAddress direccion_ip_fija(192,168,1,69); // Dirección IP elegida para el módulo
IPAddress servidor_dns(87,216,170,85); // Servidor DNS OpenNIC (de Alejandro Bonet, http://opennic.alargador.org)
IPAddress puerta_enlace(192,168,1,14); // Dirección IP del router
IPAddress mascara_red(255,255,255,0); // Máscara de la red
void setup()
{
Serial.begin(9600);
while(!Serial){;} // He usado una placa Leonardo, me toca esperar a que el puerto serie esté operativo
Ethernet.begin(direccion_mac,direccion_ip_fija,servidor_dns,puerta_enlace,mascara_red);
Serial.print(“Dirección IP asignada [“);
Serial.print(Ethernet.localIP()); // Poco misterio, devolverá la dirección IP asignada manualmente
Serial.println(“]”);
}
void loop()
{
// Sólo es un ejemplo de configuración, no hace nada
}
|
2. Käynnistä yhteys asiakas- tai palvelintilassa
Kun yhteys muodostetaan palvelintilassa, kehitteillä oleva mikro-ohjattu järjestelmä kuuntelee muiden järjestelmien pyyntöjä. Aloita yhteys palvelimena käyttämällä Ethernet-palvelin() ja portti, jota palvelin kuuntelee, ilmoitetaan parametrina. Ethernet-palvelin() on luokan rakentaja Server, joka tukee kaikkia Ethernet-toimintoja palvelimena. Vaikka kaikkein ortodoksisin asia on soittaa rakentajalle Ethernet-palvelin(), ei ole harvinaista löytää esimerkkejä, jotka käyttävät suoraan luokkaa Server tai vaihtoehtoisia kirjastoja Ethernet-yhteyttä varten, jotka päättävät käyttää kyseistä toteutusjärjestelmää.
Yhteys asiakkaana on se, joka tekee pyyntöjä palvelinjärjestelmälle, joka odottaa niitä ja vastaa niihin vastaavasti. Jos haluat muodostaa yhteyden asiakkaana, käytä EthernetClient() mikä on luokan rakentaja Asiakas kaikkien Ethernet-toimintojen alkuperä asiakkaana.
Toisin kuin palvelintilassa, jonka oletetaan toimivan luokan luomishetkestä lähtien (vaikka se vastaa asiakkaille vain, jos se todella on), sinun on varmistettava, että asiakasyhteys on valmis ennen sen käyttöä. Asiakasobjektilta, joka luodaan, kun yhteys muodostetaan, voidaan kysyä, onko se käytettävissä. Esimerkiksi kyselyoperaatioita voidaan sisällyttää rakenteeseen jos (Ethernet-asiakas) suorittaa ne vain, kun asiakasyhteys on käytettävissä.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
#include <UIPEthernet.h> // Librería Ethernet usada con el módulo ENC28J60
// #include <Ethernet.h> // Librería Ethernet estándar
byte direccion_mac[]={0x12,0x34,0x56,0x78,0x9a,0xbc}; // Dirección MAC inventada
IPAddress direccion_ip_fija(192,168,1,69); // Dirección IP elegida para el módulo
IPAddress servidor_dns(87,216,170,85); // Servidor OpenNIC (de Alejandro Bonet, http://opennic.alargador.org)
IPAddress puerta_enlace(192,168,1,14); // Dirección IP del router
IPAddress mascara_red(255,255,255,0); // Máscara de la red
EthernetServer servidor=EthernetServer(80); // Puerto 80 (típico de un servidor HTTP)
void setup()
{
Serial.begin(9600);
while(!Serial){;} // He usado una placa Leonardo, hay que esperar a que el puerto serie esté operativo
Ethernet.begin(direccion_mac,direccion_ip_fija,servidor_dns,puerta_enlace,mascara_red);
servidor.begin();
Serial.println(“Servidor HTTP iniciado”);
}
void loop()
{
// Sólo es un ejemplo de configuración, no hace nada productivo
}
|
3. Muodosta yhteys asiakkaana
Kuten on sanottu, kun yhteys on luotu, asiakas tekee aloitteen kyselyiden tekemiseen. Palvelin odottaa aloitetta ja vastaa sen mukaisesti. Siksi asiakas muodostaa yhteyden palvelimeen, ja käytämme tätä varten kytkeä() ilmoittamalla palvelimen parametreiksi (IP-osoite tai URL) Ja puerto siinä, joka kuuntelee.
Toiminnon tuloksen perusteella funktio palauttaa arvot
- ( ) Yhteys muodostettu onnistuneesti
- Yhteyden muodostaminen
- ( ) Aikakatkaisu on kulunut ilman yhteyttä
- ( ) Palvelinta ei löydy tai se ei vastaa oikein
- ( ) Yhteys katkesi ennen kuin se oli täysin muodostettu
- ( ) Palvelimen vastaus on virheellinen
Ennen kuin aloitat kyselyjen tekemisen, on tarpeen varmistaa, että yhteys toimii toiminnon kanssa yhdistetty () joka palaa jos se on jo saatavilla tai muuten.
Alla oleva esimerkki havainnollistaa yhteyttä asiakkaana, tarkistaen 10 sekunnin välein, onko palvelimeen yhteyttä (se ei ole tarkoitettu millään tavalla tuottavaksi, vain toimintojen syntaksin näyttämiseksi) jotain, joka muuten, tuotantoverkkopalvelin ei haluaisi kovinkaan paljon.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
#include <UIPEthernet.h> // Librería Ethernet usada con el módulo ENC28J60
// #include <Ethernet.h> // Librería Ethernet estándar
#define INTERVALO_CONSULTA 10000 // Se comprueba cada 10 segundos si hay conexión
#define LED_CONEXION 13 // Pin del LED que parpadea cuando hay conexión
#define TIEMPO_PARPADEO 300 // Milisegundos entre encendido/apagado del LED que indica conexión
byte direccion_mac[]={0x12,0x34,0x56,0x78,0x9a,0xbc}; // Dirección MAC inventada
IPAddress direccion_ip_fija(192,168,1,69); // Dirección IP elegida para el módulo
IPAddress servidor_dns(87,216,170,85); // Servidor OpenNIC (de Alejandro Bonet, http://opennic.alargador.org)
IPAddress puerta_enlace(192,168,1,14); // Dirección IP del router
IPAddress mascara_red(255,255,255,0); // Máscara de la red
IPAddress ip_servidor_web(192,168,1,21); // Dirección IP del servidor web (en la intranet)
//char url_servidor_web[]=”sleepmanager.onironauta.es”; // URL poético para un gestor de sueño (en Internet)
EthernetClient cliente=EthernetClient();
byte estado_conexion;
boolean anteriormente_conectado;
boolean estado_led_conexion;
unsigned long cronometro_parpadeo;
unsigned long cronometro_consulta;
void conectar_ethernet()
{
estado_conexion=cliente.connect(ip_servidor_web,80); // Conexión desde la intranet
//estado_conexion=cliente.connect(url_servidor_web,80); // Conexión desde Internet
delay(100); // Un pequeño retraso para permitir que se active la conexión
anteriormente_conectado=false;
switch(estado_conexion)
{
case 1:
Serial.println(“Conexión con el servidor SleepManager establecida correctamente”);
anteriormente_conectado=true;
break;
case –1:
Serial.println(“Ha pasado el tiempo de espera sin que se establezca la conexión”);
break;
case –2:
Serial.println(“No se ha encontrado el servidor o no responde correctamente”);
break;
case –3:
Serial.println(“La conexión se ha interrumpido antes de establecerse completamente”);
break;
case –4:
Serial.println(“La respuesta del servidor es incorrecta”);
break;
}
}
void setup()
{
pinMode(LED_CONEXION,OUTPUT);
Serial.begin(9600);
while(!Serial){;} // Esperar al puerto serie de la placa Leonardo
Serial.println(“Conectando con el servidor SleepManager…”);
Ethernet.begin(direccion_mac,direccion_ip_fija,servidor_dns,puerta_enlace,mascara_red);
conectar_ethernet();
estado_led_conexion=false;
cronometro_parpadeo=0;
cronometro_consulta=millis()+INTERVALO_CONSULTA;
}
void loop()
{
if(anteriormente_conectado&&millis()>cronometro_parpadeo)
{
estado_led_conexion=!estado_led_conexion;
digitalWrite(LED_CONEXION,estado_led_conexion);
cronometro_parpadeo=millis()+TIEMPO_PARPADEO;
}
if(millis()>cronometro_consulta)
{
if(!cliente.connected())
{
conectar_ethernet();
}
cronometro_consulta=millis()+INTERVALO_CONSULTA;
}
}
|
4. Lähetä tiedot
Kuten muutkin tunnetuimmat luokat, kuten Sarja, ja vastaavalla käytöllä luokat Asiakas y Server on toimintoja
-
Lähettää tiedot käyttämällä asiakas- tai palvelinobjektia, josta ne kutsutaan. "Data"-parametri on yksittäinen tavu o sotavaunut kun taas "puskuri" on joukko tavu o sotavaunut josta lähetetään "pituutta" vastaava määrä. Tätä toimintoa käytetään binäärioperaatioissa verrattuna kahteen seuraavaan, jotka on yleensä varattu tekstin lähettämiseen.
-
Lähettää asiakkaana tai palvelimena (riippuen luokasta, josta sitä käytetään) "dataa" vastaavat tiedot tekstinä. Jos tietoa ei ilmaista tekstinä (esimerkiksi se on kokonaisluku), valinnaisella parametrilla "base" voidaan valita muunnos, joka voi olla jokin vakioista BIN, OCT, DEC tai HEX, jotka osoittavat vastaavasti. emäkset, jotka vastaavat binääriä (kantaluku 2), oktaalia (kantaluku 8), desimaalilukua (kantaluku 10) ja heksadesimaalilukua (kantaluku 16)
-
Toiminto on identtinen edellisen kanssa, paitsi että "data"-parametrilla nimenomaisesti ilmoitettujen tietojen jälkeen lähetetään rivinvaihto (koodi 13, joka voidaan esittää muodossa \r) ja rivin loppu (koodi 10, joka voidaan lähettää edustaa \n) Näihin koodeihin viitataan usein vastaavasti lyhenteellä CR (Carriage Return) ja LF (rivinsyöttö)
Kolme edellistä funktiota palauttavat lähetettyjen tavujen määrän, samoin kuin vastaavat luokan funktiot Sarja; Kuten edellä mainittiin, toiminta on vertailukelpoinen.
5. Vastaanota tietoja
Kuten datan lähetystoimintojen tapauksessa, vastaanottotoiminnot ovat verrattavissa laajalti käytettyihin toimiin Sarja. Vastaanottoprotokolla on myös samanlainen: tarkista, onko saatavilla (tarpeeksi) dataa (saatavissa) ja lue ne siinä tapauksessa
-
Palauttaa luettavissa olevien tavujen määrän. Tämä toiminto on molemmissa luokissa Asiakas kuten Server; Ensimmäisessä tapauksessa se raportoi tavujen määrän, jotka palvelin on lähettänyt vastauksena pyyntöön ja jotka ovat asiakkaan luettavissa (luettu), ja toisessa tapauksessa toiminnon suorittanut asiakas (objekti) tai false, jos sellaista ei ole.
-
Sitä käytetään vastaanotetun tiedon lukemiseen. Tämä ominaisuus on käytettävissä vain luokassa Asiakas. Jos kehitettävä sovellus täyttää palvelimen roolin, saapuneiden tietojen lukemiseksi tulee asiakasobjekti instantoida funktiovastauksella saatavilla () keskusteltu edellisessä osiossa.
Seuraava esimerkki on "caps-palvelin", joka kuuntelee porttia 2000 ja vastaa pyyntöihin lähettämällä mitä tahansa isoilla kirjaimilla, jos mahdollista. Sitä voi testata esim PuTTY tai yksinkertaisesti kanssa Se ei todellakaan ole kovin käytännöllistä, sen tarkoitus on vain näyttää, kuinka asiakkaan sille lähettämät tiedot saadaan palvelimelta.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
#include <UIPEthernet.h> // Librería Ethernet usada con el módulo ENC28J60
//#include <Ethernet.h> // Librería Ethernet estándar
byte direccion_mac[]={0x12,0x34,0x56,0x78,0x9a,0xbc}; // Dirección MAC inventada
IPAddress direccion_ip_fija(192,168,1,69); // Dirección IP elegida para el módulo
IPAddress servidor_dns(87,216,170,85); // Servidor OpenNIC (de Alejandro Bonet, http://opennic.alargador.org)
IPAddress puerta_enlace(192,168,1,14); // Dirección IP del router
IPAddress mascara_red(255,255,255,0); // Máscara de la red
EthernetServer servidor=EthernetServer(2000);
EthernetClient cliente;
char texto_recibido; // Sólo para que se más fácil leer el programa usando varias líneas de código
void setup()
{
Serial.begin(9600);
while(!Serial){;} // Esperar al puerto serie de la placa Leonardo esté operativo
Ethernet.begin(direccion_mac,direccion_ip_fija,servidor_dns,puerta_enlace,mascara_red);
Serial.println(“Iniciando el servidor de mayúsculas”);
servidor.begin();
}
void loop()
{
cliente=servidor.available();
// Si hay disponible alguna petición de un cliente leerla y devolverla en mayúsculas
if(cliente)
{
texto_recibido=cliente.read();
if(texto_recibido>96&&texto_recibido<123) // Si se recibe una letra minúscula…
{
texto_recibido-=32; // …convertirla a mayúsculas
}
// Si se tiene la seguridad de recibir texto se puede usar print en lugar de write
servidor.write(texto_recibido); // Responder con lo recibido pasado a mayúsculas si procede
}
}
|
6. Katkaise yhteys
Vaikka on tavallista, että palvelinsovellus toimii loputtomasti, asiakasyhteydet muodostetaan, muodostavat yhteyksiä ja lopetetaan, jolloin resurssit voidaan palauttaa ja käyttää muissa yhteyksissä tai varata ohjelman muihin käyttötarkoituksiin. Toiminto lopettaa() luokasta Asiakas Sitä käytetään asiakasyhteyden katkaisemiseen ja sen käyttämien resurssien vapauttamiseen.
Palvelimelle se, että asiakas katkaisee yhteyden, kun kyselyn tietoobjekti on lähetetty tai vastaanotettu, antaa palvelimelle myös vapauttaa resursseja niiden allokoimiseksi muihin yhteyksiin tai eri tarkoituksiin. Lyhyesti sanottuna, vaikka se vaikuttaa vähäiseltä, on suositeltavaa katkaista yhteys asiakkaan toiminnan päättyessä.
Toinen hyvä käytäntö asiakasyhteyttä katkaistaessa on tyhjentää joita luokka käyttää. Tätä varten toiminto on käytettävissä huuhtele () tulee soittaa, kun asiakasyhteys on katkaistu lopettaa()
Esimerkki HTTP GET -kyselystä
Alla on kattavampi esimerkki pyynnöistä selventääksesi kaikkea yllä olevaa. TCP käyttämällä GET-pyyntöjä käyttämällä HTTP-protokolla. Esimerkissä Arduino-levyyn kytkettyjen analogisten antureiden saamat arvot lähetetään verkkopalvelimelle, joka tallentaa ne tietokantaan.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
#include <UIPEthernet.h> // Librería Ethernet usada con el módulo ENC28J60
// #include <Ethernet.h> // Librería Ethernet estándar
#define INTERVALO_CONSULTA 60000 // Enviar datos cada minuto
#define INTERVALO_RECONEXION 10000 // Reintentar la conexión 10 segundos más tarde si no ha sido posible hacerlo cuado correspondía
#define CANTIDAD_SENSORES 6 // Número de sensores analógicos empezando en A0
byte direccion_mac[]={0x12,0x34,0x56,0x78,0x9a,0xbc}; // Dirección MAC inventada
IPAddress direccion_ip_fija(192,168,1,69); // Dirección IP elegida para el módulo
IPAddress servidor_dns(87,216,170,85); // Servidor OpenNIC (de Alejandro Bonet, http://opennic.alargador.org)
IPAddress puerta_enlace(192,168,1,14); // Dirección IP del router
IPAddress mascara_red(255,255,255,0); // Máscara de la red
//IPAddress ip_servidor_web(192,168,1,21); // Dirección IP del servidor web (en la intranet)
char url_servidor_web[]=“sleepmanager.onironauta.es”; // URL poético para un gestor de sueño (en Internet)
EthernetClient cliente;
byte estado_conexion;
String texto_consulta;
unsigned long cronometro_consulta;
byte contador;
void setup()
{
Serial.begin(9600);
while(!Serial){;} // Esperar al puerto serie de la placa Leonardo
Serial.println(“Conectando con el servidor SleepManager…”);
Ethernet.begin(direccion_mac,direccion_ip_fija,servidor_dns,puerta_enlace,mascara_red);
cronometro_consulta=millis()+INTERVALO_CONSULTA;
}
void loop()
{
if(millis()>cronometro_consulta)
{
//estado_conexion=cliente.connect(ip_servidor_web,80); // Conexión desde la intranet
estado_conexion=cliente.connect(url_servidor_web,80); // Conexión desde Internet
while(estado_conexion==0) // esperar a que se establezca la conexión o se produzca un error
{
switch(estado_conexion)
{
case 1:
Serial.println(“Conexión con el servidor SleepManager establecida correctamente”);
break;
case –1:
Serial.println(“Ha pasado el tiempo de espera sin que se establezca la conexión”);
break;
case –2:
Serial.println(“No se ha encontrado el servidor o no responde correctamente”);
break;
case –3:
Serial.println(“La conexión se ha interrumpido antes de establecerse completamente”);
break;
case –4:
Serial.println(“La respuesta del servidor es incorrecta”);
break;
}
}
if(cliente.connected()) // Si ha sido posible conectar realizar la consulta
{
cronometro_consulta=millis()+INTERVALO_CONSULTA;
texto_consulta=“GET /pruebas/guardar_sensores_analogicos.php?origen=SleepManager”;
for(contador=0;contador<CANTIDAD_SENSORES;contador++)
{
texto_consulta=“&sensor_”+String(contador+1,DEC)+“=”+String(analogRead(contador),DEC);
delay(1); // Como tarda 100 μs en obtener el valor analógico, con 1 ms seguro le da tiempo
}
texto_consulta+=” HTTP/1.1\r\nHost: “+String(url_servidor_web)+“\r\nUser-Agent: sleep_inspector\r\n\r\n”;
cliente.print(texto_consulta);
cliente.flush();
cliente.stop();
}
else // Si no ha sido posible conectar reintentarlo más tarde pero no tanto como si hubiera sido posible hacerlo
{
cronometro_consulta=millis()+INTERVALO_RECONEXION;
}
}
}
|
Post Comment