NeonMika.Webserver (servidor web para Netduino) – Parte 3


En esta tercera   parte del NeonMika.Webserver  mostramos las opciones de configuración de todo lo que se ha dicho antes en relación con el servidor web y las opciones para la lectura y la escritura en la tarjeta microSD. También se evaluarán las opciones que existen  sobre solicitudes XML al servidor a través de un programa muy simple de prueba

Petición de Login

En el post   anterior    sobre el NeonMika.Webserver  pudimos comprobar  que una vez que el cliente esta  conectado a la placa de  Netduino+  la conexión nunca se cierra; y, además, cualquier cliente puede acceder a ella sin necesidad de una nueva solicitud de inicio de sesión.

Por supuesto que esto está mal, los clientes no se pueden conectar de forma indiscriminada y una especie de tiempo de espera debería existir en la solicitud del cliente de forma automática que se pudiera quitar debido a la inactividad

Para entender mejor este proceso el autor hizo un pequeño diagrama de cómo funciona la nueva solicitud de inicio de sesión:

 

Una vez que usted ha solicitado una página de código comprueba si el cliente HTML (la IP donde partió la solicitud)  si  ya está en la lista interna de los clientes de un inicio de sesión satisfactorio, si no envía  a la página de inicio de sesión y almacena la página solicitada en la memoria para enviarla más tarde .

En la página de inicio de sesión del usuario debe introducir el nombre de usuario y contraseña a través de un formulario que será enviado por el método POST que contiene por lo menos estos dos objetos: ” nombre de usuario “y” contraseña “. Una vez conectado correctamente este cliente está incluido en la lista de clientes con un tiempo de vida de la conexión y luego abre la página solicitada, si esta página es nulo o vacío se carga “index.html ”

Los usuarios pueden navegar en todas las páginas disponibles en el servidor y también puede tener acceso a otros tipos de respuesta como XMLResponse y JSONRespose

Un acceso de este tipo se lleva a cabo el curso de la vida de la conexión del cliente se regenera al valor pre-definido en la configuración.  La duración de la conexión se decrementa automáticamente una función periódica independiente.

Al llegar a cero cliente se elimina de la lista y se requiere una nueva conexión:así, el servidor web ya tiene una  sesión segura de  conexión a través de la configuración HTML

HTML a través de la configuración de conexión

La configuración IP es una unión de la segunda parte de esta serie de artículos sobre el NeonMika.Webserver relacionado  sobre la configuración escrito en la tarjeta microSD. Vamos a ver ua nueva función de la construcción del servidor donde se requiren datos que se obtienen a partir de un archivo grabado en la tarjeta microSD.
Desafortunádamente, si el código es universal, es decir, se necesitauna página html unida a una función de código. También utilizando el método POST la petición de inicio de sesión se añadió como una solicitud XML (aunque la respuesta no es XML bastante). Así, las peticciones de la página “http: // ipnetduino / config” son enviados a la función “SetNewConfig” en Server.cs.

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
public Server(OutputPort ledPort, int portNumber = 80)
{
    Configuration config = new Configuration(Settings.CONFIG_FILE);
                       
    var interf = NetworkInterface.GetAllNetworkInterfaces()[0];
    if (config.GetConfigurationOf("dhcp", Configuration.ConfigMode.Append, "false") == "true")
    {
        interf.EnableDhcp();
        interf.RenewDhcpLease();
    }
    else
    {
        //New to fix
        string ipAddress = config.GetConfigurationOf("ip", Configuration.ConfigMode.Append, "10.20.19.200");
        string subnetMask = config.GetConfigurationOf("mask", Configuration.ConfigMode.Append, "255.255.0.0");
        string gatewayAddress = config.GetConfigurationOf("gateway", Configuration.ConfigMode.Append, "10.20.19.1");
            
        interf.EnableStaticIP(ipAddress, subnetMask, gatewayAddress);
    }
            
    //New to set login webpage
    string loginName = config.GetConfigurationOf("loginName", Configuration.ConfigMode.Append, "admin");
    string loginPassword = config.GetConfigurationOf("loginPassword", Configuration.ConfigMode.Append, "admin");
    if (!((loginName == null) && (loginPassword == null)))
    {
        _UserName = loginName;
        _Password = loginPassword;
    }
    ClientsLogedTimeOut = new Timer(new TimerCallback(ClientsLogedEvent), null, 60000, 60000);
           
    this._PortNumber = portNumber;
    _OnboardLed = ledPort;
    ResponseListInitialize();
    _ListeningSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    _ListeningSocket.Bind(new IPEndPoint(IPAddress.Any, portNumber));
    _ListeningSocket.Listen(4);
    var webserverThread = new Thread(WaitingForRequest);
    webserverThread.Start();
    //To force file write in the card
    config.ForceToWrite();
    //limpa a memória
    Debug.GC(true);
}

 

 

