Revista 100% Verde

Cafetera conectada con Netduino

Por Soloelectronicos @soloelectronico
using Microsoft.SPOT.Hardware;
using SecretLabs.NETMF.Hardware.Netduino;
using System.Threading;

namespace Connected_Coffee_SimpleControl
{
    public class Program
    {
        public static void Main()
        {
            // create an output port (a port that can be written to) and 
            // connect it to Digital Pin 2
            OutputPort relay = new OutputPort(Pins.GPIO_PIN_D2, false);

            // run forever
            while (true)
            {
                relay.Write(true); // turn on the relay
                Thread.Sleep(5000); // Leave on for 5 seconds
                relay.Write(false); // turn off the relay
                Thread.Sleep(5000); // leave off for 5 seconds
            }
        }
    }
}

Si observamos que la cafetera se enciende por unos 5 segundos y se apaga por 5 segundos en un bucle indefinido, el circuito funciona perfectamente. así que con todo esto habremos ya construido la base de la cafetera conectada mediante la creación de lo que era esencialmente una toma de corriente inteligente que podre controlar con un Netduino. Ademas después de montar el hardware, implantamos una pequeña aplicación que controla el relé para activar la energía del hogar a la cafetera, efectivamente añadiendo un control muy simple.

Si bien esta aplicación es funcional , vamos a realizar un paso más y añadir una web API a la aplicación Netduino para que nosotros podemos controlar la salida de forma remota.

Una vez tengamos la web API en su lugar, tenemos un punto final que puede ser aprovechado de una variedad de casos de uso. como por ejemplo construyendo una aplicación móvil de Xamarin.Forms que use esa API para controlar la cafetera conectado desde un dispositivo móvil

Cafetera conectada con Netduino

El código de ejemplo para el proyecto de la cafetera conectado todo se puede encontrar en el siguiente repositorio de GitHubb: Netduino_Samples/Connected_CoffeeMaker y el código que se ejecuta en el Netduino está en la carpeta de la aplicación de ApplianceHost ( de hecho ese es el código que se va examinar aquí).

Introducción a Maple

Con el fin de exponer la web API para permitir el control remoto de nuestra cafetera, necesitamos un servidor web para acogerla,así que vamos a ver un servidor web especialmente diseñado para Netduino, el Servidor de maple.

Maple es un servidor web en código abierto, ultra ligero, habilitada para JSON , soportando RESTful construido específicamente para dispositivos Netduino con capacidades de red. También se publica como un paquete nuget, por lo que es muy fácil de añadir funcionalidades de red a sus proyectos. Este servidor esta diseñado específicamente para Netduino por lo que es increíblemente simple, rápido y super fácil de usar. Debe ejecutarse sin problemas en las placas N3 Ethernet Wifi N3 y N2 +.

Controladores de solicitudes

Criterios de valoración API web de Maple se definen mediante la creación de clases personalizadas que heredan de la clase RequestHandlerBase. Maple utiliza la reflexión para crear direcciones URL basándose en los nombres de método en las clases personalizadas. Soporta tanto los metodos get y post asi como los nombres de métodos que deben tener el prefijo con cualquiera de esas cadenas para ser automáticamente en un extremo.

Por ejemplo, la siguiente clase expone tres URL endpoints :/Status, /TurnOn y TurnOff .

Como indican los nombres de los métodos, las entradas el estado extremo acepta solicitudes get y los métodos de control de potencia ( TurnOff y TurnOn) como se puede ver en el siguinte código:

using System;
 using Microsoft.SPOT;
 using Maple;
 using System.Net;
 using System.Collections;
 
 namespace ApplianceHost
 {
     public class RequestHandler : RequestHandlerBase
     {
         private static bool _isPowerOn;
 
         public RequestHandler(HttpListenerContext context) : base(context)
         {
         }
 
         public void getStatus()
         {
             StatusResponse();
         }
 
         public void postTurnOn()
         {
             TogglePower(true);
             StatusResponse();
         }
 
         public void postTurnOff()
         {
             TogglePower(false);
             StatusResponse();
         }
 
         private void TogglePower(bool val)
         {
             _isPowerOn = val;
             Ports.ONBOARD_LED.Write(val);
             Ports.GPIO_PIN_D1.Write(val);
         }
 
         private void StatusResponse()
         {
             this.Context.Response.ContentType = "application/json";
             this.Context.Response.StatusCode = 200;
             Hashtable result = new Hashtable { 
                { "isPowerOn", _isPowerOn.ToString().ToLower() }
            };
             this.Send(result);
         }
     }
 }

Cuando se invoquen a esos extremos, se llama al método adecuado. En el caso de nuestro servidor de control; el método getStatus devuelve un mensaje con formato JSON que contiene el actual estado del relé de encendido/apagado, el método postTurnOnactiva el relé y el método postTurnOff desactiva el relé. También mantiene el LED a bordo en sincronía con la energía al relé como indicador.

