Esempio n. 1
0
        public static void Main(string[] args)
        {
            Log.Register(new ConsoleOutEventLog(80));
            Log.Information("Initializing application...");

            HttpSocketClient.RegisterHttpProxyUse(false, false);                // Don't look for proxies.

            Console.CancelKeyPress += (object sender, ConsoleCancelEventArgs e) =>
            {
                e.Cancel  = true;
                executing = false;
            };

            Log.Information("Initialization complete. Application started...");

            try
            {
                MonitorHttp();
            } catch (Exception ex)
            {
                Log.Exception(ex);
            } finally
            {
                Log.Information("Terminating application.");
                Log.Flush();
                Log.Terminate();
            }
        }
        private static void GetPhotos(object State)
        {
            object[]         P           = (object[])State;
            int              i           = (int)P [0];
            IUPnPService     Service     = (IUPnPService)P [1];
            string           ContentType = (string)P [2];
            string           Extension   = (string)P [3];
            MailMessage      Msg         = (MailMessage)P [4];
            ManualResetEvent Done        = (ManualResetEvent)P [5];
            DateTime         Next        = DateTime.Now;

            try
            {
                UPnPAction GetDefaultImageURL = Service ["GetDefaultImageURL"];
                Variables  v = new Variables();
                GetDefaultImageURL.Execute(v);
                string ImageURL = (string)v ["RetImageURL"];

                ParsedUri    ImageURI = Web.ParseUri(ImageURL);
                HttpResponse Response;
                int          ms;
                int          j;

                using (HttpSocketClient Client = new HttpSocketClient(ImageURI.Host, ImageURI.Port, ImageURI.UriScheme is HttpsUriScheme, ImageURI.Credentials))
                {
                    Client.ReceiveTimeout = 20000;

                    for (j = 1; j <= 3; j++)
                    {
                        ms = (int)System.Math.Round((Next - DateTime.Now).TotalMilliseconds);
                        if (ms > 0)
                        {
                            Thread.Sleep(ms);
                        }

                        Response = Client.GET(ImageURI.PathAndQuery, ContentType);
                        Msg.EmbedObject("cam" + (i + 1).ToString() + "img" + j.ToString() + "." + Extension, ContentType, Response.Data);

                        Log.Information("Click.", EventLevel.Minor, Service.Device.FriendlyName);

                        Next = Next.AddSeconds(5);
                    }
                }
            } catch (ThreadAbortException)
            {
                Thread.ResetAbort();
            } catch (Exception ex)
            {
                Log.Exception(ex);
            } finally
            {
                Done.Set();
            }
        }
        private object TakeSnapshot(object[] P)
        {
            foreach (Camera Camera in Topology.Source.GetObjects(typeof(Camera), User.AllPrivileges))
            {
                if (!string.IsNullOrEmpty(Camera.CameraUrl) && Camera.CameraWidth > 0 && Camera.CameraHeight > 0)
                {
                    Log.Information("Requesting photo.", EventLevel.Minor, Camera.Id);
                    HttpResponse Response = HttpSocketClient.GetResource(Camera.CameraUrl);

                    Bitmap Bmp = Response.DecodedObject as Bitmap;
                    CamStorage.NewPhoto(Bmp);
                }
            }

            return(null);
        }
Esempio n. 4
0
        private static void GetPhotos(object State)
        {
            object[]         P      = (object[])State;
            int              i      = (int)P [0];
            Camera           Camera = (Camera)P [1];
            MailMessage      Msg    = (MailMessage)P [2];
            ManualResetEvent Done   = (ManualResetEvent)P [3];
            DateTime         Next   = DateTime.Now;

            try
            {
                HttpResponse Response;
                int          ms;
                int          j;

                for (j = 1; j <= 3; j++)
                {
                    ms = (int)System.Math.Round((Next - DateTime.Now).TotalMilliseconds);
                    if (ms > 0)
                    {
                        Thread.Sleep(ms);
                    }

                    Log.Information("Requesting photo.", EventLevel.Minor, Camera.Id);

                    Response = HttpSocketClient.GetResource(Camera.CameraUrl);
                    Msg.EmbedObject("cam" + (i + 1).ToString() + "img" + j.ToString(), Response.Header.ContentType, Response.Data);

                    Bitmap Bmp = Response.DecodedObject as Bitmap;
                    CamStorage.NewPhoto(Bmp);

                    Next = Next.AddSeconds(5);
                }
            } catch (ThreadAbortException)
            {
                Thread.ResetAbort();
            } catch (Exception ex)
            {
                Log.Exception(ex);
            } finally
            {
                Done.Set();
            }
        }
Esempio n. 5
0
        private static async Task HttpConnectExampleAsync()
        {
            var socket           = Tcp.ConnectToServer("127.0.0.1", HttpConnectPort);
            var httpSocketClient = new HttpSocketClient();

            var connectRequest = new HttpRequestMessage(new HttpMethod("CONNECT"), "http://icanhazip.com/");
            var connectStream  = await httpSocketClient.GetStreamAsync(socket, connectRequest);

            await httpSocketClient.SendRequestAsync(connectStream, connectRequest);

            var receiveResponse = await httpSocketClient.ReceiveResponseAsync(connectStream, connectRequest);

            Console.WriteLine("{0} {1}", (int)receiveResponse.StatusCode, receiveResponse.ReasonPhrase);

            var getRequest = new HttpRequestMessage(HttpMethod.Get, "http://icanhazip.com/");
            var getStream  = await httpSocketClient.GetStreamAsync(socket, getRequest);

            await httpSocketClient.SendRequestAsync(getStream, getRequest);

            var getResponse = await httpSocketClient.ReceiveResponseAsync(getStream, getRequest);

            Console.WriteLine("{0} {1}", (int)getResponse.StatusCode, getResponse.ReasonPhrase);
            Console.WriteLine((await getResponse.Content.ReadAsStringAsync()).Trim());
        }