La “función SetNewConfig “es una función que se puede llamar por dos métodos: POST y GET. Cuando nos dijeron que el método GET es una solicitud de la página HTML mediante el envío de la página HTML existente en la tarjeta SD: “http://ipnetduino/config.html”. Está página “config.html” se puede configurar mediante el establecimiento REQUEST_CONFIG_URL enSettings.cs . Una vez que se carga la página puede enviar el formulario a través de un post con la nueva información de configuración. Cuando el cliente envía una solicitud POST se envía cualquier tipo de información mediante la manipulación del archivo de configuración y ajuste de la configuración.

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
private void SetNewConfig(RequestReceivedEventArgs e, Hashtable results)
{
    if (e.Request.Method == "POST")
    {
        //Esta enviando as informações de configuração
        Configuration config = new Configuration(Settings.CONFIG_FILE);
        foreach( DictionaryEntry ent in e.Request.PostArguments)
        {
            config.SetConfig(ent.Key.ToString(), ent.Value.ToString(),true);
        }
        //Envia a página de configuração
        e.Request.URL = Settings.REQUEST_CONFIG_OK_URL;
        Response response = null;
        response = (Response)_Responses["FileResponse"];
        if (response != null)
        {
            if (response.ConditionsCheckAndDataFill(e))
            {
                response.SendResponse(e);
            }
        }  
        //Force to Write
        config.ForceToWrite();
        //Apaga tudo!
        Debug.GC(true);
        //Desliga a placa
        PowerState.RebootDevice(false);
    }
    else
    {
        //envia a página de configuração
        e.Request.URL = Settings.REQUEST_CONFIG_URL;
        Response response = null;
        response = (Response)_Responses["FileResponse"];
        if (response != null)
        {       
            if (response.ConditionsCheckAndDataFill(e))
            {
                if (!response.SendResponse(e))
                {
                }
                ////Debug("Sending response failed");
                Thread ledThread = new Thread(new ThreadStart(delegate()
                {
                    for (int i = 0; i < 3; i++)
                    {
                        _OnboardLed.Write(true); Thread.Sleep(5);
                        _OnboardLed.Write(false); Thread.Sleep(20);
                    }
                }));
                        
                ledThread.Start();
            }
        }  
    }
}

Si al  final, una página ha entrado no son aceptados los ajustes y se envía de nuevo y la placa reanuda el código para que las opciones de conexión  tengan efecto.

//Force to Write
config.ForceToWrite();

//Apaga tudo!
Debug.GC(true);

//Desliga a placa
PowerState.RebootDevice(false);

Tenga en cuenta que la página no se envía cuando se hace un preset con los valores de configuración actuales y  no se implementan, pero es necesario para hacer una buena solución robusta. Por otra parte, cuando se recibe el método POST los campos de formulario se escriben en el archivo sin tipo de información de validación para el envío o si el atributo tiene sentido para que el ajuste sea correcto.La validación de este paso es necesario.

Otra simplificación es el hecho es que no todos los atributos puedan ser configurados, el nombre de usuario y la contraseña no son, por definición, en esta forma, pero se puede aumentar simplemente el formulario e incluir  dos campos con la etiqueta: nombre de usuario y contraseña, y todo se resolverá .> recordar que, dado que no existe una validación ejar estos espacios en blanco permite que el usuario sea “” ( cadena vacía) y la contraseña de la misma cosa “” (vacío).

Esto hace que sea posible  mostrar lo lejos se pueda  llegar  con  Netduino Plus.. NET Micro Framework permite que el sistema operativo embebido  soperte   cosas tan potentes  sin un costo alto nivel de memoria externa. Estoy seguro de poner un servidor web con u PIC24 o un MSP430 no sea una tarea fácil y universal como se hizo aquí.

Peticiones XML

Una de las características implementadas por Marcus VV en el servidor NeonMika.server   son elsoporte de  las peticiones de XML. Se está enviando un GET para escribir / leer algo en hardware / software en Netduino; lo cual es muy útil si se desea enviar un comando a través de la automatización de servidores como de apertura y cierre de un relé o comprobar el estado de iluminación (por ejemplo).

