Sono riuscito a fare qualcosa di molto grezzo ma funzionante scrivendo un piccolo server http in .NET framework.
Sul device remoto viene visualizzato lo stato degli switch premuti e numero tre bottoni per selezionare un nuovo switch.
Al limite potrebbe già funzionare così ma spero di poter migliorare l'estetica e sarebbe bello non inviare ogni volta una nuova pagina html, ma credo che per fare questo ci sia molto da studiare ………
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Runtime.Remoting.Contexts;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace AndreaD8
{
public class HttpServer : IDisposable
{
public static HttpListener listener;
public static string url = "http://+:8400/";
public static int pageViews = 0;
public static int requestCount = 0;
public static string pageData =
"<!DOCTYPE>" +
"<html>" +
" <head>" +
" <title>HttpListener Example</title>" +
" </head>" +
" <body>" +
" <p>Switch attivo: {0}</p>" +
" <form method=\"post\" action=\"switch1\">" +
" <input type=\"submit\" value=\"Switch1\">" +
" </form>" +
" <form method=\"post\" action=\"switch2\">" +
" <input type=\"submit\" value=\"Switch2\">" +
" </form>" +
" <form method=\"post\" action=\"switch3\">" +
" <input type=\"submit\" value=\"Switch3\">" +
" </form>" +
" </body>" +
"</html>";
public HttpServer()
{
//------------------------- ASCOLTO SULLA PORTA HTTP -----------------------------------
//
// ---> IMPORTANTE
//Prenotazione url per gli utenti non amministratori
//Comando Per inserire la prenotazione: netsh http add urlacl url=http://+:8400/ user=everyone
//Comando per verificare la prenotazione: netsh http show urlacl http://+:8400/
//Altrimenti ritorna errore se non si avvia in modalità amministratore
// Create a Http server and start listening for incoming connections
listener = new HttpListener();
listener.Prefixes.Add(url);
listener.Start();
Console.WriteLine("Listening for connections on {0}", url);
// Handle requests
Task listenTask = HandleIncomingConnections();
// listenTask.GetAwaiter().GetResult(); //questo funziona in progetti console ???
// Close the listener
//listener.Close();
}
public static async Task HandleIncomingConnections()
{
bool runServer = true;
int sw = 0;
// While a user hasn't visited the `shutdown` url, keep on handling requests
while (runServer)
{
// Will wait here until we hear from a connection
HttpListenerContext ctx = await listener.GetContextAsync();
// Peel out the requests and response objects
HttpListenerRequest req = ctx.Request;
HttpListenerResponse resp = ctx.Response;
// Print out some info about the request
Console.WriteLine("Request #: {0}", ++requestCount);
Console.WriteLine(req.Url.ToString());
Console.WriteLine(req.HttpMethod);
Console.WriteLine(req.UserHostName);
Console.WriteLine(req.UserAgent);
Console.WriteLine();
// If `shutdown` url requested w/ POST, then shutdown the server after serving the page
if ((req.HttpMethod == "POST"))
{
sw = 0;
switch (req.Url.AbsolutePath)
{
case "/switch1":
sw= 1;
break;
case "/switch2":
sw= 2;
break;
case "/switch3":
sw= 3;
break;
}
if (sw != 0)
{
Console.WriteLine("Selezionato switch {0}", sw);
sngEngine.Instance.context.Post(delegate (object dummy)
{
sngEngine.Instance.SelectSwitch(sw);
}, null);
}
}
// Make sure we don't increment the page views counter if `favicon.ico` is requested
if (req.Url.AbsolutePath != "/favicon.ico")
pageViews += 1;
// Write the response info
byte[] data;
if (sw == 0 )
{
data = Encoding.UTF8.GetBytes(String.Format(pageData, sngBrano.Instance.SwitchAttivo));
}
else
{
data = Encoding.UTF8.GetBytes(String.Format(pageData, sw));
}
resp.ContentType = "text/html";
resp.ContentEncoding = Encoding.UTF8;
resp.ContentLength64 = data.LongLength;
// Write out to the response stream (asynchronously), then close it
await resp.OutputStream.WriteAsync(data, 0, data.Length);
resp.Close();
}
}
public void Dispose()
{
listener.Close();
}
}
}
Saluti
Andrea