Ports se ha definido la clase ports.cs, que proporcionan accesos OutputPort directos a los objetos que representan el LED a bordo y el pin digital 1, que controla el relé:

using System;
 using Microsoft.SPOT;
 using Microsoft.SPOT.Hardware;
 using SecretLabs.NETMF.Hardware.Netduino;
 
 namespace ApplianceHost
 {
     static class Ports
     {
         static Ports()
         {
             ONBOARD_LED = new OutputPort(Pins.ONBOARD_LED, false);
             GPIO_PIN_D1 = new OutputPort(Pins.GPIO_PIN_D1, false);
         }
 
         public static OutputPort ONBOARD_LED;
         public static OutputPort GPIO_PIN_D1;
     }
 }

Uso de Maple, que es todo el código que se necesita para exponer una web moderna, RESTful API de un Netduino!

Inicialización de la red

A diferencia de aplicaciones tradicionales de escritorio o móvil en el que la interfaz de red durante mucho tiempo se ha inicializado cuando que se ejecuta una aplicación, usted debe inicializar la interfaz de red y espere a obtener su dirección IP, etc, antes de intentar hacer cualquier acceso a la red . Como tal, antes de iniciar el servidor de arce, estas tareas pero ser ejecutado y esperaron en.

La mayor parte del código en el principal program.cs hace justamente eso; Inicializa la red, espera a que una dirección IP y también hace una solicitud web para la validación. Mayoría del código está dedicado a la depuración y salida de información para ilustrar el proceso y proporcionar información para la instrucción y tiempo de desarrollo de exploración. Es bien documentado en la Guía Netduino Networking, y estamos trabajando en el envío de un paquete nuget que controlará todas esta cosas caja negra, en el futuro será aún más fácil de añadir a tus proyectos. Como tal, no voy a cubrir en detalle aquí, excepto to decir que si copia el código de inicialización de la red en su propia aplicación, debe llamar al método y comprobar que es el regreso (de éxito) antes de comenzar cualquier tratamiento que incluye acceso a la red : InitializeNetworktrue

if (InitializeNetwork())
 {
    // start the maple server
    // and start your application processing here 
}

Iniciar servidor de Maple

Una vez que la red se ha inicializado, servidor Maple necesita ser instanciado y comenzar con método Start :

MapleServer server = new MapleServer();
 server.Start();

Para la mayoría de los casos, esto debe ir directamente después de la llamada de inicialización de red, sin embargo, dependiendo de sus necesidades de aplicación, puede iniciarlo cuando sea necesario.

Configuración de la red

El último paso necesario para configurar la muestra ApplicationHost es configurar la red. Algunas piezas de la red, tales como el nombre de red WiFi y la contraseña (si corresponde), necesita ser configurado en implementar tiempo. Si usted está desarrollando en una máquina Windows, puede utilizar MFDeploy, que se instala como parte del SDK .NET MicroFramework. Para desarrolladores de Mac, existe MacDeploy, que proporciona la misma funcionalidad:

Cafetera conectada con Netduino

Si está usando el WiFi con Netduino 3, la autenticación y opciones de cifrado pueden ser un poco confusos, sin embargo, si se está conectando a una red WiFi moderna que requiere una contraseña, usted probablemente necesitará ajustar la autenticación para Compartido y la configuración de cifrado WPA. Además, el SSID se refiere al nombre de la red WiFi.

Probar el servidor de Control de aplicaciones API

Una vez que la red se configura y se implementa la aplicación, ya está listo para probar la funcionalidad de Maple. Si todo va bien, la ventana de Salida de la aplicación en Visual Studio, debe tener algo similar a lo siguiente:

Getting all the network interfaces.
Found 802.11 WiFi Interface
MAC Address: 60-D7-E3-A0-02-CB
DHCP enabled: True
Dynamic DNS enabled: False
IP Address: 0.0.0.0
Subnet Mask: 0.0.0.0
Gateway: 0.0.0.0
SSID:Cabin in the Woods
Found 802.11 WiFi Interface
No IP Address
DHCP is enabled, attempting to get an IP Address
Sleep while obtaining an IP
Sleep while obtaining an IP
Sleep while obtaining an IP
Got IP Address: 172.16.42.8

Necesitará la dirección IP para probar el punto final de la API. El extremo del estado es fácil de comprobar a través de un navegador; Asegúrese de que usted está en la misma red que el Netduino y abra una ventana del navegador y vaya a la url. Debe mostrar una respuesta JSON. Sin embargo, recomiendo conseguir el Postman para probar los extremos. Es gratuito y diseñado específicamente para probar interfaces RESTful. Le permite publicar solicitudes además de obtener, así como una mirada de otras cosas útiles, incluyendo análisis automático de respuestas JSON:http://%5BIP Address]/Status

Cafetera conectada con Netduino

Volver a la Portada de Logo Paperblog