private static void HttpGetImg (HttpServerResponse resp, HttpServerRequest req, bool Protected) { networkLed.High (); try { if (Protected) { string SessionId = req.Header.GetCookie ("SessionId"); if (!CheckSession (SessionId)) throw new HttpException (HttpStatusCode.ClientError_Forbidden); } LinkSpriteJpegColorCamera.ImageSize Resolution; string Encoding; byte Compression; ushort Size; byte[] Data; GetImageProperties (req, out Encoding, out Compression, out Resolution); lock (cameraLed) { try { cameraLed.High (); if (Resolution != currentResolution) { try { camera.SetImageSize (Resolution); currentResolution = Resolution; camera.Reset (); } catch (Exception) { camera.Dispose (); camera = new LinkSpriteJpegColorCamera (LinkSpriteJpegColorCamera.BaudRate.Baud__38400); camera.SetBaudRate (LinkSpriteJpegColorCamera.BaudRate.Baud_115200); camera.Dispose (); camera = new LinkSpriteJpegColorCamera (LinkSpriteJpegColorCamera.BaudRate.Baud_115200); } } if (Compression != currentCompressionRatio) { camera.SetCompressionRatio (Compression); currentCompressionRatio = Compression; } camera.TakePicture (); Size = camera.GetJpegFileSize (); Data = camera.ReadJpegData (Size); errorLed.Low (); } catch (Exception ex) { errorLed.High (); Log.Exception (ex); throw new HttpException (HttpStatusCode.ServerError_ServiceUnavailable); } finally { cameraLed.Low (); camera.StopTakingPictures (); } } resp.ContentType = Encoding; resp.Expires = DateTime.Now; resp.ReturnCode = HttpStatusCode.Successful_OK; if (Encoding != "imgage/jpeg") { MemoryStream ms = new MemoryStream (Data); Bitmap Bmp = new Bitmap (ms); Data = MimeUtilities.EncodeSpecificType (Bmp, Encoding); } resp.WriteBinary (Data); } finally { networkLed.Low (); } }
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 (); } }