Las   respuestas XML son en realidad delegación de un tratamiento de un GET (el principio porque han probado los ajustes que usted puede enviar un POST) enviado por un cliente. Al igual que en elcódigo modificado adjunto  se pide un login y una contraseña, también se requiere esta información de acceso para acceder a los métodos XML.

Sobre Server.cs , este tiene una función llamada ResponseListInitialize (), que se inicia todas las delegaciones requisición y métodos de cada delegación serán funciones dedicadas para el propósito indicado.

Véase el ejemplo de ” switchDigitalPin “cuando se envía la solicitud:” http://ipnetduino/switchDigitalPin “esta solicitud es interpretada por la función SwitchDigitalPin Es necesario “atributo pin “y” Estado“que son recibidas por el método GET, por lo que la solicitud de se hace de la siguiente manera:

 

 

El retorno de esta función es un archivo XML como se puede ver en esta solicitud:

Además  en neomika.server      las siguientes funciones de acceso a hardware también están disponibles:

  • echo > Valor [ipnetduino] / echo? = [az]
  • switchDigitalPin > [ipnetduino] / switchDigitalPin? pin = [0-13]
  • setDigitalPin > pin [ipnetduino] / setDigitalPin = [0-13] y Estado = [true | false]?
  • PWM pin> [ipnetduino] / PWM = [5 | 6 | 9 | 10]? y periodo = [int] y duración = [int]
  • xmlResponselist > [ipnetduino] / xmlResponselist
  • getAnalogPinValue > [ipnetduino] / getAnalogPinValue? = pin [0-5]
  • getDigitalPinState 
    > [ipnetduino] / getDigitalPinState? pin = [0-13]
  • multipleXML
    > [ipnetduino] / multixml

Lo que viene a la mente en este momento es importante la necesidad de utilizar el navegador para que el acceso a estas “funciones” están disponibles para acceder a la tarjeta.Para demostrar que no es necesario código muy complejo   el autor   hizo  iniciar su sesión en el servidor Netduino Plus y hacer los pins ajustes y leer las entradas analógicas en un programa de manera práctica.

La idea de que el software es exclusivamente para mostrar la viabilidad de NeoMika.Webserver y soporte XML. El   inicio del programa se puede ajustar el valor de IP a IP que su tablero es Netduino Plus y realizar una prueba de ping .

Antes de acceder a la tarjeta es necesario darse cuenta de inicio de sesión,, por lo que al hacer clic en el botón Iniciar sesión se le enviará a la página de inicio de sesión correctamente una vez realizado el  acceso a la tarjeta de programa.

En el interfaz    aparece en un lado la imagen de la Netduino y los campos alrededor de su acceso. Al hacer clic en la actualización de los valores de los pines analógicos se actualizan y cambian el valor porcentual de la década de PWM cambian la placa y botones manejan los pines IO. Todo esto se lleva a cabo mediante el uso de XML con el siguiente interesantisimo código  , que nos demuestra la potencia de esta plataforma.

Function getAnvalue(pin As Integer) As String
        Dim webClient As New System.Net.WebClient
        Dim result As String = webClient.DownloadString("http://" + boardIP.Text.ToString() + "/getAnalogPinValue?pin=" + pin.ToString())
        EventsLog.Text += result.ToString() + vbNewLine
        Dim AdStrVal As String() = result.Split(">")
        Dim AdStrVal2 As String() = AdStrVal(3).Split("<")
        Dim advalue As Integer = CType(AdStrVal2(0), Integer)
        Return (3.3 * advalue / 1024).ToString()
    End Function

Consideraciones finales

Para concluir esta serie de artículos sobre la obra de Marcus NeoMika.Webserver y VV.destacaríamos  la practicidad con la que todo esto se llevó a cabo y que las nuevas aplicaciones se puede cerrar en el medio de código sin muchos cambios. Esto es importante porque muestra qué tan rápido se puede desarrollar algo nuevo y es ideal para aplicaciones de pequeñas empresas.

Recursos

Versión actualizada del servidor web se puede descargar aquí .

La  manipulación de software de XML se puede descargar aquí .

Fuente aqui

Servidor web para Netduino -Parte1


 

En este post   nos vamos a centrar en  una sencilla aplicación llamada NeonMika.Webserver que usando la  comunicación por Internet  permita manejar  la placa  Netduino (leer el ADC, leer y escribir puertos IO, etc) lo cual es perfecto para cualquier persona que  esté desarrollando.

Al ver las soluciones de mercado se puede dibujar sobre la base de los pequeños dispositivos que utilizan un pequeño servidor interno para permitir la configuración del dispositivo, que es una solución muy interesante, ya que no requiere la adición de más puertos de puertos de Ethernet y que ya está disponible en el caso de Netduino

