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
Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s