Koneksi Ethernet TCP dengan Arduino
Dari sudut pandang perangkat lunak, membuat koneksi Ethernet dengan Arduino Ini sangat sederhana. Untuk melakukan ini, gunakan Perpustakaan Ethernet. Perpustakaan ini dirancang untuk a Perisai Ethernet yang berbasis terintegrasi W5100, namun terdapat papan atau modul lain yang berbeda dan/atau yang menggunakan papan atau modul terintegrasi lainnya, seperti ENC28J60. Untuk menyederhanakan penggunaannya dan meningkatkan kompatibilitas, perpustakaan lain (hampir) menggunakan hal yang sama API bahwa Perpustakaan Ethernet, Anda hanya perlu mengganti pustaka alternatif dengan pustaka asli atau memasukkannya (jika namanya berbeda) pada tempatnya meskipun fungsi yang sama (atau sangat mirip) digunakan dalam kode. Dalam kasus saya, saya menggunakan Perpustakaan UIPEthernet de Norbert Truchsess mengikuti proses yang sama yang akan saya jelaskan dalam teks ini.
1. Tentukan koneksi Ethernet
Apakah Anda akan mengambil peran tersebut pelanggan seperti itu Server, pertama-tama Anda harus menentukan koneksi dengan fungsi tersebut mulai() yang hanya dapat diteruskan sebagai parameter Alamat MAC dan tunggu server DHCP pada jaringan menetapkan a alamat IP dan konfigurasi lainnya atau dimungkinkan juga untuk menunjukkan (opsional) lebih banyak parameter hingga konfigurasi lengkap ditentukan:
- Dirección MAC (yang telah disebutkan)
- Alamat IP dari perisai atau modul
- Alamat IP server DNS (hanya satu server)
- alamat IP dari pintu gerbang
- Topeng bersih
Dianjurkan untuk menunjukkan semua parameter, kecuali pengurangannya adalah yang biasa, untuk menghindari konfigurasi yang salah (misalnya, gateway bukan alamat pertama jaringan).
Dari penjelasan di atas terlihat jelas bahwa data yang mewakili alamat IP harus cukup sering digunakan, itulah sebabnya perpustakaan menyertakan kelas tersebut Alamat IP dari mana untuk membuat instance objek alamat IP. Parameter yang mendefinisikannya adalah empat byte alamat IPV4
La Alamat MAC Ini didefinisikan untuk perpustakaan ini sebagai array 6-byte. Alamat MAC (seharusnya) merupakan pengidentifikasi unik di mana byte pertama menunjukkan pabrikan dan model dan byte terakhir menunjukkan perangkat tertentu. Yang terintegrasi ENC28J60 tidak menyertakan alamat MAC kecuali Anda memilih untuk juga membeli a Alamat MAC terintegrasi dari Microchip (atau seluruh blok YES alamat ke IEEE jika penggunaan perangkat cukup besar sehingga bermanfaat). Jika Anda tidak memiliki alamat MAC, Anda dapat membuatnya, berhati-hatilah agar tidak bertentangan dengan alamat lain di jaringan tempat perangkat berada.
Jika konfigurasi dilakukan dengan server DHCP dan bukan "dengan tangan", fungsinya IP lokal() Berguna untuk melihat alamat yang telah ditetapkan server ke modul. Untuk memperbarui alamat yang ditetapkan (jika waktu yang bersangkutan telah habis) itu Perpustakaan Ethernet menyediakan fungsinya menjaga() yang juga akan menginformasikan dengan mengembalikan kode yang sesuai dengan status perpanjangan:
- Operasi tersebut tidak membuahkan hasil
-
Terjadi kesalahan saat memperbarui alamat IP
Penggunaan alamat IP yang ditetapkan pada server yang sama tidak dapat diperpanjang - Alamat IP berhasil diperbarui
-
Pengikatan ulang alamat IP gagal
Penggunaan alamat IP yang ditetapkan tidak dapat diperpanjang di server mana pun - Alamat IP berhasil ditetapkan ulang
Dengan informasi yang terlihat sejauh ini, Anda dapat menulis contoh bagaimana koneksi Ethernet akan dimulai dengan mengkonfigurasi alamat IP melalui server DHCP di jaringan. Contoh kode berikut mencoba memperbarui alamat IP setiap jangka waktu tertentu dan melaporkan hasilnya.
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(“]”);
}
|
Contoh di bawah ini menetapkan alamat IP dan konfigurasi lainnya secara manual menggunakan objek Alamat IP agar lebih nyaman dibaca dan (dalam kasus kode yang lebih kompleks) untuk menghindari kesalahan yang dapat terjadi jika alamat ditulis (salah) setiap kali digunakan.
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. Mulai koneksi dalam mode klien atau server
Saat memulai koneksi dalam mode server, sistem mikrokontrol yang sedang dikembangkan mendengarkan permintaan dari sistem lain. Untuk memulai koneksi sebagai server, gunakan Server Ethernet() dan port tempat server akan mendengarkan ditunjukkan sebagai parameter. Server Ethernet() adalah konstruktor kelas Server, yang mendukung semua operasi Ethernet sebagai server. Meskipun hal yang paling ortodoks adalah melakukan panggilan ke konstruktor Server Ethernet(), tidak jarang kita menemukan beberapa contoh yang langsung menggunakan kelas tersebut Server atau perpustakaan alternatif untuk koneksi Ethernet yang memilih untuk menggunakan sistem instantiasi tersebut.
Koneksi sebagai klien adalah koneksi yang membuat permintaan ke sistem server, yang menunggunya dan menjawabnya sesuai dengan itu. Untuk memulai koneksi sebagai klien, gunakan Klien Ethernet() apa konstruktor kelasnya Pelanggan asal semua operasi Ethernet sebagai klien.
Berbeda dengan apa yang terjadi dengan mode server, yang diasumsikan berfungsi sejak kelas dipakai (walaupun kelas hanya akan merespons klien jika memang benar), Anda harus memverifikasi bahwa koneksi klien sudah siap sebelum menggunakannya. Objek klien yang dibuat saat koneksi dimulai dapat ditanyakan untuk melihat apakah tersedia. Misalnya, operasi kueri dapat dimasukkan dalam suatu struktur jika (Klien Ethernet) untuk mengeksekusinya hanya ketika koneksi klien tersedia.
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. Membangun koneksi sebagai klien
Seperti yang telah dikatakan, setelah koneksi dibuat, klienlah yang mengambil inisiatif untuk mengajukan pertanyaan. Server akan menunggu inisiatif itu dan akan meresponsnya. Oleh karena itu, klienlah yang terhubung ke server, untuk itu kami menggunakannya Menghubung() menunjukkan server sebagai parameter (alamat IP atau URL) dan pelabuhan pada orang yang mendengarkan.
Berdasarkan hasil operasi, fungsi akan mengembalikan nilai
- ( ) Koneksi berhasil dibuat
- Membangun koneksi
- ( ) Batas waktu telah berlalu tanpa koneksi dibuat
- ( ) Server tidak ditemukan atau tidak merespons dengan benar
- ( ) Sambungan terputus sebelum tersambung sepenuhnya
- ( ) Respons server salah
Sebelum mulai membuat pertanyaan, perlu untuk memverifikasi bahwa koneksi berfungsi dengan baik terhubung() itu akan kembali jika sudah tersedia atau jika tidak.
Contoh di bawah mengilustrasikan koneksi sebagai klien, memeriksa setiap 10 detik untuk melihat apakah ada koneksi ke server (ini tidak dimaksudkan untuk menjadi sesuatu yang produktif, hanya untuk menunjukkan sintaks fungsinya) sesuatu yang, omong-omong, server web produksi tidak akan terlalu menyukainya.
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. Kirim data
Seperti kelas lain yang lebih terkenal, seperti Serial, dan dengan penggunaan yang sebanding, kelas-kelas Pelanggan y Server memiliki fungsi
-
Mengirim informasi menggunakan objek klien atau server tempat informasi tersebut dipanggil. Parameter "data" adalah satu byte o tangki sedangkan "buffer" adalah array byte o tangki yang mana jumlah yang sama dengan "panjang" dikirim. Fungsi ini adalah yang digunakan untuk operasi biner, dibandingkan dengan dua fungsi berikutnya yang biasanya dicadangkan untuk mengirim teks.
-
Mengirimkan sebagai klien atau server (tergantung pada kelas yang digunakannya) informasi yang terkait dengan "data" sebagai teks. Jika informasi tidak dinyatakan sebagai teks (misalnya bilangan bulat) parameter opsional "base" dapat digunakan untuk memilih konversi, yang dapat berupa salah satu konstanta BIN, OCT, DEC atau HEX yang masing-masing menunjukkan. basis sesuai dengan biner (basis 2), oktal (basis 8), desimal (basis 10) dan heksadesimal (basis 16)
-
Operasi ini identik dengan yang sebelumnya kecuali untuk pengiriman, setelah informasi secara tegas ditunjukkan oleh parameter "data", pengangkutan kembali (kode 13 yang dapat direpresentasikan sebagai \r) dan akhir baris (kode 10, yang dapat berupa diwakili oleh \n) Kode-kode ini masing-masing sering disebut dengan akronim CR (Pengembalian Kereta) dan LF (Umpan Baris)
Tiga fungsi sebelumnya mengembalikan jumlah byte yang telah dikirim, begitu pula fungsi setara kelasnya Serial; Seperti disebutkan di atas, pengoperasiannya sebanding.
5. Menerima data
Seperti halnya operasi pengiriman data, operasi penerimaan sebanding dengan operasi yang banyak digunakan Serial. Protokol penerimaannya juga serupa: periksa apakah ada (cukup) data yang tersedia (tersedia) dan dalam hal ini membacanya
-
Mengembalikan jumlah byte yang tersedia untuk dibaca. Fungsi ini ada di kedua kelas Pelanggan sebagai Server; Dalam kasus pertama, ia melaporkan jumlah byte yang dikirim server sebagai respons terhadap permintaan dan tersedia untuk dibaca oleh klien (Baca baca), dan dalam kasus kedua klien (objek) yang telah melakukan operasi atau false jika tidak ada.
-
Digunakan untuk membaca informasi yang telah diterima. Fitur ini hanya tersedia di kelas Pelanggan. Jika aplikasi yang dikembangkan memenuhi peran server, untuk membaca informasi yang masuk, objek klien harus dibuat instance-nya dengan respon fungsi. tersedia () dibahas pada bagian sebelumnya.
Contoh berikut adalah "server caps" yang mendengarkan pada port 2000 dan merespons permintaan dengan apa pun yang dikirim dalam huruf besar semua jika memungkinkan. Itu bisa diuji, misalnya dengan Putty atau hanya dengan Hal ini tentu sangat tidak praktis, tujuannya hanya untuk menunjukkan bagaimana cara memperoleh data yang dikirimkan oleh klien dari server.
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. Akhiri koneksi
Meskipun biasanya aplikasi server berjalan tanpa batas waktu, koneksi klien dibuat, dibuat koneksi, dan diakhiri, memungkinkan sumber daya dipulihkan dan digunakan dalam koneksi lain atau didedikasikan untuk penggunaan program lainnya. Fungsinya berhenti() dari kelas Pelanggan Ini digunakan untuk mengakhiri koneksi klien dan membebaskan sumber daya apa pun yang digunakannya.
Untuk server, fakta bahwa klien mengakhiri koneksi ketika objek informasi kueri telah dikirim atau diterima juga memungkinkannya mengosongkan sumber daya untuk mengalokasikannya ke koneksi lain atau tujuan berbeda. Singkatnya, meskipun tampak kecil, disarankan untuk mengakhiri koneksi ketika operasi klien berakhir.
Praktik baik lainnya saat mengakhiri koneksi klien adalah dengan mengosongkan yang digunakan kelas tersebut. Untuk melakukan ini, fungsi tersebut tersedia menyiram() harus dipanggil setelah mengakhiri koneksi klien dengan berhenti()
Contoh kueri HTTP GET
Untuk lebih memperjelas semua hal di atas, contoh permintaan yang lebih lengkap disertakan di bawah ini. TCP menggunakan permintaan GET menggunakan protokol HTTP. Dalam contoh, nilai yang diperoleh sensor analog yang terhubung ke papan Arduino dikirim ke server web yang menyimpannya dalam database.
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;
}
}
}
|
Posting