Además, hay 3 formas facilitadas (fácil, ya que no requiere hardware externo) para realizar la configuración:

  • A través de un archivo en la tarjeta microSD (se requiere retirar la tarjeta);
  • A través del puerto USB (requiere disponibles la puerta y hacer un ” miguer “);
  • A través de un servidor web;

Podría decirse que el servidor web es más interesante que las otras soluciones para no razones manera tan evidentes. Puedo destacar el hábito como un fuerte aliado para seleccionar, configurar los dispositivos en la red que ya está familiarizado con el proceso para la página interna del dispositivo (un facilitador) y, además, no es necesario poner a disposición de un puerto USB para alguien que trata de poner un cable en él y finalmente, detener la ejecución del código y dejar tan poco para tarjetas microSD disponible para ser retirado (no es necesario para el tratamiento de la eliminación accidental de la tarjeta).

Finalmente, hago hincapié también que a través del servidor web en el tablero se puede hacer un poco de depuración de código y los datos de la tarjeta microSD, más tarde tengo la intención de detallar una manera para que sea transparente, escribir un archivo de registro de eventos en la tarjeta microSD y luego presentarlo a través del servidor de la página HTML interno.

Otra de las ventajas que pueden ser resaltado es la facilidad de acceso y la configuración remota del tablero. Si la aplicación se coloca en un lugar de difícil acceso se hace más rápido que lo configure a través de Ethernet. Por todas estas razones, no tienen porque se utiliza un servidor web en el Netduino Plus y ahora puede entrar directamente NeonMika.WebServer y usarla.

 

 

 

Primero descargue la última versión deNeonMika.Webserver , si se utiliza. NET MF 4.2, la primera actualización para el proyecto de la solución. NET MF 4.2, a continuación, actualice la otra en secuencia.

 

NeonMika.Webserver es una pre-configuración y fácil de extender servidor web. Con una mínima (o ninguna) de código que puede lograr grandes resultados para controlar su Netduino +, el acceso y la carga de archivos y mucho más!

Funcionalidades:

  •  Acceso a la tarjeta SD
  •  El control de su Netduino utilizando métodos existentes como setPWM o setDigitalPinState (ver la lista completa a continuación)
  •  La adición de sus propios métodos de servicio web como para que pueda ampliar NeonMika.Webserver a sus propias necesidades de cada proyecto.

¿Es fácil?

WebServer servidor =newServidorPinManagement.OnboardLED,80,false,“192.168.0.200”,“255.255.255.0”,“192.168.0.1”,“NETDUINOPLUS”);

El parámetro de configuración son los siguientes: El OnboardLED, Puerto, DHCPenable, ipAdress, subnetMask, puerta de entrada, el nombre.
Usted no necesita nada más para ejecutarlo!

En http://neonmikawebse…m/documentation se puede encontrar una documentación completa sobre cómo configurar el servidor y cómo expandirla.

¿Qué métodos ya se implementan?

