C# RabbitMQClient: Productor de mensajes básico (con WSO2) usando .NET/C# en VS2012

RabbitMQ es un broker de mensajería (ver entrada RabbitMQ primeros pasos con colas de mensajería). Vamos a tratar de usar el cliente para .NET en  un proyecto con MS Visual Studio 2012 para conectar a un broker de mensajería WSO2 (ver WSO2: Broker de mensajería IoT (WSO2 IoTS))

Para instalar el paquete RabbitMQ.Client en VS2012  es recomendable usar el gestor de paquetes incorporado NuGet (RabbitMQ.Client 4.1.3) ejecutando el siguiente comando:

PM> Install-Package RabbitMQ.Client -Version 4.1.3

Para instalar el paquete previamente hemos creado un nuevo proyecto C# para consola.

Importamos la librería con la línea


using RabbitMQ.Client;

La clase ConnectionFactory construye instancias de IConnection y permite configurar el nombre el host, el virtual host y las credenciales de acceso. En vez usar las propiedades  factory.UserName, factory.Password… Compactamos la cadena de conexión en una sola línea usando la propiedad URI.


ConnectionFactory factory = new ConnectionFactory();
factory.Uri = "amqp://admin:admin@localhost:5672/carbon";

WSO2 usa el puerto TCP 5672 como broker de mensajería con el protocolo AMQP, podemos cambiar en cualquier momento el puerto editando el fichero C:\wso2mb-3.1.0\repository\conf\broker.xml.


El último parámetro del URI es el VHost, en WSO2 podemos encontrar información del VHost en C:\wso2mb-3.1.0\repository\conf\advanced\qpid-virtualhosts.xml. El VHost por defecto se llama “carbon”. Dentro del fichero también encontramos información sobre el exchange y queue (“amq.direct" is the default exchange that should be used for queue creation.).


IConnection conn = factory.CreateConnection();

IModel channel = conn.CreateModel();
channel.ExchangeDeclare("amq.direct","direct",true);

Le pasamos la conexión a la instancia IConnection empleado para crear nuevos canales.  La llamada a CreateConnection produce una excepción si el servidor WSO2 está parado por ejemplo.

El interface IModel se usa para el modelo AMQP le pasamos tres parámetros al método ExchangeDeclare. 

  • exchangeName: Un productor nunca envía directamente los mensajes directamente a la cola, en su lugar los envía a un exchange.

 

  • type: Debe ser uno de los siguientes “direct” (los mensajes van sólo a la cola especificada en routingKey), “topic”, “headers” o “fanout” (broadcast a todas las colas).
  • El tercer parámetro “durable” a true mantiene la cola persistente en el servidor.

La última parte es publicar el mensaje usando el método BasicPublish.

 var message = GetMessage(args);
 var body = Encoding.UTF8.GetBytes(message);
 
 channel.BasicPublish(exchange: "amq.direct",
 routingKey: "test-queue",
 basicProperties: null,
 body: body);

 channel.Close();
 conn.Close();

Código completo

Crear la cola en “test-queue” en WSO2

En el servidor WSO2 creamos una cola llamada “test-queue” a media que ejecutemos nuestro cliente publicador irá aumentando el contador de mensajes.

 

Referencias

Anuncios

Protocolos M2M en la nueva era de la IoT

internet-of-things-graphic-story-top

Protocolos M2M en la nueva era de la IoT

Me parece que me ha quedado un título de post algo presuntuoso, el objeto del texto que sigue es recopilar algunos protocolos que se están imponiendo y por ende estandarizándose en las comunicaciones M2M (Machine To Machine).

Internet de las cosas (IoT por sus siglas en ingles Internet of Things) es un termino acuñado recientemente y que está de moda en textos técnicos en Internet, básicamente se refiere a la interconexión digital de objetos cotidianos a Internet, con la proliferación de pequeños dispositivos de captación de datos instalados en cualquier objeto cotidiano estos pueden ser controlados y los datos producidos explotados de manera “inteligente” en la nube (flotas de vehiculos, ). Iot también se refiere al momento en que los dispositivos conectados a la red de redes sean mayor en número que las propias personas. Todos estos dispositivos conectados a Internet de manera heterogénea a su vez producen datos de forma masiva a gran escala, la necesidad de almacenar y explotar estos datos de manera no convencional nos conduce a otro termino denominado Big Data, pero imagino que esto ya es otro tema.

Buceando por Internet me he topado con más información de la que esperaba y que se puede encontrar en los enlaces al final del post, imagino que el reto consiste en un protocolo multiplataforma y ligero que se pueda implementar en cualquier plataforma. Estas comunicaciones deben poder implementarse para luchar contra algunas barreras inherentes a estos dispositivos como un limitado ancho de banda caidas casuales, otros problemas que podemos citar es su limitada capacidad de procesamiento y la necesidad de minimizar su consumo de energia.

Como resultante de todas estas propiedades estos dispositvos requieren características propias en la comunicación M2M, al calor de este nuevo mercado emergente sugen uniones de empresas y grupos que quieren liderar el desarrollo de un estandar como el grupo formado por Sierra Wireless, la fundación Eclipse y IBM entre otros (M2M Magazine “Sierra Wireless, IBM, Eurotech create M2M Group“). Otros grupos industriales como la Open Mobile Alliance (OMA) también estan trabajando duro en esta dirección.

+INFO:

PROTOCOLOS

HTTP y REST

Hypertext Transfer Protocol (HTTP) es la vida de la Web, se usa cada vez que transferimos un documento o consultamos una página. REST es una forma simple para organizar la interacción entre sistemas independientes. se emplea por ejemplo en la API de Twitter, gracias a que los datos necesarios para transferir datos mediante este sistema no consume excesivo ancho de banda. REST está inspirado por el protocolo HTTP y en la practica significa que podemos usarlo donde usemos un protocolo en HTTP como un servidor Web.

Otras alternativas como SOAP son algo más complejos y estan basados en lenguaje XML, requieren un estudio conciencudo de su sintaxis.

En el protocolo HTTP las maquinas juegan dos roles diferentes: Cliente y servidor. En la mayoria de los casos el cliente inicia la comunicación y el servidor responde. HTTP está basado en carácteres de texto aunque el cuerpo del mensaje puede contener otro tipo de datos como una imagen. Un mensaje HTTP está formado por una cabecera y un cuerpo a pesar de que el cuerpo a menudo puede ir vacio, el cuerpo contiene los datos interpretados como indica la cabecera.

Con Chrome Developer Tools, o Firefox con Firebug podemos espiar las peticiones HTTP en acción.

 CapturaOtro herramienta para familiarizarse con el protocolo HTTP es cURL.

cURL es una herramienta para usar en un intérprete de comandos para transferir archivos con sintaxis URL, soporta FTP,FTPS, HTTP, HTTPS, TFTP, SCP, SFTP, Telnet, DICT, FILE y LDAP.

[…]

Es por ejemplo una buena herramienta para simular las acciones de un usuario en un navegador web. Libcurl es la biblioteca/API correspondiente que los usuarios pueden incorporar en sus programas;

Para realizar pruebas con cURL nos montaremos nuestro propio servidor Web, con XAMPP  (Apache + MySQL + PHP + Perl) tenemos una distribución de Apache instalada en un periquete.

cURL suele estar disponible por defecto en muchas distribuciones Linux, en cuanto a Micro$oft esto ya es otro cantar, seleccionamos de la página oficial de descargas en http://curl.haxx.se/download.html (la versión 7.3.9 para Win32 que finalmente bajamos de aquí).

Una vez instalado cURL realizamos nuestra primera prueba, el comando:

curl.exe -v google.com

Nos muestra el dialogo HTTP que mantiene cURL para obtener la página solicitada (peticiones precedidas con “>” y respuestas con “>”).

Captura

Sintaxis

Una URL nos permite identificar el objeto sobre el que vamos a operar, cada URL identifica un recurso, vamos a verlo más claro, supongamos que queremos obtener una lista de clientes de nuestra compañía, el recurso podría ser:

/clients

Si quisiéramos buscar un cliente concreto:

/clients/jim

Asumiendo que sólo hay un cliente con ese nombre. Si lo completamos la llamada quedaría como queda:

GET /clients/jim HTTP/1.1
Host: example.com

Es un error muy común y que debemos evitar es usar la URL para describir la acción por ejemplo: /clients/add.

¿Pero como especificamos una acción? Los métodos HTTP vienen a nuestro rescate para este menester.

Más arriba hemos usado el método GET pero podemos usar otros métodos por ejemplo para borrar un cliente llamado “anne” de nuestra base de datos:

DELETE /clients/anne HTTP/1.1

Los métodos HTTP indican que operación realizar con el recurso solicitado en la URL. La petición puede tener información extra en el cuerpo del mensaje (en cURL podemos proporcionar estos datos usando la opción -d).

Los métodos más importantes son los siguientes: GET, POST, PUT y DELETE (podemos encontrar todas las opciones en IETF).

+INFO:

Cliente HTTP GET en C con WinInet (MS VS 2008)

#include "stdafx.h"
#include<windows.h>
#include<wininet.h>
#include<stdio.h>
#pragma comment(lib, "wininet.lib")

int _tmain(int argc, _TCHAR* argv[])
{
 HINTERNET Initialize,Connection,File = NULL;
 DWORD dwBytes;
 char ch;

 Initialize = InternetOpen(L"Mozilla/4.0 (compatible)", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
 if (Initialize == NULL)
 {
      printf("Error InternetOpen rets %s\n", "null");
 }

Connection = InternetConnect(Initialize, L"127.0.0.1",  INTERNET_DEFAULT_HTTP_PORT,  NULL,  NULL,  INTERNET_SERVICE_HTTP, 0,  0);
 if (Initialize == NULL)
 {
     printf("Error InternetConnect rets %s\n", "null");
 }

 File = HttpOpenRequest(Connection,NULL,L"/index.php?var1=val1&var2=val2",NULL,NULL,NULL,0,0);
 if (File == NULL)
 {
 printf("Error HttpOpenRequest rets %s\n", "null");
 }

 if(HttpSendRequest(File,NULL,0,NULL,0))
 {
 while(InternetReadFile(File,&ch,1,&dwBytes))
 {
 if(dwBytes != 1)break;
 putchar(ch);
 }
 }
 else
 {
 printf("Error HttpSendRequest rets %s\n", "null");
 }
 InternetCloseHandle(File);
 InternetCloseHandle(Connection);
 InternetCloseHandle(Initialize);
 return 0;
}

Servidor PHP


<html>
<head>
<title>Ejemplo de PHP</title>
</head>
<body>
<H1>Ejemplo de procesado</H1>
<?php var_dump($_GET) ?>
<br>
</body>
</html>

Resultado ejecución aplicación WinInet

Captura

+INFO: