Ethernet-TCP-Verbindung mit Arduino
Aus softwaretechnischer Sicht der Aufbau einer Verbindung Ethernet mit Arduino Es ist sehr einfach. Verwenden Sie dazu die Ethernet-Bibliothek. Diese Bibliothek ist für a konzipiert Ethernet-Abschirmung die auf dem Integrierten basiert W5100, aber es gibt auch andere Boards oder Module und/oder die andere integrierte Boards verwenden, wie zum Beispiel das ENC28J60. Um die Verwendung zu vereinfachen und die Kompatibilität zu erhöhen, verwenden andere Bibliotheken (fast) dasselbe API dass Ethernet-Bibliothek, müssen Sie lediglich die alternative Bibliothek durch die ursprüngliche ersetzen oder sie (wenn der Name anders ist) an ihrer Stelle einbinden, auch wenn im Code dieselben (oder sehr ähnliche) Funktionen verwendet werden. In meinem Fall verwende ich das UIPEthernet-Bibliothek de Norbert Truchsess Ich folge dem gleichen Prozess, den ich in diesem Text beschreiben werde.
1. Definieren Sie die Ethernet-Verbindung
Ob Sie die Rolle übernehmen werden Kunde wie Server, müssen Sie zunächst den Zusammenhang mit der Funktion definieren begin () Das kann nur als Parameter übergeben werden MAC-Adresse und warte auf einen Server DHCP im Netzwerk eine zuweisen IP Adresse und der Rest der Konfiguration oder es ist auch möglich, (optional) weitere Parameter anzugeben, bis die vollständige Konfiguration definiert ist:
- MAC-Adresse (was bereits erwähnt wurde)
- IP-Adresse des Schirms oder Moduls
- Server-IP-Adresse DNS (nur ein Server)
- IP-Adresse des Tor
- Netzmaske
Es empfiehlt sich, alle Parameter anzugeben, sofern es sich nicht um die übliche Ableitung handelt, um zu vermeiden, dass die Konfiguration nicht korrekt ist (z. B. dass das Gateway nicht die erste Adresse des Netzwerks ist).
Aus dem oben Gesagten scheint klar zu sein, dass Daten, die IP-Adressen darstellen, recht häufig verwendet werden müssen, weshalb die Bibliothek die Klasse enthält IP Adresse von dem aus IP-Adressobjekte instanziiert werden sollen. Die ihn definierenden Parameter sind die vier Bytes einer Adresse IPV4
La MAC-Adresse Es ist für diese Bibliothek als 6-Byte-Array definiert. Die MAC-Adresse ist (soll) eine eindeutige Kennung, bei der die ersten Bytes den Hersteller und das Modell angeben und die letzten das spezifische Gerät angeben. Das Integrierte ENC28J60 beinhaltet keine MAC-Adresse, es sei denn, Sie entscheiden sich für den Kauf einer Integrierte MAC-Adresse von Microchip (oder ein ganzer Block Ja von Adressen an IEEE wenn die Anzahl der Geräte groß genug ist, dass es sich lohnt). Wenn Sie keine MAC-Adresse haben, können Sie eine erfinden und dabei darauf achten, dass es nicht zu Konflikten mit anderen im Netzwerk kommt, in dem sich das Gerät befindet.
Erfolgt die Konfiguration mit einem DHCP-Server statt „von Hand“, ist die Funktion localIP() Es ist hilfreich, die Adresse abzufragen, die der Server dem Modul zugewiesen hat. Zur Erneuerung der zugewiesenen Adresse (sofern die entsprechende Zeit abgelaufen ist) die Ethernet-Bibliothek stellt die Funktion bereit pflegen() Dies informiert Sie auch durch die Rückgabe eines Codes, der dem Status der Verlängerung entspricht:
- Die Operation hatte keine Wirkung
-
Fehler beim Erneuern der IP-Adresse
Die Nutzung der zugewiesenen IP-Adresse auf demselben Server konnte nicht verlängert werden - IP-Adresse erfolgreich erneuert
-
Die Neubindung der IP-Adresse ist fehlgeschlagen
Die Nutzung der zugewiesenen IP-Adresse konnte auf keinem Server erweitert werden - IP-Adresse erfolgreich neu zugewiesen
Mit den bisher angezeigten Informationen können Sie ein Beispiel dafür schreiben, wie eine Ethernet-Verbindung durch die Konfiguration der IP-Adresse über einen DHCP-Server im Netzwerk initiiert wird. Der folgende Beispielcode versucht, die IP-Adresse in jedem bestimmten Zeitraum zu erneuern und meldet das Ergebnis.
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(“]”);
}
|
Das folgende Beispiel weist die IP-Adresse und die restliche Konfiguration manuell mithilfe von Objekten zu IP Adresse um die Lesbarkeit zu erhöhen und (bei komplexerem Code) Fehler zu vermeiden, die auftreten könnten, wenn die Adresse bei jeder Verwendung (falsch) geschrieben wird.
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. Starten Sie die Verbindung im Client- oder Servermodus
Beim Initiieren einer Verbindung im Servermodus ist es das mikrogesteuerte System, das entwickelt wird, das auf Anfragen von anderen Systemen lauscht. Um die Verbindung als Server zu starten, verwenden Sie EthernetServer() und der Port, an dem der Server lauscht, wird als Parameter angegeben. EthernetServer() ist der Konstruktor der Klasse Server, der als Server alle Ethernet-Operationen unterstützt. Obwohl es am orthodoxesten ist, den Konstruktor anzurufen EthernetServer(), ist es nicht ungewöhnlich, einige Beispiele zu finden, die die Klasse direkt verwenden Server oder alternative Bibliotheken für Ethernet-Verbindungen, die sich für die Verwendung dieses Instanziierungssystems entscheiden.
Die Verbindung als Client ist diejenige, die Anfragen an das Serversystem stellt, das auf diese wartet und sie entsprechend beantwortet. Um als Client eine Verbindung herzustellen, verwenden Sie EthernetClient() Was ist der Konstruktor der Klasse? Kunden Ursprung aller Ethernet-Operationen als Client.
Im Gegensatz zum Servermodus, von dem angenommen wird, dass er ab dem Moment der Instanziierung der Klasse funktioniert (obwohl er nur dann auf Clients antwortet, wenn dies tatsächlich der Fall ist), müssen Sie vor der Verwendung überprüfen, ob die Clientverbindung bereit ist. Das Client-Objekt, das beim Initiieren der Verbindung erstellt wird, kann abgefragt werden, um festzustellen, ob es verfügbar ist. Beispielsweise können Abfrageoperationen in eine Struktur eingebunden werden if(EthernetClient) um sie nur auszuführen, wenn die Client-Verbindung verfügbar ist.
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. Stellen Sie als Client eine Verbindung her
Sobald die Verbindung hergestellt ist, ist es, wie bereits erwähnt, der Kunde, der die Initiative ergreift und die Anfragen stellt. Der Server wartet auf diese Initiative und reagiert entsprechend. Es ist also der Client, der eine Verbindung zum Server herstellt, und dazu verwenden wir verbinden () Angabe des Servers als Parameter (die IP-Adresse oder die URL) Und der Port in dem, der zuhört.
Basierend auf dem Ergebnis der Operation gibt die Funktion die Werte zurück
- ( ) Verbindung erfolgreich aufgebaut
- Herstellen der Verbindung
- ( ) Timeout ist abgelaufen, ohne dass eine Verbindung hergestellt wurde
- ( ) Der Server wurde nicht gefunden oder antwortet nicht richtig
- ( ) Die Verbindung wurde getrennt, bevor sie vollständig hergestellt wurde
- ( ) Die Serverantwort ist falsch
Bevor mit der Durchführung von Abfragen begonnen wird, muss überprüft werden, ob die Verbindung mit der Funktion funktionsfähig ist in Verbindung gebracht() das wird wiederkommen ob es bereits verfügbar ist oder Andernfalls.
Das folgende Beispiel veranschaulicht die Verbindung als Client, der alle 10 Sekunden überprüft, ob eine Verbindung zum Server besteht (es soll nichts Produktives sein, sondern nur die Syntax der Funktionen zeigen), etwas, das übrigens Ein Produktions-Webserver würde nicht sehr gefallen.
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. Daten senden
Wie andere bekanntere Klassen, wie z Seriellund bei vergleichbarer Verwendung die Klassen Kunden y Server die Funktionen haben
-
Sendet Informationen mithilfe des Client- oder Serverobjekts, von dem aus sie aufgerufen werden. Der Parameter „data“ ist ein einzelner Byte o verkohlen während „Puffer“ ein Array von ist Byte o verkohlen Davon wird ein Betrag entsprechend „Länge“ gesendet. Diese Funktion wird für binäre Operationen verwendet, im Vergleich zu den nächsten beiden, die normalerweise für das Senden von Text reserviert sind.
-
Sendet als Client oder Server (abhängig von der Klasse, aus der er verwendet wird) die zu „Daten“ gehörenden Informationen als Text. Wenn die Informationen nicht als Text ausgedrückt werden (z. B. handelt es sich um eine Ganzzahl), kann der optionale Parameter „base“ verwendet werden, mit dem die Konvertierung ausgewählt werden kann. Dabei kann es sich um eine der Konstanten BIN, OCT, DEC oder HEX handeln, die jeweils angeben . Die Basen entsprechen Binär (Basis 2), Oktal (Basis 8), Dezimal (Basis 10) und Hexadezimal (Basis 16).
-
Der Vorgang ist mit dem vorherigen identisch, außer dass nach den durch den Parameter „data“ ausdrücklich angegebenen Informationen ein Wagenrücklauf (Code 13, der als \r dargestellt werden kann) und ein Zeilenende (Code 10, der als „\r“ dargestellt werden kann) gesendet werden dargestellt durch \n) Diese Codes werden häufig jeweils mit dem Akronym bezeichnet CR (Carriage Return) und LF (Zeilenvorschub)
Die drei vorherigen Funktionen geben die Anzahl der gesendeten Bytes zurück, ebenso wie die entsprechenden Funktionen der Klasse Seriell; Wie oben erwähnt, ist die Bedienung vergleichbar.
5. Daten empfangen
Wie bei den Datensendevorgängen sind auch die Empfangsvorgänge mit denen der weit verbreiteten Daten vergleichbar Seriell. Auch das Empfangsprotokoll ist ähnlich: Prüfen Sie, ob (genügend) Daten verfügbar sind (verfügbar) und in diesem Fall lesen Sie sie
-
Gibt die Anzahl der Bytes zurück, die zum Lesen verfügbar sind. Diese Funktion ist in beiden Klassen vorhanden Kunden als Server; Im ersten Fall wird die Anzahl der Bytes gemeldet, die der Server als Antwort auf eine Anfrage gesendet hat und die dem Client zum Lesen zur Verfügung stehen (lesen) und im zweiten Fall der Client (Objekt), der eine Operation ausgeführt hat, oder false, wenn keine vorhanden ist.
-
Es dient zum Auslesen der empfangenen Informationen. Diese Funktion ist nur im Unterricht verfügbar Kunden. Wenn die zu entwickelnde Anwendung die Rolle eines Servers erfüllt, muss zum Lesen der angekommenen Informationen ein Client-Objekt mit der Antwort der Funktion instanziiert werden verfügbar () im vorherigen Abschnitt besprochen.
Das folgende Beispiel ist ein „Caps-Server“, der Port 2000 überwacht und auf Anfragen mit dem gesendeten Text antwortet, wenn möglich in Großbuchstaben. Es kann zum Beispiel getestet werden mit PuTTY oder einfach mit Es ist sicherlich nicht sehr praktisch, sein Zweck besteht lediglich darin, zu zeigen, wie man die von einem Client an ihn gesendeten Daten vom Server erhält.
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. Beenden Sie die Verbindung
Während es für eine Serveranwendung üblich ist, unbegrenzt zu funktionieren, werden Client-Verbindungen hergestellt, Verbindungen hergestellt und beendet, sodass Ressourcen wiederhergestellt und in anderen Verbindungen verwendet oder für andere Verwendungszwecke des Programms reserviert werden können. Die Funktion halt() der Klasse Kunden Es wird verwendet, um eine Clientverbindung zu beenden und alle verwendeten Ressourcen freizugeben.
Für den Server ermöglicht die Tatsache, dass der Client die Verbindung beendet, wenn das Informationsobjekt der Anfrage gesendet oder empfangen wurde, ihm auch, Ressourcen freizugeben, um sie anderen Verbindungen oder anderen Zwecken zuzuweisen. Kurz gesagt: Obwohl es unbedeutend erscheint, ist es ratsam, die Verbindung zu beenden, wenn der Betrieb des Clients endet.
Eine weitere gute Vorgehensweise beim Beenden einer Clientverbindung besteht darin, die zu leeren dass die Klasse verwendet. Hierzu steht die Funktion zur Verfügung Flush () sollte nach Beendigung der Client-Verbindung mit aufgerufen werden halt()
Beispiel für eine HTTP-GET-Abfrage
Um alle oben genannten Punkte besser zu verdeutlichen, finden Sie unten ein ausführlicheres Beispiel für Anfragen. TCP Verwenden der GET-Anfragen mithilfe der Protokoll HTTP. Im Beispiel werden die von an ein Arduino-Board angeschlossenen analogen Sensoren ermittelten Werte an einen Webserver gesendet, der sie in einer Datenbank speichert.
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;
}
}
}
|
Geben Sie Anmerkung