Esempio n. 6
0
 public CoordinatorProxy(Uri coordinatorUri) : base(HttpSocketClient.GetOne(coordinatorUri))
 {
 }
        public static int Main(string[] args)
        {
            Log.Register(new ConsoleOutEventLog(80));
            Log.Information("Initializing application...");

            HttpSocketClient.RegisterHttpProxyUse(false, false);                // Don't look for proxies.

            DB.BackupConnectionString = "Data Source=actuator.db;Version=3;";
            DB.BackupProviderName     = "Clayster.Library.Data.Providers.SQLiteServer.SQLiteServerProvider";
            db = DB.GetDatabaseProxy("TheActuator");

            Console.CancelKeyPress += (object sender, ConsoleCancelEventArgs e) =>
            {
                e.Cancel = true;
                executionLed.Low();
            };

            // HTTP Interface

            HttpServer HttpServer = new HttpServer(80, 10, true, true, 1);

            Log.Information("HTTP Server receiving requests on port " + HttpServer.Port.ToString());

            HttpServer.RegisterAuthenticationMethod(new DigestAuthentication("The Actuator Realm", GetDigestUserPasswordHash));
            HttpServer.RegisterAuthenticationMethod(new SessionAuthentication());

            credentials = LoginCredentials.LoadCredentials();
            if (credentials == null)
            {
                credentials              = new LoginCredentials();
                credentials.UserName     = "******";
                credentials.PasswordHash = CalcHash("Admin", "Password");
                credentials.SaveNew();
            }

            state = State.LoadState();
            if (state == null)
            {
                state = new State();
                state.SaveNew();
            }
            else
            {
                for (int i = 0; i < 8; i++)
                {
                    digitalOutputs [i].Value = state.GetDO(i + 1);
                }

                if (state.Alarm)
                {
                    AlarmOn();
                }
                else
                {
                    AlarmOff();
                }
            }

            HttpServer.Register("/", HttpGetRoot, HttpPostRoot, false);                                         // Synchronous, no authentication
            HttpServer.Register("/credentials", HttpGetCredentials, HttpPostCredentials, false);                // Synchronous, no authentication
            HttpServer.Register("/set", HttpGetSet, HttpPostSet, true);                                         // Synchronous, http authentication
            HttpServer.Register("/xml", HttpGetXml, true);                                                      // Synchronous, http authentication
            HttpServer.Register("/json", HttpGetJson, true);                                                    // Synchronous, http authentication
            HttpServer.Register("/turtle", HttpGetTurtle, true);                                                // Synchronous, http authentication
            HttpServer.Register("/rdf", HttpGetRdf, true);                                                      // Synchronous, http authentication
            HttpServer.Register(new WebServiceAPI(), true);

            // HTTPS interface

            // Certificate must be a valid P12 (PFX) certificate file containing a private key.
            // X509Certificate2 Certificate = new X509Certificate2 ("Certificate.pfx", "PASSWORD");
            // HttpServer HttpsServer = new HttpServer (443, 10, true, true, 1, true, false, Certificate);
            //
            // HttpsServer.RegisterAuthenticationMethod (new DigestAuthentication ("The Actuator Realm", GetDigestUserPasswordHash));
            //
            // foreach (IHttpServerResource Resource in HttpServer.GetResources())
            //    HttpsServer.Register (Resource);
            //
            // Log.Information ("HTTPS Server receiving requests on port " + HttpsServer.Port.ToString ());

            // Main loop

            Log.Information("Initialization complete. Application started...");

            try
            {
                while (executionLed.Value)
                {
                    System.Threading.Thread.Sleep(1000);
                    RemoveOldSessions();
                }
            } catch (Exception ex)
            {
                Log.Exception(ex);
                executionLed.Low();
            } finally
            {
                Log.Information("Terminating application.");
                Log.Flush();
                Log.Terminate();

                HttpServer.Dispose();
                //HttpsServer.Dispose ();

                executionLed.Dispose();

                foreach (DigitalOutput Output in digitalOutputs)
                {
                    Output.Dispose();
                }

                if (alarmThread != null)
                {
                    alarmThread.Abort();
                    alarmThread = null;
                }
            }

            return(0);
        }
