اتصال إيثرنت TCP مع اردوينو
من وجهة نظر البرمجيات، إنشاء اتصال إيثرنت مع اردوينو أنها بسيطة جدا. للقيام بذلك، استخدم مكتبة إيثرنت. تم تصميم هذه المكتبة ل درع إيثرنت الذي يقوم على المتكاملة W5100، ولكن هناك لوحات أو وحدات أخرى مختلفة و/أو تستخدم لوحات أو وحدات متكاملة أخرى، مثل ENC28J60. لتبسيط استخدامه وزيادة التوافق، تستخدم المكتبات الأخرى نفس الشيء (تقريبًا). API أن مكتبة إيثرنت، سيكون عليك فقط استبدال المكتبة البديلة بالمكتبة الأصلية أو تضمينها (عندما يكون الاسم مختلفًا) في مكانها حتى لو تم استخدام نفس الوظائف (أو مشابهة جدًا) في الكود. في حالتي، أستخدم مكتبة UIPEthernet de نوربرت تروتشسيس باتباع نفس العملية التي سأصفها في هذا النص.
1. قم بتعريف اتصال إيثرنت
سواء كنت ستتبنى دور زبون مثل واحد الخادمعليك أولاً تحديد الاتصال بالوظيفة يبدأ () والتي يمكن تمريرها كمعلمة فقط عنوان MAC وانتظر الخادم DHCP على الشبكة تعيين أ عنوان IP وبقية التكوين أو من الممكن أيضًا الإشارة (اختياريًا) إلى المزيد من المعلمات حتى يتم تحديد التكوين الكامل:
- Dirección MAC (والذي سبق ذكره)
- عنوان IP من الدرع أو الوحدة
- عنوان IP للخادم DNS (خادم واحد فقط)
- عنوان IP الخاص بـ بوابة
- قناع صافي
من المستحسن الإشارة إلى جميع المعلمات، ما لم يكن خصمها هو المعتاد، لتجنب أن التكوين غير صحيح (على سبيل المثال، أن البوابة ليست العنوان الأول للشبكة).
مما سبق يبدو أنه من الواضح أن البيانات التي تمثل عناوين IP يجب استخدامها كثيرًا، ولهذا السبب تتضمن المكتبة الفصل IPADDRESS يمكن من خلالها إنشاء كائنات عنوان IP. المعلمات التي تحدده هي البايتات الأربعة للعنوان IPV4
La عنوان MAC يتم تعريفه لهذه المكتبة كمصفوفة 6 بايت. يعد عنوان MAC (من المفترض أن يكون) معرفًا فريدًا تشير فيه البايتات الأولى إلى الشركة المصنعة والطراز، وتشير البايتات الأخيرة إلى الجهاز المحدد. المتكاملة ENC28J60 لا يتضمن عنوان MAC إلا إذا اخترت شراء ملف عنوان MAC متكامل من Microchip (أو كتلة كاملة OUI من العناوين إلى IEEE إذا كان تشغيل الأجهزة كبيرًا بما يكفي لجعله جديرًا بالاهتمام). عندما لا يكون لديك عنوان MAC، يمكنك اختراع عنوان، مع الحرص على عدم تعارضه مع العناوين الأخرى الموجودة على الشبكة حيث يوجد الجهاز.
إذا تم التكوين باستخدام خادم DHCP بدلاً من "يدويًا"، فستتم الوظيفة عنوان IP المحلي() من المفيد الرجوع إلى العنوان الذي خصصه الخادم للوحدة. لتجديد العنوان المخصص (في حالة انتهاء الوقت المقابل) مكتبة إيثرنت يوفر الوظيفة يحافظ على() والتي سيتم إعلامك أيضًا من خلال إعادة الرمز الذي يتوافق مع حالة التجديد:
- ولم يكن للعملية أي تأثير
-
حدث خطأ أثناء تجديد عنوان IP
لا يمكن تمديد استخدام عنوان IP المعين على نفس الخادم - تم تجديد عنوان IP بنجاح
-
فشلت إعادة ربط عنوان IP
لا يمكن تمديد استخدام عنوان IP المعين على أي خادم - تمت إعادة تعيين عنوان IP بنجاح
باستخدام المعلومات التي تم الاطلاع عليها حتى الآن، يمكنك كتابة مثال لكيفية بدء اتصال Ethernet عن طريق تكوين عنوان IP من خلال خادم DHCP على الشبكة. يحاول رمز المثال التالي تجديد عنوان 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(“]”);
}
|
يقوم المثال أدناه بتعيين عنوان IP وبقية التكوين يدويًا باستخدام الكائنات IPADDRESS لجعله أكثر راحة في القراءة و(في حالة التعليمات البرمجية الأكثر تعقيدًا) لتجنب الأخطاء التي قد تحدث إذا تمت كتابة العنوان (خطأ) في كل مرة يتم استخدامه فيها.
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. ابدأ الاتصال في وضع العميل أو الخادم
عند بدء الاتصال في وضع الخادم، فإن نظام التحكم الدقيق الذي يتم تطويره هو الذي يستمع للطلبات الواردة من الأنظمة الأخرى. لبدء الاتصال كخادم، استخدم خادم إيثرنت () ويتم الإشارة إلى المنفذ الذي سيستمع إليه الخادم كمعلمة. خادم إيثرنت () هو منشئ الفصل المخدمالذي يدعم كافة عمليات الإيثرنت كخادم. على الرغم من أن الشيء الأكثر تقليدية هو إجراء مكالمة إلى المنشئ خادم إيثرنت ()، ليس من غير المألوف العثور على بعض الأمثلة التي تستخدم الفصل مباشرة المخدم أو مكتبات بديلة لاتصال Ethernet التي تختار استخدام نظام إنشاء مثيل ذلك.
الاتصال كعميل هو الذي يقدم الطلبات إلى نظام الخادم، الذي ينتظرها ويجيب عليها وفقًا لذلك. لبدء الاتصال كعميل، استخدم عميل إيثرنت() ما هو منشئ الطبقة العميل أصل كافة عمليات إيثرنت كعميل.
على عكس ما يحدث مع وضع الخادم، والذي من المفترض أن يعمل من لحظة إنشاء مثيل للفصل (على الرغم من أنه لن يستجيب للعملاء إلا إذا كان كذلك بالفعل)، يجب عليك التحقق من أن اتصال العميل جاهز قبل استخدامه. يمكن الاستعلام عن كائن العميل الذي تم إنشاؤه عند بدء الاتصال لمعرفة ما إذا كان متوفرًا. على سبيل المثال، يمكن تضمين عمليات الاستعلام في البنية إذا (عميل إيثرنت) لتنفيذها فقط عندما يكون اتصال العميل متاحًا.
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. إنشاء اتصال كعميل
كما قيل، بمجرد إنشاء الاتصال، فإن العميل هو الذي يأخذ زمام المبادرة لإجراء الاستفسارات. سيكون الخادم في انتظار هذه المبادرة وسوف يستجيب وفقًا لذلك. ولذلك، فإن العميل هو الذي يتصل بالخادم، للقيام بذلك نستخدمه الاتصال () تشير إلى الخادم كمعلمات (عنوان IP أو URL) و ميناء في من يستمع.
بناءً على نتيجة العملية، ستقوم الدالة بإرجاع القيم
- ( ) تم الاتصال بنجاح
- تأسيس الاتصال
- ( ) لقد انقضت المهلة دون إنشاء الاتصال
- ( ) لم يتم العثور على الخادم أو أنه لا يستجيب بشكل صحيح
- ( ) تم قطع الاتصال قبل أن يتم تأسيسه بالكامل
- ( ) استجابة الخادم غير صحيحة
قبل البدء في إجراء الاستعلامات، من الضروري التحقق من أن الاتصال يعمل مع الوظيفة متصل () التي سوف تعود إذا كان متاحًا بالفعل أو غير ذلك.
يوضح المثال أدناه الاتصال كعميل، والتحقق كل 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 دبابة والتي يتم إرسال مبلغ يساوي "الطول"، هذه الوظيفة هي التي تستخدم للعمليات الثنائية، مقارنة بالوظيفتين التاليتين المخصصتين عادةً لإرسال النص.
-
يرسل كعميل أو خادم (اعتمادًا على الفئة التي يتم استخدامه منها) المعلومات المقابلة لـ "البيانات" كنص. إذا لم يتم التعبير عن المعلومات كنص (على سبيل المثال عدد صحيح)، فيمكن استخدام المعلمة الاختيارية "base" لاختيار التحويل، والذي يمكن أن يكون أحد الثوابت BIN أو OCT أو DEC أو HEX التي تشير، على التوالي. القواعد المقابلة للثنائي (الأساس 2)، والثماني (الأساس 8)، والنظام العشري (الأساس 10)، والنظام الست عشري (الأساس 16)
-
العملية مماثلة للعملية السابقة باستثناء الإرسال، بعد المعلومات التي تشير إليها صراحةً معلمة "البيانات"، حرف إرجاع (الرمز 13 الذي يمكن تمثيله كـ \r) ونهاية السطر (الرمز 10، والذي يمكن تمثيله كـ \r) ممثلة بـ \n) يُشار إلى هذه الرموز بشكل متكرر، على التوالي، بالاختصار CR (عودة النقل) و LF (تغذية الخط)
تقوم الوظائف الثلاث السابقة بإرجاع عدد البايتات التي تم إرسالها، كما تفعل الوظائف المكافئة للفئة مسلسل; كما ذكر أعلاه، العملية قابلة للمقارنة.
5. تلقي البيانات
كما هو الحال في عمليات إرسال البيانات، فإن عمليات الاستقبال قابلة للمقارنة مع تلك المستخدمة على نطاق واسع مسلسل. بروتوكول الاستقبال مشابه أيضًا: تحقق مما إذا كانت هناك بيانات (كافية) متاحة (متاح) وفي هذه الحالة قراءتها
-
إرجاع عدد البايتات المتاحة للقراءة. هذه الوظيفة موجودة في كلا الفئتين العميل كما المخدم; في الحالة الأولى، يقوم بالإبلاغ عن عدد البايتات التي أرسلها الخادم استجابة لطلب والمتاحة للعميل لقراءتها (اقرأ)، وفي الحالة الثانية العميل (الكائن) الذي أجرى العملية أو خطأ في حالة عدم وجودها.
-
يتم استخدامه لقراءة المعلومات التي تم تلقيها. هذه الميزة متاحة فقط في الفصل العميل. إذا كان التطبيق الذي يتم تطويره يؤدي دور الخادم، لقراءة المعلومات التي وصلت، يجب إنشاء كائن العميل مع استجابة الوظيفة متوفرة () تمت مناقشته في القسم السابق.
المثال التالي هو "خادم caps" الذي يستمع على المنفذ 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
لتوضيح كل ما سبق بشكل أفضل، تم تضمين مثال أكثر اكتمالًا للطلبات أدناه. TCP باستخدام طلبات 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;
}
}
}
|
أكتب تعليق