domingo, 14 de febrero de 2016

Consumiendo Servicios Web con Netduino

Se sorprenderán de como he empezado de una forma muy diferente a como comienzan todos los libros de Netduino, encendiendo y apagando LEDs, y es que básicamente lo que quiero que entiendan es que mi último interés es quedarme en temas de esa índole que son abordados en todos los libros de electrónica tanto de Arduino como de Netduino, seguramente también lo haremos, pero mi intención es que juntos nos trasportemos a entender como lograr la electrónica, el software y la nube trabajen para hacer el verdadero internet de las cosas.

La idea con este post es que también la gente que solo sabe electrónica entienda que hoy en día programar un backend para nuestros proyectos, ni siquiera necesita código. Nuestro backend será un servicio Node.js creado a través de los Wizard de Azure.

Así que bueno, para empezar vamos algo cool y simple, vamos a crear un servicio en Azure Mobile Service para que nuestro Netduino pueda enviar información.

En la consola de Azure encontrarán esa opción
Al seleccionar la opción nuevo se abre un submenú donde iniciamos la creación
Llenamos los datos de nuestro servicio
También de la base de datos que utilizará

Esperamos a que Azure finalice las  tareas necesarias

Hasta que nuestro servicio aparezca como listo para usarse

Al entrar a la pestaña de data podemos ver que no tenemos tablas creadas
Presionamos la opción adicionar tabla y le asignamos un nombre

Al confirmar que finalizamos empieza la creación de la tabla que no tarda mucho

 Podemos observar que la tabla no contiene registros

Al ir a la pestaña columnas vemos como azure crea algunos campos en nuestra tabla NoSql de forma automática. Presionamos el botón añadir columna para crear una propia.

Ahora damos un nombre a nuestra columna y elegimos el tipo de dato.
Después de confirmar verificamos que efectivamente la tabla tenga nuestra nueva columna

  
Para que nuestro demo sea más simple voy a cambiar los permisos de la tabla para que cualquiera pueda ingresar datos en ella.

Y ahora si lo que estabamos esperando empezar nuestro primer proyecto en Netduino. Como ven crear un proyecto de .NET Micro Framework es tan simple con cualquier proyecto de .NET en Visual Studio. Simplemente buscamos la sección y vemos todas las plantillas. Seleccionamos la que es acorde al Netduino que tenemos.

En el interior del proyecto encontramos algo familia, un punto de entrada Main típico de aplicaciones de consola.
Siendo nuestra intención probar si la red de nuestro Netduino quedo funcionando vamos a agregar dos referencias a nuestro proyecto, System.Http y System.IO

Además agregaremos un paquete de Nuget
Agregamos el Json.NETMF, para ayudarnos a serializar más facilmente.

Además creamos una entidad que nos permitrá guardar los datos en nuestra table. Ahora luce sencilla, sin embargo en otros laboratorios añadiremos más columnas. 


El código necesario para registrar datos en nuestra tabla se los pongo a continuación, es código .NET común el cual no es mi intención explicar pues es un consumo HTTP tradicional por POST. En verde resalto la línea que indica la Url con la que se debe apuntar a nuestro Azure Mobile Service.

using System;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;
using SecretLabs.NETMF.Hardware;
using SecretLabs.NETMF.Hardware.Netduino;
using Netduino.NetworkTest.Entities;
using System.IO;

namespace Netduino.NetworkTest
{
    public class Program
    {
        public static void Main()
        {
            try
            {
                EventLog eventLog = new EventLog()
                {
                    Description = "Hello Cloud"
                };
                string json = Json.NETMF.JsonSerializer
                    .SerializeObject(eventLog);

                Debug.Print("Message: " + json);

                var httpWebRequest = (HttpWebRequest)WebRequest
                    .Create(

                      "http://netduinotest.azure-mobile.net/tables/EventLog");

                httpWebRequest.Method = "POST";
                httpWebRequest.Accept = "application/json";
                httpWebRequest.ContentType = "application/json; charset=UTF-8";
                httpWebRequest.ContentLength = json.ToCharArray().Length;

                using (var streamWriter =
                    new StreamWriter(httpWebRequest.GetRequestStream()))
                {
                    streamWriter.Write(json);
                    streamWriter.Flush();
                    streamWriter.Close();
                }

                var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
                using (var streamReader
                    = new StreamReader(httpResponse.GetResponseStream()))
                {
                    var result = streamReader.ReadToEnd();
                    Debug.Print(result);
                }
            }
            catch (Exception ex)
            {
                Debug.Print("Error: " + ex.Message);
            }
            finally
            {
                Thread.Sleep(Timeout.Infinite);
            }
        }
    }
}


En este punto revisamos la versión del .NET Micro Framework a usar, si aun no has actualizado tu Firmware, debes cambiarla a la correspondiente.

Además nos aseguramos que en la opción .NET Micro Framework este el método de transporte USB y este seleccionado nuestro Netduino
 Y ahora si, estamos listos para ejecutar nuestra app dando PLAY. En la ventana de salida podremos ver como inicia el despliegue de paquetes dentro del Netduino
Luego inicia la ejecución de nuestra aplicación y ups, así se vería un error. En el código que les copié ya está corregido, sin embargo cuando di ejecutar por primera vez olvide remover el HTTPS y dejar solo HTTP en la ruta del servicio de Azure Mobile Services. Como vemos en la imagen, el error es que no es soportado. Netduino no soporta SSL.
Volvemos a ejecutar la aplicación y ahora si tenemos una ejecución exitosa.
Si revisamos nuestro servicio en Azure, veremos el registro enviado desde nuestro Netduino

No hay comentarios: