Sie sind auf Seite 1von 13

El bus de servicios de Windows Azure y el Internet de las Cosas, Parte 2

En nuestra ltima columna (msdn.microsoft.com/magazine/dn574801), hablamos sobre el


panorama de la tecnologa actual para mquina-a-mquina (M2M) de computacin, que se
refiere a las tecnologas que los dispositivos de interconexin, por lo general para la
instrumentacin industrial, en forma de sensores o medidores. La proliferacin de-a programa
fcil pequeos ordenadores asequibles y se ha ampliado este concepto en lo que se llama
Internet-de-objetos (IO), abriendo la puerta a escenarios en los aparatos domsticos comunes
pueden ser controlados o se utilizan como fuentes de informacin para generar eventos. De
esta manera, no es difcil para enviar alertas cuando es el momento para reponer la nevera,
cerrar automticamente las persianas de la ventana cuando cae la noche o ajuste el
termostato sobre la base de los hbitos familiares.


Tambin hicimos el caso de utilizar el servicio de Windows Azure Bus para la conectividad de
dispositivos, como una alternativa al uso de una VPN, cuando se trata de resolver el
direccionamiento, la seguridad y los problemas de rendimiento relacionados con el despliegue
de un gran nmero de sensores o medidores. Esto se est convirtiendo cada vez ms relevante
teniendo en cuenta que, segn el ltimo informe de BI Inteligencia de Business Insider, habr
ms de 9 mil millones de conexiones directamente relacionados con la IO para el ao 2018
(read.bi/18L5cg8).

El uso de una cola de Service Bus designado o el tema de un dispositivo ofrece una forma
elegante para incorporar resistencia y conectividad ocasional para las aplicaciones de la IO. En
este artculo, vamos a caminar a travs de una prctica en la aplicacin de Windows Azure que
ilustra estos conceptos, el diseo de un plan de servicio de bus con dispositivos colas, la
implementacin de una funcin de trabajo de escucha en los servicios de la nube, y la
programacin de un dispositivo de Arduino que ejecuta comandos enviados remotamente por
clientes mviles, como se muestra en la Figura 1.


Figura 1 Un Internet-de-cosas Arquitectura Utilizando el Windows Azure Service Bus

Si nos fijamos en el diagrama, el componente de Windows Azure Service Bus se convierte en la
pieza central del diseo, proporcionando la autenticacin, la distribucin de mensajes y
escalabilidad para soportar los mltiples dispositivos que vayan a enviar datos o recibir
comandos remotos. El servicio de autobs est disponible en todos los centros de datos de
Microsoft que ofrecen servicios de Windows Azure, y est respaldado por una infraestructura
de almacenamiento altamente redundante. Adems, como todos los dems componentes de
Windows Azure, que ofrece una interfaz abierta y REST fcil de entender, junto con mltiples
SDKs (Microsoft. NET Framework, Java, PHP, Ruby, entre otros) construidas en la parte
superior de la misma.

En nuestra propuesta de arquitectura, dispositivos de "hablar" con una aplicacin de NET.
Ejecuta en Windows Azure servicios en la nube, que acta como una puerta de entrada al bus
de servicios con el fin de simplificar el proceso de comunicacin con su cola asignada. Este
enfoque permite totalmente cualquiera de los cuatro patrones de comunicacin de la IO se
describen en nuestra columna anterior: Telemetra, Consulta, Mando y Notificacin. Aqu,
vamos a implementar un escenario en el que un dispositivo mvil enva un comando a otro
dispositivo con el fin de ejecutar una accin, en este caso, convertir una en LED o apagado.
Uno de los beneficios de esta solucin es que si el dispositivo est temporalmente fuera de
lnea, puede recoger los comandos cada vez que se conecte a Internet. Tambin puede
establecer una fecha de caducidad en un mensaje para evitar la ejecucin de una tarea en un
momento inconveniente o programar mensajes para ser enviados en un momento especfico
en el futuro.

Para este ejemplo, vamos a utilizar el conocido dispositivo Arduino bien documentada, como
se describe en nuestra columna anterior. Para la parte de cliente mvil de la prueba-de-
concepto, vamos a crear una aplicacin de Windows Phone.
Aqu est nuestro escenario simple :

Cuando se inicia el dispositivo de Arduino , enva una seal de identificacin de la aplicacin de
puerta de enlace se ejecuta en Windows Azure Cloud Services . La puerta de enlace crea una
cola de Service Bus para el dispositivo en caso de que no exista, y establece una conexin TCP ,
listo para enviar comandos .
Una aplicacin de Windows Phone enva un comando a la cola de servicio de Windows Azure
Bus asignado al dispositivo .
El mensaje permanece en la cola hasta que la aplicacin de puerta de enlace lo recoge y enva
el comando al dispositivo Arduino a travs de la conexin TCP establecida .
El dispositivo Arduino convierte al LED encendido o apagado basado en el comando.
Echemos un vistazo a los pasos para que esto suceda , uno por uno.

Paso 1: Crear el servicio de Windows Azure Bus Espacio de nombres con sus credenciales de
Windows Azure ( puede solicitar una cuenta de prueba en bit.ly/1atsgSa ) , inicie sesin en el
portal Web y haga clic en la seccin BUS SERVICE ( ver Figura 2 ) . Seleccione la opcin Crear y
escriba un nombre para el espacio de nombres. A continuacin , haga clic en la informacin de
conexin y copiar el texto en el cuadro Cadena de conexin , lo que usted necesitar ms
adelante



Figura 2 Creacin del Bus de servicio Windows Azure Espacio de nombres

Paso 2: Crear la aplicacin de puerta de enlace e implementacin de Windows Azure Cloud
Services Cdigo para la aplicacin de puerta de enlace, que recupera los mensajes de la cola de
servicio de autobs y transmite las rdenes al dispositivo Arduino, se incluye en la descarga de
cdigo (disponible en msdn.microsoft. com/magazine/msdnmag0314). Se basa en el trabajo de
Clemens ms vasto, que contribuyeron amablemente su gua y experiencia para este artculo.
Su proyecto original se puede encontrar en bit.ly/L0uK0v.

Antes de profundizar en este cdigo, asegrese de que tiene instalado Visual Studio 2013,
junto con la versin 2.2 del Windows Azure SDK para. NET (bit.ly/JYXx5n). La solucin consta
de tres proyectos diferentes:

ArduinoListener-contiene el cdigo principal WorkerRole.
ConsoleListener-la versin de consola del ArduinoListener, para la prueba local.
MSDNArduinoListener-el proyecto de implementacin de Windows Azure para
ArduinoListener.
Si usted examina los archivos ServiceConfiguration.cscfg (tanto para la nube y implementacin
local) para el proyecto MSDNArduinoListener, vers un entorno que almacena la cadena de
conexin para el servicio de autobs. Reemplazar su valor con el obtenido en el Paso 1. El
resto ya est configurado para que la solucin funcione, incluyendo la definicin de 10,100
puerto para recibir conexiones de los dispositivos. A continuacin, abra el archivo
WorkerRole.cs en el proyecto ArduinoListener, donde se encuentra el cdigo principal.
En primer lugar, se crea un TcpListener, y se aceptan las conexiones de los dispositivos:

1. var deviceServer = new TcpListener(deviceEP);
2. deviceServer.Start(10);
3. try
4. {
5. do
6. {
7. TcpClient connection =
8. await deviceServer.AcceptTcpClientAsync();
9. if (connection != null)
10. { ...
Una vez que una conexin con el dispositivo se ha establecido un NetworkStream se define y
establece en modo de escucha. La variable readBuffer contendr el valor identificador enviado
por cada dispositivo Arduino: ed:


1. NetworkStream deviceConnectionStream = connection.GetStream();
2. var readBuffer = new byte[64];
3. if (await deviceConnectionStream.ReadAsync(readBuffer, 0, 4) == 4)
4. {
5. int deviceId =
6. IPAddress.NetworkToHostOrder(BitConverter.ToInt32(readBuffer, 0));
7. ...
A continuacin, se crea una cola basada en el valor deviceId (en caso de que no existe), y un
objeto de receptor de mensaje se define (vase la Figura 3). Entonces, el receptor de colas
dispositivo est configurado en el modo asncrono para tirar mensajes (comandos de la cola).
Esta cola va a almacenar los comandos enviados por los dispositivos mviles, como un telfono
de Windows.
Figura 3 Creacin de una cola

1. var namespaceManager =
2. NamespaceManager.CreateFromConnectionString(
3. RoleEnvironment.GetConfigurationSettingValue("serviceBusConnectionString"
));
4. if (!namespaceManager.QueueExists(string.Format("dev{0:X8}", deviceId)))
5. {
6. namespaceManager.CreateQueue(string.Format("dev{0:X8}", deviceId));
7. }
8. var deviceQueueReceiver = messagingFactory.CreateMessageReceiver(
9. string.Format("dev{0:X8}", deviceId), ReceiveMode.PeekLock);
10. do
11. {
12. BrokeredMessage message = null;
13. message = await deviceQueueReceiver.ReceiveAsync();
14. ...
Cuando se recibe un mensaje de la cola, su contenido es inspeccionado y si coincide con los
comandos "OFF" en "ON" o, la informacin se escribe en el flujo de la conexin establecida con
el dispositivo (ver figura 4).

1. if (message != null)
2. {
3. Stream stream = message.GetBody<Stream>();
4. StreamReader reader = new StreamReader(stream);
5. string command = reader.ReadToEnd();
6. if (command != null)
7. {
8. switch (command.ToUpperInvariant())
9. {
10. case "ON":
11. await deviceConnectionStream.WriteAsync(OnFrame, 0,
12. OnFrame.Length);
13. await message.CompleteAsync();
14. break;
15. case "OFF":
16. await deviceConnectionStream.WriteAsync(OffFrame, 0,
17. OffFrame.Length);
18. await message.CompleteAsync();
19. break;
20. }
21. }
22. }


Observe que el mensaje no se elimina de la cola (message.CompleteAsync) a menos que
la operacin de escritura en la secuencia de la conexin del dispositivo se realiza
correctamente. Adems, con el fin de mantener viva la conexin, se espera que el
dispositivo para que enve un latido ping. Para esta prueba de concepto, no estamos
esperando la confirmacin de que el dispositivo cuando se recibe el mensaje. En un
sistema de produccin, sin embargo, esto estara obligado a cumplir con el patrn de
"comando".

Paso 3: Implementar el proyecto de Windows Azure ArduinoListener a Cloud Services
Implementar el ArduinoListener a Windows Azure es extremadamente simple. En
Visual Studio 2013, haga clic en el proyecto MSDNArduinoListener y seleccione la
opcin de Publicar. Encontrar instrucciones especficas para el Publica de Windows
Asistente para aplicaciones Azure en bit.ly/1iP9g2p. Despus de completar el asistente,
usted termina con un servicio de nube situada en xyz.cloudapp.net. Anote este nombre,
ya que lo necesitar cuando se crea el cliente Arduino en el siguiente paso.

Paso 4: Programe el dispositivo Arduino para comunicarse con la pasarela (Listener)
Arduino dispositivos ofrecen una rica interfaz para la realizacin de operaciones de la
red utilizando un objeto de cliente Web simple. Para nuestro prototipo, se decidi
utilizar el modelo Arduino Uno R3 (bit.ly/18ZlcM8), junto con su correspondiente
escudo Ethernet (bit.ly/1do6eRD). Para instalar, interactuar y dispositivos Arduino
programa que utilizan Windows, siga la gua en bit.ly/1dNBi9R. Usted va a terminar
con un IDE fcil de usar (llamada la aplicacin Arduino), donde se puede escribir
programas (llamados bocetos) utilizando JavaScript, como se muestra en la figura 5.


Figure 5 The Arduino Application
La figura 6 muestra el boceto para interactuar con el Arduino Listener creado en el paso
3, y ahora desplegada en Windows Azure.



1. #include <SPI.h>#include <Ethernet.h>#include <StopWatch.h>
2. // Enter a MAC address and IP address for your controller below.
3. // The IP address will be dependent on your local network,
4. // and it's optional if DHCP is enabled.
5. byte mac[] = { 0x90, 0xA2, 0xDA, 0x0D, 0xBC, 0xAE };
6. static const byte deviceId[] = { 0x00, 0x00, 0x00, 0x01 };
7. static const uint8_t ACK = 0x01;
8. static const int LED_PIN = 8;
9. int connected = 0;
10. EthernetClient client;
11. StopWatch stopWatch;
12. long pingInterval = 200000;
13. void setup() { Serial.begin(9600);
14. Serial.println("Initialized");
15. Ethernet.begin(mac);
16. pinMode(LED_PIN, OUTPUT);}
17. void turnLedOn(){ digitalWrite(LED_PIN, HIGH);}
18. void turnLedOff(){ digitalWrite(LED_PIN, LOW);}
19. void loop() {
20. if ( connected == 0) {
21. Serial.println("Trying to connect");
22. char* host = "xyz.cloudapp.net";
23. client.setTimeout(10000);
24. connected = client.connect(host, 10100);
25. if (connected) {
26. Serial.println(
27. "Connected to port, writing deviceId and waiting for commands...");
28. client.write(deviceId, sizeof(deviceId));
29. stopWatch.start();
30. }
31. else
32. {
33. Serial.println("Connection unsuccessful");
34. client.stop();
35. stopWatch.reset();
36. }
37. }
38. if (connected == 1)
39. {
40. if (stopWatch.elapsed() > pingInterval)
41. {
42. Serial.println("Pinging Server to keep connection alive...");
43. client.write(deviceId, sizeof(deviceId));
44. stopWatch.reset();
45. stopWatch.start();
46. }
47. byte buf[16];
48. int readResult = client.read(buf, 1);
49. if (readResult == 0)
50. {
51. Serial.println("Can't find listener, disconnecting...");
52. connected = 0;
53. stopWatch.reset();
54. }
55. else if (readResult == 1)
56. {
57. Serial.println("Data acquired, processing...");
58. switch ( buf[0] )
59. {
60. case 1:
61. Serial.println("Command to turn led on received...");
62. turnLedOn();
63. break;
64. case 2:
65. Serial.println("Command to turn led off received...");
66. turnLedOff();
67. break;
68. }
69. stopWatch.reset();
70. stopWatch.start();
71. }
72. }
73. }
Bocetos para el Arduino tienen dos secciones principales: configuracin y bucle. Las
instrucciones en la seccin de configuracin se ejecutan una vez, y aqu es donde se inicializan
las variables y las conexiones establecidas. En nuestro ejemplo, el cliente de Ethernet y los
valores relacionados se definen, se establece una conexin en serie (para propsitos de
depuracin) y el pin que se conecta el LED se inicializa como un puerto de salida.

Cdigo en la seccin de bucle se ejecuta constantemente, e incluye dos grandes bloques en
funcin del estado de la conexin TCP entre el dispositivo de Arduino y el oyente que se
ejecutan en Windows Azure Cloud Services: conectado o desconectado. Cuando se establece la
conexin por primera vez, un objeto cronmetro se pone en marcha para realizar un
seguimiento del tiempo transcurrido para la conexin. Adems, el identificador de dispositivo
se enva a la escucha, para ser utilizado como el nombre de la cola en la que se almacenan los
mensajes y comandos.

El bloque de cdigo que controla el comportamiento Arduino despus de la conexin se ha
establecido un seguimiento del tiempo transcurrido desde que se cre la conexin, ping al
oyente cada 200.000 ms, para mantener la conexin activa cuando se reciben comandos. Este
cdigo tambin intenta leer los datos por parte del oyente, poniendo los datos en el array buf
cuando llegue. Si se detecta un valor de "1", el LED se enciende, si el valor es "2", el LED se
apaga. El objeto cronmetro se pone a cero despus de cada comando.

Una vez que el boceto se ha cargado en el dispositivo, el cdigo se ejecuta en el controlador
Arduino en un bucle infinito, tratando de conectarse a un servicio en la nube. Cuando se
conecta, enva el ID del dispositivo por lo que el servicio en la nube sabe a qu dispositivo se
est hablando. A continuacin, el cdigo comienza a leer la entrada desde el servicio en la
nube, diciendo que el dispositivo si desea activar o desactivar la luz LED (en este caso, que est
conectado al puerto digital 8 del dispositivo).

Paso 5: Creacin de un cliente de Windows Phone para enviar a la cola de dispositivo La
interaccin con el dispositivo es tan sencillo como enviar mensajes a la cola de un dispositivo.
Como hemos mencionado al principio del artculo, el servicio de Windows Azure Bus
proporciona una interfaz REST que permite interactuar con l a partir de mltiples lenguajes
de programacin. Porque no hay un SDK oficial para desarrolladores de Windows Phone, se
utiliz uno de los ejemplos de la comunidad de Windows Phone, que muestra cmo autenticar
e interactuar con el servicio de bus en las peticiones HTTP y el objeto WebClient. El cdigo
fuente tambin se incluye en la descarga de cdigo, en el proyecto de Visual Studio 2013
denominado MSDNArduinoClient. La figura 7 muestra la pantalla principal del cliente, de la
cual usted enva comandos al dispositivo Arduino.

Figure 7 The Windows Phone Client Interface
Creacin de clientes similares para otros dispositivos mviles (incluyendo iOS y Android) no
sera difcil, ya que la mayora de ellos ofrecen las bibliotecas para generar comandos de REST
utilizando HTTP request clientes. Adems, es posible interactuar directamente con el servicio
de Windows Azure Bus de las lenguas tradicionales como Java, PHP o Ruby, que simplifica este
proceso. Estos SDK se publican bajo una licencia de cdigo abierto, y se puede encontrar en
github.com / windowsazure.

Conclusin
La construccin de una arquitectura de Internet-de-cosas con el Windows Azure Bus de
servicio para administrar dispositivos y servicios de conexiones proporciona una manera fcil
de conseguir, la escala y los clientes de direccin individualmente sin incurrir en costosas
soluciones de VPN, con la ventaja de manejar de manera eficiente los escenarios en ocasiones
inconexas. Colas actan como buzones dedicados donde se intercambian mensajes entre los
dispositivos y los servicios, el apoyo a los diferentes casos de uso y los patrones de
comunicacin que se encuentran comnmente en el campo. Windows Azure proporciona una
infraestructura fiable, geo-distribuida y robusta para el despliegue de los servicios requeridos
con un alto volumen de sensores interconectados y metros-una tendencia que va a seguir
creciendo en los prximos aos.

Bruno Terkaly es un evangelista de desarrollador de Microsoft. Su profundo conocimiento
proviene de aos de experiencia en el campo, escribir cdigo utilizando una multitud de
plataformas, lenguajes, frameworks, SDK, libreras y APIs. Pasa tiempo en escribir cdigo, los
blogs y hacer presentaciones en vivo en la creacin de aplicaciones basadas en la nube, en
concreto utilizando la plataforma Windows Azure. Puedes leer su blog en blogs.msdn.com / b /
brunoterkaly.

Ricardo Villalobos es arquitecto de software con experiencia con ms de 15 aos de
experiencia en el diseo y creacin de aplicaciones para empresas de diversas industrias. La
celebracin de diferentes certificaciones tcnicas, as como una maestra en administracin de
empresas por la Universidad de Dallas, trabaja como arquitecto nube en el DPE comprometida
en el mundo Socios equipo de Microsoft, ayudando a las empresas en todo el mundo para
implementar soluciones en Windows Azure. Puedes leer su blog en blog.ricardovillalobos.com.

Terkaly y Villalobos conjuntamente presentes en conferencias de la industria de gran tamao.
Animan a los lectores de Windows Azure Insider en contacto con ellos para la disponibilidad.
Terkaly se puede llegar a bterkaly@microsoft.com y Villalobos se puede llegar a
Ricardo.Villalobos @ microsoft.com.

Gracias a los siguientes expertos tcnicos de Microsoft por la revisin de este artculo:
Abhishek Lal y Clemens Vasters.

Das könnte Ihnen auch gefallen