Esempio n. 8
0
		private static void GetPhotos (object State)
		{
			object[] P = (object[])State;
			int i = (int)P [0];
			IUPnPService Service = (IUPnPService)P [1];
			string ContentType = (string)P [2];
			string Extension = (string)P [3];
			MailMessage Msg = (MailMessage)P [4];
			ManualResetEvent Done = (ManualResetEvent)P [5];
			DateTime Next = DateTime.Now;
			
			try
			{
				UPnPAction GetDefaultImageURL = Service ["GetDefaultImageURL"];
				Variables v = new Variables ();
				GetDefaultImageURL.Execute (v);
				string ImageURL = (string)v ["RetImageURL"];

				ParsedUri ImageURI = Web.ParseUri (ImageURL);
				HttpResponse Response;
				int ms;
				int j;

				using (HttpSocketClient Client = new HttpSocketClient (ImageURI.Host, ImageURI.Port, ImageURI.UriScheme is HttpsUriScheme, ImageURI.Credentials))
				{
					Client.ReceiveTimeout = 20000;

					for (j = 1; j <= 3; j++)
					{
						ms = (int)System.Math.Round ((Next - DateTime.Now).TotalMilliseconds);
						if (ms > 0)
							Thread.Sleep (ms);

						Response = Client.GET (ImageURI.PathAndQuery, ContentType);
						Msg.EmbedObject ("cam" + (i + 1).ToString () + "img" + j.ToString () + "." + Extension, ContentType, Response.Data);

						Log.Information ("Click.", EventLevel.Minor, Service.Device.FriendlyName);

						Next = Next.AddSeconds (5);
					}
				}

			} catch (ThreadAbortException)
			{
				Thread.ResetAbort ();
			} catch (Exception ex)
			{
				Log.Exception (ex);
			} finally
			{
				Done.Set ();
			}
		}
Esempio n. 9
0
		private static void MonitorHttp ()
		{
			HttpSocketClient HttpClient = null;
			HttpResponse Response;
			XmlDocument Xml;
			Thread ControlThread;
			string Resource;

			ControlThread = new Thread (ControlHttp);
			ControlThread.Name = "Control HTTP";
			ControlThread.Priority = ThreadPriority.Normal;
			ControlThread.Start ();

			try
			{
				while (executing)
				{
					try
					{
						if (HttpClient == null)
						{
							HttpClient = new HttpSocketClient ("192.168.0.15", 80, new DigestAuthentication ("Peter", "Waher"));
							HttpClient.ReceiveTimeout = 30000;
							HttpClient.Open ();
						}

						if (hasValues)
						{
							int NrLeds = (int)System.Math.Round ((8 * lightPercent) / 100);
							double LightNextStepDown = 100 * (NrLeds - 0.1) / 8;
							double LightNextStepUp = 100 * (NrLeds + 1) / 8;
							double DistDown = System.Math.Abs (lightPercent - LightNextStepDown);
							double DistUp = System.Math.Abs (LightNextStepUp - lightPercent);
							double Dist20 = System.Math.Abs (20 - lightPercent);
							double MinDist = System.Math.Min (System.Math.Min (DistDown, DistUp), Dist20);

							if (MinDist < 1)
								MinDist = 1;

							StringBuilder sb = new StringBuilder ();

							sb.Append ("/event/xml?Light=");
							sb.Append (XmlUtilities.DoubleToString (lightPercent, 1));
							sb.Append ("&LightDiff=");
							sb.Append (XmlUtilities.DoubleToString (MinDist, 1));
							sb.Append ("&Motion=");
							sb.Append (motion ? "1" : "0");
							sb.Append ("&Timeout=25");

							Resource = sb.ToString ();
						} else
							Resource = "/xml?Momentary=1&Light=1&Motion=1";
					
						Response = HttpClient.GET (Resource);

						Xml = Response.Xml;
						if (UpdateFields (Xml))
						{
							hasValues = true;
							CheckControlRules ();
						}

					} catch (Exception ex)
					{
						Log.Exception (ex.Message);

						HttpClient.Dispose ();
						HttpClient = null;
					}
				}
			} finally
			{
				ControlThread.Abort ();
				ControlThread = null;
			}

			if (HttpClient != null)
				HttpClient.Dispose ();
		}
Esempio n. 10
0
        public static int Main(string[] args)
        {
            Log.Register(new ConsoleOutEventLog(80));
            Log.Information("Initializing application...");

            HttpSocketClient.RegisterHttpProxyUse(false, false);                // Don't look for proxies.

            DB.BackupConnectionString = "Data Source=sensor.db;Version=3;";
            DB.BackupProviderName     = "Clayster.Library.Data.Providers.SQLiteServer.SQLiteServerProvider";
            db = DB.GetDatabaseProxy("TheSensor");

            Console.CancelKeyPress += (object sender, ConsoleCancelEventArgs e) =>
            {
                e.Cancel = true;
                executionLed.Low();
            };

            // Initializing hardware and retrieving current sensor values

            try
            {
                tmp102.Configure(false, TexasInstrumentsTMP102.FaultQueue.ConsecutiveFaults_6, TexasInstrumentsTMP102.AlertPolarity.AlertActiveLow,
                                 TexasInstrumentsTMP102.ThermostatMode.ComparatorMode, false, TexasInstrumentsTMP102.ConversionRate.Hz_1, false);

                temp         = (short)tmp102.ReadTemperatureRegister();
                temperatureC = temp / 256.0;

                for (int i = 0; i < 10; i++)
                {
                    tempAvgWindow [i] = temp;
                }

                sumTemp = temp * 10;
            } catch (Exception ex)
            {
                Log.Exception(ex);

                sumTemp      = 0;
                temperatureC = 0;
                errorLed.High();
            }

            try
            {
                adc.Configure(true, false, false, false, false, false);

                light        = adc.ReadRegistersBinary() [0];
                lightPercent = (100.0 * light) / 0x0fff;

                for (int i = 0; i < 10; i++)
                {
                    lightAvgWindow [i] = light;
                }

                sumLight = light * 10;
            } catch (Exception ex)
            {
                Log.Exception(ex);

                sumLight     = 0;
                lightPercent = 0;
                errorLed.High();
            }

            // Loading historical Sensor Values

            Log.Information("Loading Minute Values.");
            perMinute.AddRange(Record.LoadRecords(Rank.Minute));

            Log.Information("Loading Hour Values.");
            perHour.AddRange(Record.LoadRecords(Rank.Hour));

            Log.Information("Loading Day Values.");
            perDay.AddRange(Record.LoadRecords(Rank.Day));

            Log.Information("Loading Month Values.");
            perMonth.AddRange(Record.LoadRecords(Rank.Month));

            // Resuming average calculations

            int      Pos         = perSecond.Count;
            DateTime CurrentTime = DateTime.Now;
            DateTime Timestamp;

            while (Pos-- > 0)
            {
                Record Rec = perSecond [Pos];
                Timestamp = Rec.Timestamp;
                if (Timestamp.Minute == CurrentTime.Minute && Timestamp.Hour == CurrentTime.Hour && Timestamp.Date == CurrentTime.Date)
                {
                    sumSeconds += Rec;
                    nrSeconds++;
                }
                else
                {
                    break;
                }
            }

            Pos = perMinute.Count;
            while (Pos-- > 0)
            {
                Record Rec = perMinute [Pos];
                Timestamp = Rec.Timestamp;
                if (Timestamp.Hour == CurrentTime.Hour && Timestamp.Date == CurrentTime.Date)
                {
                    sumMinutes += Rec;
                    nrMinutes++;
                }
                else
                {
                    break;
                }
            }

            Pos = perHour.Count;
            while (Pos-- > 0)
            {
                Record Rec = perHour [Pos];
                Timestamp = Rec.Timestamp;
                if (Timestamp.Date == CurrentTime.Date)
                {
                    sumHours += Rec;
                    nrHours++;
                }
                else
                {
                    break;
                }
            }

            Pos = perDay.Count;
            while (Pos-- > 0)
            {
                Record Rec = perDay [Pos];
                Timestamp = Rec.Timestamp;
                if (Timestamp.Month == CurrentTime.Month && Timestamp.Year == CurrentTime.Year)
                {
                    sumDays += Rec;
                    nrDays++;
                }
                else
                {
                    break;
                }
            }

            // Sampling of new Sensor Values

            Timer Timer = new Timer(SampleSensorValues, null, 1000 - DateTime.Now.Millisecond, 1000);                   // Every second.

            // HTTP Interface

            HttpServer HttpServer = new HttpServer(80, 10, true, true, 1);

            Log.Information("HTTP Server receiving requests on port " + HttpServer.Port.ToString());

            HttpServer.Register("/", HttpGetRoot, false);                                               // Synchronous, no authentication
            HttpServer.Register("/html", HttpGetHtml, false);                                           // Synchronous, no authentication
            HttpServer.Register("/historygraph", HttpGetHistoryGraph, false);                           // Synchronous, no authentication
            HttpServer.Register("/xml", HttpGetXml, false);                                             // Synchronous, no authentication
            HttpServer.Register("/json", HttpGetJson, false);                                           // Synchronous, no authentication
            HttpServer.Register("/turtle", HttpGetTurtle, false);                                       // Synchronous, no authentication
            HttpServer.Register("/rdf", HttpGetRdf, false);                                             // Synchronous, no authentication

            // HTTPS interface

            // Certificate must be a valid P12 (PFX) certificate file containing a private key.
            // X509Certificate2 Certificate = new X509Certificate2 ("Certificate.pfx", "PASSWORD");
            // HttpServer HttpsServer = new HttpServer (443, 10, true, true, 1, true, false, Certificate);
            //
            // foreach (IHttpServerResource Resource in HttpServer.GetResources())
            //    HttpsServer.Register (Resource);
            //
            // Log.Information ("HTTPS Server receiving requests on port " + HttpsServer.Port.ToString ());

            // Main loop

            Log.Information("Initialization complete. Application started...");

            try
            {
                while (executionLed.Value)
                {
                    System.Threading.Thread.Sleep(1000);
                }
            } catch (Exception ex)
            {
                Log.Exception(ex);
                executionLed.Low();
            } finally
            {
                Log.Information("Terminating application.");
                Log.Flush();
                Log.Terminate();
                Timer.Dispose();
                HttpServer.Dispose();
                //HttpsServer.Dispose ();
                executionLed.Dispose();
                measurementLed.Dispose();
                errorLed.Dispose();
                networkLed.Dispose();
                motion.Dispose();
                i2cBus.Dispose();
            }

            return(0);
        }
