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:
1
> http://10.20.19.41/setDigitalPin?pin=10&state=false
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.