Aquí hay una lista con todos los webMethods pre-codificados que se pueden utilizar dentro de tu navegador o cualquier otra aplicación para comunicarse con su Netduino:

  • echo (Devuelve el valor enviado) -> Netduinoplus valor / echo = [az]
  • switchDigitalPin (Cambia el pin seleccionado de verdadero a falso y vis-a-vis) -> Netduinoplus / switchDigitalPin pin = [0-13] 
  • setDigitalPin (Ponga el pin digital seleccionado para el estado seleccionado) ? -> Netduinoplus / setDigitalPin pin = [0-13] y Estado = [true | false] 
  • pwm (Ajuste el PWM del pasador para el período y la duración presentado ? -> Netduinoplus / PWM pin = [5 | 6 | 9 | 10] y periodo = [int] y duración = [int] 
  • getAnalogPinValue (Devuelve el valor del pin analógico seleccionado) -> Netduinoplus / getAnalogPinValue pin = [0-5] 
  • getDigitalPinState (Devuelve el estado de su pin seleccionado (on / off)) -> Netduinoplus / getDigitalPinState pin = [0-13] 
  • getAllAnalogPinValues ​​(Devuelve el valor de cada pin analógico) -> Netduinoplus / getAllAnalogPinValues 
  • getDigitalPinState (Devuelve el estado de cada pin digital) -> Netduinoplus / getAllDigitalPinStates 
  • getAllPWMValues ​​(Devuelve los valores para todos los puertos PWM) -> Netduinoplus / getAllPWMValues 
  • fileUpload (Carga un archivo en la ruta de acceso de la tarjeta SD a través de POST. Tienes que escribir los datos del archivo (bytes) en el cuerpo POST) -> Netduinoplus / upload path = [az] 

Y POR CIERTO: 
Archivo y directorio respuesta 
Sólo tienes que escribir en netduinoplus / [pathtomyfile] y usted puede ver / descargar el archivo. Si la ruta especificada es un directorio, se devolverá una vista de directorio

Algunos ejemplos:

Comandos de ejemplo (puede ser ejecutado con el navegador):

Mostrar directorio de archivos:

Archivo de Access:

Descarga y Documentación:

http://neonmikawebserver.codeplex.com/

http://neonmikawebse…m/documentation

Proyecto y Videos

El control de su Netduino + con el teléfono Android

Gracias a skarphedinnos para este gran video sobre el control de clavijas y PWM con NeonMika.Webserver y Android!

http://www.youtube.c…h?v=Q5T7TQsOf-w

Inicio cervecería

Gracias a la codificación Smackdown para el uso de NeonMika.Webserver en su Proyecto increíble mezcla de la cerveza!

http://diybrewery.com/

N controlador 2 acuario

Gracias a H07R0D !

http://forums.netdui…roller/?p=34544

 

Cambios en el código de Neomilka werb Server

 

Para encontrar la IP que se lanzó en la ventana de salida, ha escrito algo así como: “servidor web se ejecuta en 192.168 .5.100 / / / DHCP: Falso “.

. De todos modos,  lleva  buscar dónde colocar la IP que teóricamente se fija, entonces es intersante el código de parición constructor servidor en Server.cs. pero no hay lugar para poner IP fija! Así que el autor hizo  un pequeño cambio en la función, y se veía así:

:

///
/// Creates an instance running in a seperate thread
///
/// OutputPort to indentify
/// The port to listen
///
/// IP
/// Mask
/// GateWay
public Server(OutputPort ledPort, int portNumber = 80, bool DhcpEnable = false,
string ipAddress = “”, string subnetMask = “”, string gatewayAddress = “”)
{
var interf = NetworkInterface.GetAllNetworkInterfaces()[0];

if (DhcpEnable)
{
interf.EnableDhcp();
interf.RenewDhcpLease();
}
else
{
//New to fix
interf.EnableStaticIP(ipAddress, subnetMask , gatewayAddress );

}

Debug.Print(“Webserver is running on ” + interf.IPAddress.ToString() + ” /// DHCP: ” + interf.IsDhcpEnabled.ToString());

this._PortNumber = portNumber;
_OnboardLed = ledPort;
ResponseListInitialize();

_ListeningSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
_ListeningSocket.Bind(new IPEndPoint(IPAddress.Any, portNumber));
_ListeningSocket.Listen(4);

var webserverThread = new Thread(WaitingForRequest);
webserverThread.Start();
}

 

 

Y, por supuesto, usted tendrá la opción de declarar una IP fija en Program.cs :

bserver = nuevo Server (PinManagement.OnboardLED, 80, falsos , “192.168.1.41” , “255.255.255.0” , “192.168.1.1” );

 

 

Continuando con el código como el  interés principal era usar la tarjeta microSD a pesar de que los métodos eran los correctos, el camino tuvo problemas con las barras “\” y “/”. Así que el autor modifico la funcion  SendResponse para que haga la inversión de la barra de direcciones y buscar en el interior de la tarjeta de la ubicación correcta.

 

///
/// Sends a 404 Not Found response
///
protected void Send404_NotFound(Socket Client, String Message = null)
{

Debug.GC(true);
if (Client != null)
{
string header = null;

if (Message != null)
{
header = “\n\n\n
HTTP/1.1 404 Not Found
\n” + Message + ”
\n\n\n”;
}
else
{
header = “\n\n\n
HTTP/1.1 404 Not Found
\nNeonMika.Webserver is sorry…
\n\n\n”;
}

Client.Send(Encoding.UTF8.GetBytes(header), header.Length, SocketFlags.None );
}
}

Con esto ha llevado a la utilización NeonMika.WebServer y poner una página en la tarjeta SD para probar. Con el fin de probar el autor busco en Internet  un sitio de plantilla qcon fotos y todo y subpáginas y logró tener un buen grado de éxito, aunque las imágenes no se han subido aún …

 

Para descargar el código con los cambios NeonMika clic aquí .
Para descargar la página para probar la tarjeta MicroSD clic aquí .

 

Fuente aqui