Ethernet TCP povezava z Arduinom
S programskega vidika vzpostavitev povezave Ethernet z Arduino Je zelo preprosto. Če želite to narediti, uporabite Ethernet knjižnica. Ta knjižnica je zasnovana za a Ethernetni ščit ki temelji na integriranem W5100, vendar obstajajo druge različne plošče ali moduli in/ali ki uporabljajo druge integrirane, kot je ENC28J60. Da bi poenostavili njegovo uporabo in povečali združljivost, druge knjižnice uporabljajo (skoraj) enako API da Ethernet knjižnica, boste morali samo zamenjati alternativno knjižnico z izvirno ali jo vključiti (če je ime drugačno) na njeno mesto, tudi če so v kodi uporabljene iste (ali zelo podobne) funkcije. V mojem primeru uporabljam Knjižnica UIPEthernet de Norbert Truchsess po istem postopku, ki ga bom opisal v tem besedilu.
1. Določite povezavo Ethernet
Ne glede na to, ali boste prevzeli vlogo stranke kot tisto strežnik, morate najprej določiti povezavo s funkcijo začeti () ki se lahko posreduje kot parameter samo MAC naslov in počakajte na strežnik DHCP v omrežju dodeli a IP naslov in ostalo konfiguracijo ali pa je možno navesti (neobvezno) več parametrov, dokler ni definirana popolna konfiguracija:
- Dirección MAC (kar je bilo že omenjeno)
- IP naslov ščita ali modula
- IP naslov strežnika DNS (samo en strežnik)
- IP naslov za Prehod
- Maska mreže
Priporočljivo je, da navedete vse parametre, razen če je njihov odbitek običajen, da preprečite, da konfiguracija ni pravilna (na primer, da prehod ni prvi naslov omrežja).
Iz zgoraj navedenega se zdi, da je jasno, da je treba podatke, ki predstavljajo naslove IP, uporabljati precej pogosto, zato knjižnica vključuje razred IP naslov iz katerega ustvariti objekte naslova IP. Parametri, ki ga definirajo, so štirje bajti naslova IPV4
La MAC naslov Za to knjižnico je definiran kot 6-bajtno polje. Naslov MAC je (naj bi bil) enolični identifikator, v katerem prvi bajti označujejo proizvajalca in model, zadnji pa določeno napravo. Integrirano ENC28J60 ne vključuje naslova MAC, razen če se odločite kupiti tudi a Integriran MAC naslov podjetja Microchip (ali cel blok DA naslovov na IEEE če je serija naprav dovolj velika, da se splača). Če nimate naslova MAC, si ga lahko izmislite in pazite, da ni v nasprotju z drugimi v omrežju, kjer je naprava.
Če se konfiguracija izvede s strežnikom DHCP namesto "ročno", funkcija lokalniIP() Koristno je preveriti naslov, ki ga je strežnik dodelil modulu. Za obnovitev dodeljenega naslova (če je ustrezen čas potekel) se Ethernet knjižnica zagotavlja funkcijo vzdrževati () ki bo tudi obvestila z vrnitvijo kode, ki ustreza statusu podaljšanja:
- Operacija ni imela učinka
-
Napaka pri obnavljanju naslova IP
Uporabe dodeljenega naslova IP na istem strežniku ni bilo mogoče razširiti - Naslov IP je bil uspešno obnovljen
-
Ponovno povezovanje naslova IP ni uspelo
Uporabe dodeljenega naslova IP ni bilo mogoče razširiti na noben strežnik - Naslov IP je bil uspešno ponovno dodeljen
Z informacijami, ki ste jih videli do zdaj, lahko napišete primer, kako bi se povezava Ethernet vzpostavila s konfiguracijo naslova IP prek strežnika DHCP v omrežju. Naslednji primer kode poskuša obnoviti naslov IP vsako določeno časovno obdobje in poroča o rezultatu.
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(“]”);
}
|
Spodnji primer ročno dodeljuje naslov IP in preostalo konfiguracijo z uporabo objektov IP naslov da bo bolj udoben za branje in (v primeru kompleksnejše kode) da se izognemo napakam, do katerih bi lahko prišlo, če bi bil naslov ob vsaki uporabi (napačen) zapisan.
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. Zaženite povezavo v načinu odjemalca ali strežnika
Pri vzpostavljanju povezave v strežniškem načinu je mikrokrmiljeni sistem, ki se razvija, poslušati zahteve drugih sistemov. Če želite vzpostaviti povezavo kot strežnik, uporabite EthernetServer() in vrata, na katerih bo strežnik poslušal, so navedena kot parameter. EthernetServer() je konstruktor razreda Server, ki podpira vse operacije Ethernet kot strežnik. Čeprav je najbolj ortodoksna stvar klic konstruktorja EthernetServer(), ni neobičajno najti nekaj primerov, ki neposredno uporabljajo razred Server ali alternativne knjižnice za ethernetno povezavo, ki se odločijo za uporabo tega instanciacijskega sistema.
Povezava kot odjemalec je tista, ki postavlja zahteve strežniškemu sistemu, ki jih počaka in jim ustrezno odgovori. Če želite vzpostaviti povezavo kot odjemalec, uporabite EthernetClient() kaj je konstruktor razreda Pomoč izvor vseh operacij Ethernet kot odjemalec.
Za razliko od tega, kar se zgodi s strežniškim načinom, za katerega se domneva, da deluje od trenutka, ko je razred instanciran (čeprav se bo odjemalcem odzval le, če je res), morate pred uporabo preveriti, ali je odjemalska povezava pripravljena. Predmet odjemalca, ki je ustvarjen ob vzpostavitvi povezave, je mogoče poizvedovati, ali je na voljo. Na primer, operacije poizvedbe so lahko vključene v strukturo če (EthernetClient) da jih izvede le, ko je na voljo odjemalska povezava.
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. Vzpostavite povezavo kot odjemalec
Kot rečeno, ko je povezava vzpostavljena, je odjemalec tisti, ki prevzame pobudo za poizvedovanje. Strežnik bo čakal na to pobudo in se ustrezno odzval. Zato je odjemalec tisti, ki se poveže s strežnikom in za to uporabljamo povezati () ki navaja strežnik kot parametre (naslov IP ali URL) in port v tistem, ki posluša.
Na podlagi rezultata operacije bo funkcija vrnila vrednosti
- ( ) Povezava je bila uspešno vzpostavljena
- Vzpostavljanje povezave
- ( ) Časovna omejitev je potekla brez vzpostavitve povezave
- ( ) Strežnika ni bilo mogoče najti ali pa se ne odziva pravilno
- ( ) Povezava je bila prekinjena, preden je bila v celoti vzpostavljena
- ( ) Odgovor strežnika ni pravilen
Preden začnete izvajati poizvedbe, je treba preveriti, ali povezava s funkcijo deluje povezan() ki se bo vrnil če je že na voljo oz drugače.
Spodnji primer ponazarja povezavo kot odjemalec, ki vsakih 10 sekund preverja, ali je vzpostavljena povezava s strežnikom (ni mišljeno kot nič produktivnega, samo za prikaz sintakse funkcij) nekaj, kar mimogrede produkcijski spletni strežnik ne bi bil zelo všeč.
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. Pošljite podatke
Tako kot drugi bolj znani razredi, kot je npr Serijska, pri primerljivi uporabi pa razrede Pomoč y Server imajo funkcije
-
Pošlje informacije z uporabo objekta odjemalca ali strežnika, iz katerega je priklican. Parameter "podatki" je en sam bajt o kočija medtem ko je "buffer" niz bajt o kočija od tega je poslana količina enaka "dolžini". Ta funkcija se uporablja za binarne operacije, v primerjavi z naslednjima dvema, ki sta običajno rezervirani za pošiljanje besedila.
-
Pošlje kot odjemalec ali strežnik (odvisno od razreda, iz katerega se uporablja) informacije, ki ustrezajo "podatkom", kot besedilo. Če informacija ni izražena kot besedilo (na primer je celo število), lahko uporabite izbirni parameter "osnova", s katerim izberete pretvorbo, ki je lahko ena od konstant BIN, OCT, DEC ali HEX, ki označujejo oz. .osnove, ki ustrezajo dvojiški (osnova 2), osmiški (osnova 8), decimalni (osnova 10) in šestnajstiški (osnova 16)
-
Operacija je enaka prejšnji, razen za pošiljanje, po informacijah, ki jih izrecno nakazuje parameter "data", vrnitve v začetek (koda 13, ki je lahko predstavljena kot \r) in konca vrstice (koda 10, ki je lahko predstavljeno z \n) Te kode se pogosto imenujejo z akronimi CR (povratek na začetek vrstice) in LF (pomik vrstice)
Tri prejšnje funkcije vrnejo število bajtov, ki so bili poslani, prav tako enakovredne funkcije razreda Serijska; Kot je navedeno zgoraj, je operacija primerljiva.
5. Prejemanje podatkov
Tako kot v primeru operacij pošiljanja podatkov so operacije prejemanja primerljive s tistimi pri široko uporabljenih Serijska. Tudi protokol prejema je podoben: preverite, ali je na voljo (dovolj) podatkov (Na voljo) in jih v tem primeru preberite
-
Vrne število bajtov, ki so na voljo za branje. Ta funkcija je prisotna v obeh razredih Pomoč kot Server; V prvem primeru poroča o številu bajtov, ki jih je strežnik poslal kot odgovor na zahtevo in so na voljo odjemalcu za branje (preberite), v drugem primeru pa odjemalec (objekt), ki je izvedel operacijo ali false, če je ni.
-
Uporablja se za branje prejetih informacij. Ta funkcija je na voljo samo v razredu Pomoč. Če aplikacija, ki se razvija, izpolnjuje vlogo strežnika, mora biti za branje prispelih informacij instanciran objekt odjemalca z odgovorom funkcije na voljo () razpravljali v prejšnjem razdelku.
Naslednji primer je "strežnik z velikimi črkami", ki posluša na vratih 2000 in se na zahteve odzove z vsem, kar je bilo poslano z velikimi črkami, kadar je to mogoče. Lahko se preizkusi, na primer, z PuTTY ali preprosto z Vsekakor ni zelo praktičen, njegov namen je samo pokazati, kako pridobiti podatke, ki mu jih pošlje odjemalec s strežnika.
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. Prekinite povezavo
Medtem ko je običajno, da strežniška aplikacija teče neomejeno dolgo, se odjemalske povezave vzpostavijo, vzpostavijo povezave in prekinejo, kar omogoča obnovitev virov in njihovo uporabo v drugih povezavah ali namenjenih drugim uporabam programa. Funkcija stop () razreda Pomoč Uporablja se za prekinitev povezave odjemalca in sprostitev virov, ki jih uporablja.
Strežniku dejstvo, da odjemalec prekine povezavo, ko je bil informacijski objekt poizvedbe poslan ali prejet, prav tako omogoča, da sprosti vire, da jih dodeli drugim povezavam ali drugim namenom. Skratka, čeprav se zdi nepomembno, je priporočljivo prekiniti povezavo, ko se končajo operacije odjemalca.
Druga dobra praksa pri prekinitvi povezave odjemalca je, da izpraznite ki jih razred uporablja. Če želite to narediti, je na voljo funkcija flush () je treba poklicati po prekinitvi povezave odjemalca z stop ()
Primer poizvedbe HTTP GET
Za boljšo razjasnitev vsega zgoraj navedenega je spodaj vključen popolnejši primer zahtev. TCP z uporabo zahtev GET z uporabo protokol HTTP. V primeru so vrednosti, pridobljene z analognimi senzorji, povezanimi s ploščo Arduino, poslane spletnemu strežniku, ki jih shrani v bazo podatkov.
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;
}
}
}
|
po Komentar