Arduino के साथ ईथरनेट टीसीपी कनेक्शन
सॉफ़्टवेयर के दृष्टिकोण से, एक कनेक्शन स्थापित करना ईथरनेट साथ Arduino यह बहुत ही सरल है। ऐसा करने के लिए, का उपयोग करें ईथरनेट लाइब्रेरी. यह लाइब्रेरी एक के लिए डिज़ाइन की गई है ईथरनेट शील्ड जो एकीकृत पर आधारित है W5100, लेकिन अन्य अलग-अलग बोर्ड या मॉड्यूल हैं और/या जो अन्य एकीकृत मॉड्यूल का उपयोग करते हैं, जैसे कि ENC28J60. इसके उपयोग को सरल बनाने और अनुकूलता बढ़ाने के लिए, अन्य पुस्तकालय (लगभग) इसका उपयोग करते हैं API कि ईथरनेट लाइब्रेरी, आपको केवल वैकल्पिक लाइब्रेरी को मूल लाइब्रेरी से बदलना होगा या उसके स्थान पर इसे शामिल करना होगा (जब नाम अलग हो) भले ही कोड में समान (या बहुत समान) फ़ंक्शन का उपयोग किया गया हो। मेरे मामले में, मैं इसका उपयोग करता हूं यूआईपीई ईथरनेट लाइब्रेरी de नॉर्बर्ट ट्रुचसेस उसी प्रक्रिया का पालन करें जिसका मैं इस पाठ में वर्णन करने जा रहा हूं।
1. ईथरनेट कनेक्शन को परिभाषित करें
चाहे आप की भूमिका अपनाने जा रहे हों ग्राहक की तरह सर्वर, सबसे पहले आपको फ़ंक्शन के साथ कनेक्शन को परिभाषित करना होगा शुरू () जिसे केवल एक पैरामीटर के रूप में पारित किया जा सकता है मैक पते और सर्वर की प्रतीक्षा करें डीएचसीपी नेटवर्क पर एक असाइन करें आईपी एड्रेस और शेष कॉन्फ़िगरेशन या पूर्ण कॉन्फ़िगरेशन परिभाषित होने तक (वैकल्पिक रूप से) अधिक पैरामीटर इंगित करना भी संभव है:
- Dirección मैक (जिसका उल्लेख पहले ही किया जा चुका है)
- आईपी एड्रेस ढाल या मॉड्यूल का
- सर्वर आईपी पता डीएनएस (केवल एक सर्वर)
- का आईपी पता द्वार
- नेट मास्क
सभी मापदंडों को इंगित करने की सलाह दी जाती है, जब तक कि उनकी कटौती सामान्य न हो, ताकि कॉन्फ़िगरेशन सही न हो (उदाहरण के लिए, गेटवे नेटवर्क का पहला पता नहीं है)।
ऊपर से ऐसा लगता है कि यह स्पष्ट है कि आईपी पते का प्रतिनिधित्व करने वाले डेटा का उपयोग अक्सर किया जाना चाहिए, यही कारण है कि लाइब्रेरी में क्लास शामिल है आईपी पता जिससे आईपी एड्रेस ऑब्जेक्ट को तुरंत चालू किया जा सके। इसे परिभाषित करने वाले पैरामीटर किसी पते के चार बाइट्स हैं IPV4
La मैक पते इसे इस लाइब्रेरी के लिए 6-बाइट सरणी के रूप में परिभाषित किया गया है। मैक एड्रेस एक विशिष्ट पहचानकर्ता है (माना जाता है) जिसमें पहले बाइट्स निर्माता और मॉडल को दर्शाते हैं और अंतिम बाइट्स विशिष्ट डिवाइस को दर्शाते हैं। एकीकृत ENC28J60 इसमें मैक एड्रेस शामिल नहीं है जब तक कि आप इसे खरीदना नहीं चुनते माइक्रोचिप से एकीकृत मैक पता (या एक पूरा ब्लॉक उई पते का आईईईई यदि उपकरणों का संचालन इसे सार्थक बनाने के लिए पर्याप्त बड़ा है)। जब आपके पास मैक पता नहीं है, तो आप एक का आविष्कार कर सकते हैं, इस बात का ख्याल रखते हुए कि यह उस नेटवर्क पर दूसरों के साथ टकराव नहीं करता है जहां डिवाइस स्थित है।
यदि कॉन्फ़िगरेशन "हाथ से" के बजाय डीएचसीपी सर्वर से किया जाता है, तो फ़ंक्शन लोकलआईपी() सर्वर द्वारा मॉड्यूल को दिए गए पते से परामर्श करना उपयोगी है। निर्दिष्ट पते को नवीनीकृत करने के लिए (यदि संबंधित समय समाप्त हो गया है)। ईथरनेट लाइब्रेरी फ़ंक्शन प्रदान करता है बनाए रखना() जो नवीनीकरण की स्थिति के अनुरूप एक कोड लौटाकर भी सूचित करेगा:
- ऑपरेशन का कोई असर नहीं हुआ
-
IP पता नवीनीकृत करने में त्रुटि
उसी सर्वर पर निर्दिष्ट आईपी पते का उपयोग बढ़ाया नहीं जा सका - आईपी पता सफलतापूर्वक नवीनीकृत हो गया
-
आईपी एड्रेस रीबाइंड विफल रहा
निर्दिष्ट आईपी पते का उपयोग किसी भी सर्वर पर नहीं बढ़ाया जा सकता है - IP पता सफलतापूर्वक पुन: असाइन किया गया
अब तक देखी गई जानकारी के साथ, आप एक उदाहरण लिख सकते हैं कि नेटवर्क पर एक डीएचसीपी सर्वर के माध्यम से आईपी पते को कॉन्फ़िगर करके ईथरनेट कनेक्शन कैसे शुरू किया जाएगा। निम्नलिखित उदाहरण कोड प्रत्येक निश्चित अवधि में आईपी पते को नवीनीकृत करने का प्रयास करता है और परिणाम की रिपोर्ट करता है।
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(“]”);
}
|
नीचे दिया गया उदाहरण ऑब्जेक्ट का उपयोग करके मैन्युअल रूप से आईपी पता और शेष कॉन्फ़िगरेशन निर्दिष्ट करता है आईपी पता इसे पढ़ने में अधिक आरामदायक बनाने के लिए और (अधिक जटिल कोड के मामले में) उन त्रुटियों से बचने के लिए जो हर बार उपयोग किए जाने पर पता (गलत) लिखे जाने पर हो सकती हैं।
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. क्लाइंट या सर्वर मोड में कनेक्शन प्रारंभ करें
सर्वर मोड में कनेक्शन शुरू करते समय, यह विकसित किया जा रहा माइक्रोकंट्रोल्ड सिस्टम है जो अन्य सिस्टम के अनुरोधों को सुनता है। सर्वर के रूप में कनेक्शन प्रारंभ करने के लिए, उपयोग करें ईथरनेटसर्वर() और जिस पोर्ट पर सर्वर सुनेगा उसे एक पैरामीटर के रूप में दर्शाया गया है। ईथरनेटसर्वर() क्लास का कंस्ट्रक्टर है सर्वर, जो एक सर्वर के रूप में सभी ईथरनेट संचालन का समर्थन करता है। हालाँकि सबसे रूढ़िवादी बात कंस्ट्रक्टर को कॉल करना है ईथरनेटसर्वर(), कुछ उदाहरण मिलना असामान्य नहीं है जो सीधे कक्षा का उपयोग करते हैं सर्वर या ईथरनेट कनेक्शन के लिए वैकल्पिक लाइब्रेरी जो उस इंस्टेंटिएशन सिस्टम का उपयोग करना चुनते हैं।
क्लाइंट के रूप में कनेक्शन वह है जो सर्वर सिस्टम से अनुरोध करता है, जो उनका इंतजार करता है और तदनुसार उनका उत्तर देता है। एक ग्राहक के रूप में कनेक्शन आरंभ करने के लिए, उपयोग करें ईथरनेटक्लाइंट() क्लास का कंस्ट्रक्टर क्या है? ग्राहक एक ग्राहक के रूप में सभी ईथरनेट संचालन की उत्पत्ति।
सर्वर मोड के साथ जो होता है, उसके विपरीत, जिसे क्लास इंस्टेंटिअट होने के क्षण से काम करना माना जाता है (हालांकि यह क्लाइंट को केवल तभी प्रतिक्रिया देगा यदि यह वास्तव में है), आपको इसका उपयोग करने से पहले यह सत्यापित करना होगा कि क्लाइंट कनेक्शन तैयार है। कनेक्शन शुरू होने पर जो क्लाइंट ऑब्जेक्ट बनाया जाता है, उससे यह देखने के लिए पूछताछ की जा सकती है कि क्या वह उपलब्ध है। उदाहरण के लिए, क्वेरी संचालन को एक संरचना में शामिल किया जा सकता है यदि (ईथरनेट क्लाइंट) क्लाइंट कनेक्शन उपलब्ध होने पर ही उन्हें निष्पादित करें।
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. एक ग्राहक के रूप में संबंध स्थापित करें
जैसा कि कहा गया है, एक बार कनेक्शन बन जाने के बाद, ग्राहक ही प्रश्न पूछने की पहल करता है। सर्वर उस पहल की प्रतीक्षा करेगा और तदनुसार प्रतिक्रिया देगा। इसलिए, यह क्लाइंट है जो सर्वर से जुड़ता है, ऐसा करने के लिए हम इसका उपयोग करते हैं जुडिये() सर्वर को पैरामीटर (आईपी एड्रेस या) के रूप में इंगित करना यूआरएल) और द बंदरगाह जो सुनता है उसमें.
ऑपरेशन के परिणाम के आधार पर, फ़ंक्शन मान लौटाएगा
- ( ) कनेक्शन सफलतापूर्वक स्थापित हो गया
- कनेक्शन स्थापित करना
- ( ) कनेक्शन स्थापित किए बिना समय समाप्त हो गया है
- ( ) सर्वर नहीं मिला या सही ढंग से प्रतिक्रिया नहीं दे रहा है
- ( ) कनेक्शन पूरी तरह से स्थापित होने से पहले ही हटा दिया गया था
- ( ) सर्वर प्रतिक्रिया गलत है
प्रश्न पूछना शुरू करने से पहले, यह सत्यापित करना आवश्यक है कि फ़ंक्शन के साथ कनेक्शन चालू है जुड़े हुए() वह वापस आ जाएगा यदि यह पहले से ही उपलब्ध है या अन्यथा।
नीचे दिया गया उदाहरण एक क्लाइंट के रूप में कनेक्शन को दर्शाता है, यह देखने के लिए हर 10 सेकंड में जाँच करता है कि क्या सर्वर से कोई कनेक्शन है (इसका उद्देश्य कुछ भी उत्पादक नहीं है, केवल कार्यों का सिंटैक्स दिखाना है) कुछ ऐसा, जो, वैसे, एक प्रोडक्शन वेब सर्वर बहुत पसंद नहीं आएगा।
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. डेटा भेजें
अन्य बेहतर ज्ञात वर्गों की तरह, जैसे धारावाहिक, और तुलनीय उपयोग के साथ, कक्षाएं ग्राहक y सर्वर कार्य हैं
-
क्लाइंट या सर्वर ऑब्जेक्ट का उपयोग करके जानकारी भेजता है जिससे इसे बुलाया जाता है। "डेटा" पैरामीटर एकल है बाइट o टैंक जबकि "बफर" एक सरणी है बाइट o टैंक जिसमें से "लंबाई" के बराबर राशि भेजी जाती है। यह फ़ंक्शन बाइनरी ऑपरेशंस के लिए उपयोग किया जाता है, अगले दो की तुलना में जो आमतौर पर पाठ भेजने के लिए आरक्षित होते हैं।
-
टेक्स्ट के रूप में "डेटा" से संबंधित जानकारी को क्लाइंट या सर्वर (उस वर्ग के आधार पर जहां से इसका उपयोग किया जाता है) के रूप में भेजता है। यदि जानकारी पाठ के रूप में व्यक्त नहीं की गई है (उदाहरण के लिए यह एक पूर्णांक है) तो वैकल्पिक पैरामीटर "आधार" का उपयोग किया जा सकता है जिसके साथ रूपांतरण का चयन किया जा सकता है, जो क्रमशः BIN, OCT, DEC या HEX को इंगित करने वाले स्थिरांकों में से एक हो सकता है। बाइनरी (आधार 2), ऑक्टल (आधार 8), दशमलव (आधार 10) और हेक्साडेसिमल (आधार 16) के अनुरूप आधार
-
"डेटा" पैरामीटर द्वारा स्पष्ट रूप से इंगित की गई जानकारी के बाद, एक कैरिज रिटर्न (कोड 13 जिसे \r के रूप में दर्शाया जा सकता है) और लाइन का अंत (कोड 10, जिसे भेजा जा सकता है) भेजने के अलावा ऑपरेशन पिछले वाले के समान है। \n द्वारा दर्शाया गया) इन कोडों को अक्सर क्रमशः परिवर्णी शब्द द्वारा संदर्भित किया जाता है सीआर (कैरिज रिटर्न) और एलएफ (लाइन फीड)
पिछले तीन फ़ंक्शन भेजे गए बाइट्स की संख्या लौटाते हैं, जैसा कि क्लास के समतुल्य फ़ंक्शन करते हैं धारावाहिक; जैसा कि ऊपर कहा गया है, ऑपरेशन तुलनीय है।
5. डेटा प्राप्त करें
डेटा भेजने के संचालन के मामले में, प्राप्त करने के संचालन व्यापक रूप से उपयोग किए जाने वाले कार्यों के बराबर हैं धारावाहिक. प्राप्त करने वाला प्रोटोकॉल भी समान है: जांचें कि क्या (पर्याप्त) डेटा उपलब्ध है (उपलब्ध) और उस स्थिति में उन्हें पढ़ें
-
पढ़ने के लिए उपलब्ध बाइट्स की संख्या लौटाता है। यह फ़ंक्शन दोनों वर्गों में मौजूद है ग्राहक जैसा सर्वर; पहले मामले में, यह उन बाइट्स की संख्या की रिपोर्ट करता है जिन्हें सर्वर ने अनुरोध के जवाब में भेजा है और जो क्लाइंट के पढ़ने के लिए उपलब्ध है (पढ़ना), और दूसरे मामले में क्लाइंट (ऑब्जेक्ट) जिसने कोई ऑपरेशन किया है या यदि कोई नहीं है तो गलत है।
-
इसका उपयोग प्राप्त जानकारी को पढ़ने के लिए किया जाता है। यह सुविधा केवल कक्षा में उपलब्ध है ग्राहक. यदि विकसित किया जा रहा एप्लिकेशन सर्वर की भूमिका को पूरा करता है, तो आने वाली जानकारी को पढ़ने के लिए, क्लाइंट ऑब्जेक्ट को फ़ंक्शन की प्रतिक्रिया के साथ तुरंत चालू करना होगा उपलब्ध () पिछले अनुभाग में चर्चा की गई।
निम्नलिखित उदाहरण एक "कैप्स सर्वर" है जो पोर्ट 2000 पर सुनता है और जब संभव हो तो सभी कैप्स में भेजे गए अनुरोधों का जवाब देता है। उदाहरण के लिए, इसका परीक्षण किया जा सकता है पुट्टी या बस साथ यह निश्चित रूप से बहुत व्यावहारिक नहीं है, इसका उद्देश्य केवल यह दिखाना है कि क्लाइंट द्वारा सर्वर से भेजे गए डेटा को कैसे प्राप्त किया जाए।
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. कनेक्शन समाप्त करें
जबकि सर्वर एप्लिकेशन के लिए अनिश्चित काल तक कार्य करना सामान्य बात है, क्लाइंट कनेक्शन स्थापित होते हैं, कनेक्शन बनाते हैं और समाप्त हो जाते हैं, जिससे संसाधनों को पुनर्प्राप्त किया जा सकता है और अन्य कनेक्शनों में उपयोग किया जा सकता है या प्रोग्राम के अन्य उपयोगों के लिए समर्पित किया जा सकता है। कार्यक्रम रुकें() कक्षा के ग्राहक इसका उपयोग क्लाइंट कनेक्शन को समाप्त करने और उसके द्वारा उपयोग किए जा रहे किसी भी संसाधन को मुक्त करने के लिए किया जाता है।
सर्वर के लिए, तथ्य यह है कि जब क्वेरी की सूचना वस्तु भेजी या प्राप्त की जाती है तो क्लाइंट कनेक्शन समाप्त कर देता है, यह संसाधनों को अन्य कनेक्शनों या विभिन्न उद्देश्यों के लिए आवंटित करने के लिए मुक्त करने की भी अनुमति देता है। संक्षेप में, हालांकि यह मामूली लगता है, क्लाइंट का परिचालन समाप्त होने पर कनेक्शन समाप्त करने की सलाह दी जाती है।
क्लाइंट कनेक्शन समाप्त करते समय एक और अच्छा अभ्यास खाली करना है जिसे कक्षा उपयोग करती है। ऐसा करने के लिए, फ़ंक्शन उपलब्ध है फ्लश () क्लाइंट कनेक्शन समाप्त करने के बाद कॉल किया जाना चाहिए रुकें()
HTTP GET क्वेरी उदाहरण
उपरोक्त सभी को बेहतर ढंग से स्पष्ट करने के लिए, अनुरोधों का एक अधिक संपूर्ण उदाहरण नीचे शामिल किया गया है। टीसीपी का उपयोग करके GET अनुरोधों का उपयोग करना HTTP प्रोटोकॉल. उदाहरण में, Arduino बोर्ड से जुड़े एनालॉग सेंसर द्वारा प्राप्त मान एक वेब सर्वर पर भेजे जाते हैं जो उन्हें डेटाबेस में संग्रहीत करता है।
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;
}
}
}
|
टिप्पणी पोस्ट