Esempio n. 11
0
        private static void MonitorHttp()
        {
            HttpSocketClient HttpClient = null;
            HttpResponse     Response;
            XmlDocument      Xml;
            Thread           ControlThread;
            string           Resource;

            ControlThread          = new Thread(ControlHttp);
            ControlThread.Name     = "Control HTTP";
            ControlThread.Priority = ThreadPriority.Normal;
            ControlThread.Start();

            try
            {
                while (executing)
                {
                    try
                    {
                        if (HttpClient == null)
                        {
                            HttpClient = new HttpSocketClient("192.168.0.29", 80, new DigestAuthentication("Peter", "Waher"));
                            HttpClient.ReceiveTimeout = 30000;
                            HttpClient.Open();
                        }

                        if (hasValues)
                        {
                            int    NrLeds            = (int)System.Math.Round((8 * lightPercent) / 100);
                            double LightNextStepDown = 100 * (NrLeds - 0.1) / 8;
                            double LightNextStepUp   = 100 * (NrLeds + 1) / 8;
                            double DistDown          = System.Math.Abs(lightPercent - LightNextStepDown);
                            double DistUp            = System.Math.Abs(LightNextStepUp - lightPercent);
                            double Dist20            = System.Math.Abs(20 - lightPercent);
                            double MinDist           = System.Math.Min(System.Math.Min(DistDown, DistUp), Dist20);

                            if (MinDist < 1)
                            {
                                MinDist = 1;
                            }

                            StringBuilder sb = new StringBuilder();

                            sb.Append("/event/xml?Light=");
                            sb.Append(XmlUtilities.DoubleToString(lightPercent, 1));
                            sb.Append("&LightDiff=");
                            sb.Append(XmlUtilities.DoubleToString(MinDist, 1));
                            sb.Append("&Motion=");
                            sb.Append(motion ? "1" : "0");
                            sb.Append("&Timeout=25");

                            Resource = sb.ToString();
                        }
                        else
                        {
                            Resource = "/xml?Momentary=1&Light=1&Motion=1";
                        }

                        Response = HttpClient.GET(Resource);

                        Xml = Response.Xml;
                        if (UpdateFields(Xml))
                        {
                            hasValues = true;
                            CheckControlRules();
                        }
                    } catch (Exception ex)
                    {
                        Log.Exception(ex.Message);

                        HttpClient.Dispose();
                        HttpClient = null;
                    }
                }
            } finally
            {
                ControlThread.Abort();
                ControlThread = null;
            }

            if (HttpClient != null)
            {
                HttpClient.Dispose();
            }
        }
        public static void Main(string[] args)
        {
            Log.Register(new ConsoleOutEventLog(80));
            Log.Information("Initializing application...");

            HttpSocketClient.RegisterHttpProxyUse(false, false);                // Don't look for proxies.

            Console.CancelKeyPress += (object sender, ConsoleCancelEventArgs e) =>
            {
                e.Cancel  = true;
                executing = false;
            };

            // Object database setup

            DB.BackupConnectionString = "Data Source=controller.db;Version=3;";
            DB.BackupProviderName     = "Clayster.Library.Data.Providers.SQLiteServer.SQLiteServerProvider";
            db = DB.GetDatabaseProxy("TheController");

            // Mail setup

            mailSettings = MailSettings.LoadSettings();
            if (mailSettings == null)
            {
                mailSettings           = new MailSettings();
                mailSettings.Host      = "Enter mailserver SMTP host name here.";
                mailSettings.Port      = 25;
                mailSettings.Ssl       = false;
                mailSettings.From      = "Enter address of sender here.";
                mailSettings.User      = "******";
                mailSettings.Password  = "******";
                mailSettings.Recipient = "Enter recipient of alarm mails here.";
                mailSettings.SaveNew();
            }

            SmtpOutbox.Host       = mailSettings.Host;
            SmtpOutbox.Port       = mailSettings.Port;
            SmtpOutbox.Ssl        = mailSettings.Ssl;
            SmtpOutbox.From       = mailSettings.From;
            SmtpOutbox.User       = mailSettings.User;
            SmtpOutbox.Password   = mailSettings.Password;
            SmtpOutbox.OutboxPath = "MailOutbox";
            SmtpOutbox.Start(Directory.GetCurrentDirectory());

            // UPnP Interface

            upnpServer = new HttpServer(8080, 10, true, true, 1);
            Log.Information("UPnP Server receiving requests on port " + upnpServer.Port.ToString());

            ssdpClient        = new SsdpClient(upnpServer, 10, true, true, false, false, false, 30);
            stillImageCameras = new Dictionary <string, IUPnPService> ();
            subscriptions     = new SortedDictionary <DateTime, Subscription> ();
            stateVariables    = new Dictionary <string, Dictionary <string, string> > ();
            events            = new UPnPEvents("/events");
            upnpServer.Register(events);

            ssdpClient.OnUpdated    += NetworkUpdated;
            events.OnEventsReceived += EventsReceived;

            // Main loop

            Log.Information("Initialization complete. Application started...");

            try
            {
                                #if USE_HTTP
                MonitorHttp();
                                #elif USE_COAP
                MonitorCoap();
                                #endif
            } catch (Exception ex)
            {
                Log.Exception(ex);
            } finally
            {
                Log.Information("Terminating application.");
                Log.Flush();
                Log.Terminate();
                SmtpOutbox.Terminate();

                ssdpClient.Dispose();
                upnpServer.Dispose();
            }
        }
        public static int Main(string[] args)
        {
            Log.Register(new ConsoleOutEventLog(80));
            Log.Information("Initializing application...");

            HttpSocketClient.RegisterHttpProxyUse(false, false);                // Don't look for proxies.

            DB.BackupConnectionString = "Data Source=actuator.db;Version=3;";
            DB.BackupProviderName     = "Clayster.Library.Data.Providers.SQLiteServer.SQLiteServerProvider";
            db = DB.GetDatabaseProxy("TheActuator");

            Console.CancelKeyPress += (object sender, ConsoleCancelEventArgs e) =>
            {
                e.Cancel = true;
                executionLed.Low();
            };

            // HTTP Interface

            HttpServer HttpServer = new HttpServer(80, 10, true, true, 1);
            int        i;

            Log.Information("HTTP Server receiving requests on port " + HttpServer.Port.ToString());

            HttpServer.RegisterAuthenticationMethod(new DigestAuthentication("The Actuator Realm", GetDigestUserPasswordHash));
            HttpServer.RegisterAuthenticationMethod(new SessionAuthentication());

            credentials = LoginCredentials.LoadCredentials();
            if (credentials == null)
            {
                credentials              = new LoginCredentials();
                credentials.UserName     = "******";
                credentials.PasswordHash = CalcHash("Admin", "Password");
                credentials.SaveNew();
            }

            state = State.LoadState();
            if (state == null)
            {
                state = new State();
                state.SaveNew();
            }
            else
            {
                for (i = 0; i < 8; i++)
                {
                    digitalOutputs [i].Value = state.GetDO(i + 1);
                }

                if (state.Alarm)
                {
                    AlarmOn();
                }
                else
                {
                    AlarmOff();
                }
            }

            HttpServer.Register("/", HttpGetRoot, HttpPostRoot, false);                                         // Synchronous, no authentication
            HttpServer.Register("/credentials", HttpGetCredentials, HttpPostCredentials, false);                // Synchronous, no authentication
            HttpServer.Register("/set", HttpGetSet, HttpPostSet, true);                                         // Synchronous, http authentication
            HttpServer.Register("/xml", HttpGetXml, true);                                                      // Synchronous, http authentication
            HttpServer.Register("/json", HttpGetJson, true);                                                    // Synchronous, http authentication
            HttpServer.Register("/turtle", HttpGetTurtle, true);                                                // Synchronous, http authentication
            HttpServer.Register("/rdf", HttpGetRdf, true);                                                      // Synchronous, http authentication
            HttpServer.Register(new WebServiceAPI(), true);

            // HTTPS interface

            // Certificate must be a valid P12 (PFX) certificate file containing a private key.
            // X509Certificate2 Certificate = new X509Certificate2 ("Certificate.pfx", "PASSWORD");
            // HttpServer HttpsServer = new HttpServer (443, 10, true, true, 1, true, false, Certificate);
            //
            // HttpsServer.RegisterAuthenticationMethod (new DigestAuthentication ("The Actuator Realm", GetDigestUserPasswordHash));
            //
            // foreach (IHttpServerResource Resource in HttpServer.GetResources())
            //    HttpsServer.Register (Resource);
            //
            // Log.Information ("HTTPS Server receiving requests on port " + HttpsServer.Port.ToString ());

            // CoAP Interface

            CoapEndpoint CoapEndpoint = new CoapEndpoint();

            Log.Information("CoAP endpoint receiving requests on port " + CoapEndpoint.Port.ToString());

            //CoapEndpoint.RegisterLineListener (new ConsoleOutLineListenerSink (BinaryFormat.Hexadecimal, true));

            for (i = 1; i <= 8; i++)
            {
                CoapEndpoint.RegisterResource("do" + i.ToString() + "/txt", "Digital Output " + i.ToString() + ", as text.", CoapBlockSize.BlockLimit_64Bytes, false, 30, false,
                                              CoapGetDigitalOutputTxt, CoapSetDigitalOutputTxt);
            }

            CoapEndpoint.RegisterResource("do/txt", "Digital Outputs, as a number 0-255 as text.", CoapBlockSize.BlockLimit_64Bytes, false, 30, false,
                                          CoapGetDigitalOutputsTxt, CoapSetDigitalOutputsTxt);

            CoapEndpoint.RegisterResource("alarm/txt", "Alarm Output " + i.ToString() + ", as text.", CoapBlockSize.BlockLimit_64Bytes, false, 30, false,
                                          CoapGetAlarmOutputTxt, CoapSetAlarmOutputTxt);

            foreach (CoapBlockSize BlockSize in Enum.GetValues(typeof(CoapBlockSize)))
            {
                if (BlockSize == CoapBlockSize.BlockLimit_Datagram)
                {
                    continue;
                }

                string Bytes = (1 << (4 + (int)BlockSize)).ToString();

                CoapEndpoint.RegisterResource("xml/" + Bytes, "Complete sensor readout, in XML. Control content using query parmeters. Block size=" + Bytes + " bytes.",
                                              BlockSize, false, 30, false, CoapGetXml);

                CoapEndpoint.RegisterResource("json/" + Bytes, "Complete sensor readout, in JSON. Control content using query parmeters. Block size=" + Bytes + " bytes.",
                                              BlockSize, false, 30, false, CoapGetJson);

                CoapEndpoint.RegisterResource("turtle/" + Bytes, "Complete sensor readout, in TURTLE. Control content using query parmeters. Block size=" + Bytes + " bytes.",
                                              BlockSize, false, 30, false, CoapGetTurtle);

                CoapEndpoint.RegisterResource("rdf/" + Bytes, "Complete sensor readout, in RDF. Control content using query parmeters. Block size=" + Bytes + " bytes.",
                                              BlockSize, false, 30, false, CoapGetRdf);
            }

            // Main loop

            Log.Information("Initialization complete. Application started...");

            try
            {
                while (executionLed.Value)
                {
                    System.Threading.Thread.Sleep(1000);
                    RemoveOldSessions();
                }
            } catch (Exception ex)
            {
                Log.Exception(ex);
                executionLed.Low();
            } finally
            {
                Log.Information("Terminating application.");
                Log.Flush();
                Log.Terminate();

                HttpServer.Dispose();
                //HttpsServer.Dispose ();

                executionLed.Dispose();

                foreach (DigitalOutput Output in digitalOutputs)
                {
                    Output.Dispose();
                }

                if (alarmThread != null)
                {
                    alarmThread.Abort();
                    alarmThread = null;
                }
            }

            return(0);
        }
        public static void Main(string[] args)
        {
            Log.Register(new ConsoleOutEventLog(80));
            Log.Information("Initializing application...");

            HttpSocketClient.RegisterHttpProxyUse(false, false);                // Don't look for proxies.

            DB.BackupConnectionString = "Data Source=camera.db;Version=3;";
            DB.BackupProviderName     = "Clayster.Library.Data.Providers.SQLiteServer.SQLiteServerProvider";
            db = DB.GetDatabaseProxy("TheCamera");

            defaultSettings = DefaultSettings.LoadSettings();
            if (defaultSettings == null)
            {
                defaultSettings = new DefaultSettings();
                defaultSettings.SaveNew();
            }

            Console.CancelKeyPress += (object sender, ConsoleCancelEventArgs e) =>
            {
                e.Cancel = true;
                executionLed.Low();
            };

            try
            {
                // HTTP Interface

                httpServer = new HttpServer(80, 10, true, true, 1);
                Log.Information("HTTP Server receiving requests on port " + httpServer.Port.ToString());

                httpServer.RegisterAuthenticationMethod(new DigestAuthentication("The Camera Realm", GetDigestUserPasswordHash));
                httpServer.RegisterAuthenticationMethod(new SessionAuthentication());

                credentials = LoginCredentials.LoadCredentials();
                if (credentials == null)
                {
                    credentials              = new LoginCredentials();
                    credentials.UserName     = "******";
                    credentials.PasswordHash = CalcHash("Admin", "Password");
                    credentials.SaveNew();
                }

                httpServer.Register("/", HttpGetRootProtected, HttpPostRoot, false);                                    // Synchronous, no authentication
                httpServer.Register("/html", HttpGetHtmlProtected, false);                                              // Synchronous, no authentication
                httpServer.Register("/camera", HttpGetImgProtected, true);                                              // Synchronous, www-authentication
                httpServer.Register("/credentials", HttpGetCredentials, HttpPostCredentials, false);                    // Synchronous, no authentication

                // UPnP Interface

                upnpServer = new HttpServer(8080, 10, true, true, 1);
                Log.Information("UPnP Server receiving requests on port " + upnpServer.Port.ToString());

                upnpServer.Register("/", HttpGetRootUnprotected, HttpPostRoot, false);                                                  // Synchronous, no authentication
                upnpServer.Register("/html", HttpGetHtmlUnprotected, false);                                                            // Synchronous, no authentication
                upnpServer.Register("/camera", HttpGetImgUnprotected, false);                                                           // Synchronous, no authentication
                upnpServer.Register("/CameraDevice.xml", HttpGetCameraDevice, false);
                upnpServer.Register(new HttpServerEmbeddedResource("/StillImageService.xml", "Camera.UPnP.StillImageService.xml"));
                upnpServer.Register(stillImageWS = new DigitalSecurityCameraStillImage());

                // Icons taken from: http://www.iconarchive.com/show/the-bourne-ultimatum-icons-by-leoyue/Camera-icon.html
                upnpServer.Register(new HttpServerEmbeddedResource("/Icon/16x16.png", "Camera.UPnP.16x16.png"));
                upnpServer.Register(new HttpServerEmbeddedResource("/Icon/24x24.png", "Camera.UPnP.24x24.png"));
                upnpServer.Register(new HttpServerEmbeddedResource("/Icon/32x32.png", "Camera.UPnP.32x32.png"));
                upnpServer.Register(new HttpServerEmbeddedResource("/Icon/48x48.png", "Camera.UPnP.48x48.png"));
                upnpServer.Register(new HttpServerEmbeddedResource("/Icon/64x64.png", "Camera.UPnP.64x64.png"));
                upnpServer.Register(new HttpServerEmbeddedResource("/Icon/128x128.png", "Camera.UPnP.128x128.png"));
                upnpServer.Register(new HttpServerEmbeddedResource("/Icon/256x256.png", "Camera.UPnP.256x256.png"));

                ssdpClient              = new SsdpClient(upnpServer, 10, true, true, false, false, false, 30);
                ssdpClient.OnNotify    += OnSsdpNotify;
                ssdpClient.OnDiscovery += OnSsdpDiscovery;

                // Initializing camera

                Log.Information("Initializing camera.");
                try
                {
                    currentResolution       = defaultSettings.Resolution;
                    currentCompressionRatio = defaultSettings.CompressionLevel;

                    try
                    {
                        camera.Reset();                                 // First try @ 38400 baud
                        camera.SetImageSize(currentResolution);
                        camera.Reset();

                        camera.SetBaudRate(LinkSpriteJpegColorCamera.BaudRate.Baud_115200);
                        camera.Dispose();
                        camera = new LinkSpriteJpegColorCamera(LinkSpriteJpegColorCamera.BaudRate.Baud_115200);
                    } catch (Exception)                         // If already at 115200 baud.
                    {
                        camera.Dispose();
                        camera = new LinkSpriteJpegColorCamera(LinkSpriteJpegColorCamera.BaudRate.Baud_115200);
                    } finally
                    {
                        camera.SetCompressionRatio(currentCompressionRatio);
                    }
                } catch (Exception ex)
                {
                    Log.Exception(ex);
                    errorLed.High();
                    camera = null;
                }

                // Main loop

                Log.Information("Initialization complete. Application started.");

                while (executionLed.Value)
                {
                    Thread.Sleep(1000);
                    RemoveOldSessions();
                }
            } catch (Exception ex)
            {
                Log.Exception(ex);
                executionLed.Low();
            } finally
            {
                Log.Information("Terminating application.");
                Log.Flush();
                Log.Terminate();

                ssdpClient.Dispose();

                if (upnpServer != null)
                {
                    upnpServer.Dispose();
                }

                if (httpServer != null)
                {
                    httpServer.Dispose();
                }

                executionLed.Dispose();
                cameraLed.Dispose();
                networkLed.Dispose();
                errorLed.Dispose();
                camera.Dispose();
            }
        }
        public static int Main(string[] args)
        {
            Log.Register(new ConsoleOutEventLog(80));
            Log.Information("Initializing application...");

            HttpSocketClient.RegisterHttpProxyUse(false, false);                // Don't look for proxies.

            Console.CancelKeyPress += (object sender, ConsoleCancelEventArgs e) =>
            {
                e.Cancel = true;
                executionLed.Low();
            };

            // Initializing hardware and retrieving current sensor values

            try
            {
                tmp102.Configure(false, TexasInstrumentsTMP102.FaultQueue.ConsecutiveFaults_6, TexasInstrumentsTMP102.AlertPolarity.AlertActiveLow,
                                 TexasInstrumentsTMP102.ThermostatMode.ComparatorMode, false, TexasInstrumentsTMP102.ConversionRate.Hz_1, false);

                temp         = (short)tmp102.ReadTemperatureRegister();
                temperatureC = temp / 256.0;

                for (int i = 0; i < 10; i++)
                {
                    tempAvgWindow [i] = temp;
                }

                sumTemp = temp * 10;
            } catch (Exception ex)
            {
                Log.Exception(ex);

                sumTemp      = 0;
                temperatureC = 0;
                errorLed.High();
            }

            try
            {
                adc.Configure(true, false, false, false, false, false);

                light        = adc.ReadRegistersBinary() [0];
                lightPercent = (100.0 * light) / 0x0fff;

                for (int i = 0; i < 10; i++)
                {
                    lightAvgWindow [i] = light;
                }

                sumLight = light * 10;
            } catch (Exception ex)
            {
                Log.Exception(ex);

                sumLight     = 0;
                lightPercent = 0;
                errorLed.High();
            }

            // Sampling of new Sensor Values

            Timer Timer = new Timer(SampleSensorValues, null, 1000 - DateTime.Now.Millisecond, 1000);                   // Every second.

            // HTTP Interface

            HttpServer HttpServer = new HttpServer(80, 10, true, true, 1);

            Log.Information("HTTP Server receiving requests on port " + HttpServer.Port.ToString());

            HttpServer.Register("/", HttpGetRoot, false);                                               // Synchronous, no authentication
            HttpServer.Register("/html", HttpGetHtml, false);                                           // Synchronous, no authentication
            HttpServer.Register("/historygraph", HttpGetHistoryGraph, false);                           // Synchronous, no authentication
            HttpServer.Register("/xml", HttpGetXml, false);                                             // Synchronous, no authentication
            HttpServer.Register("/json", HttpGetJson, false);                                           // Synchronous, no authentication
            HttpServer.Register("/turtle", HttpGetTurtle, false);                                       // Synchronous, no authentication
            HttpServer.Register("/rdf", HttpGetRdf, false);                                             // Synchronous, no authentication

            // HTTPS interface

            // Certificate must be a valid P12 (PFX) certificate file containing a private key.
            // X509Certificate2 Certificate = new X509Certificate2 ("Certificate.pfx", "PASSWORD");
            // HttpServer HttpsServer = new HttpServer (443, 10, true, true, 1, true, false, Certificate);
            //
            // foreach (IHttpServerResource Resource in HttpServer.GetResources())
            //    HttpsServer.Register (Resource);
            //
            // Log.Information ("HTTPS Server receiving requests on port " + HttpsServer.Port.ToString ());

            // Main loop

            Log.Information("Initialization complete. Application started...");

            try
            {
                while (executionLed.Value)
                {
                    System.Threading.Thread.Sleep(1000);
                }
            } catch (Exception ex)
            {
                Log.Exception(ex);
                executionLed.Low();
            } finally
            {
                Log.Information("Terminating application.");
                Log.Flush();
                Log.Terminate();
                Timer.Dispose();
                HttpServer.Dispose();
                //HttpsServer.Dispose ();
                executionLed.Dispose();
                measurementLed.Dispose();
                errorLed.Dispose();
                networkLed.Dispose();
                motion.Dispose();
                i2cBus.Dispose();
            }

            return(0);
        }