Hidden Camera App Realtidsprogrammering EDA040 Joakim Svensson (dt05js8) Torbjörn Lundberg (dt05tl3) Henrik Andersson (dt05ha1)
Manual och programbeskrivning 1. Manual 1.1 Kamerauppkoppling 1.2 Starta servrarna 1.3 Starta klienterna 1.4 Användargränssnitt 2. Programbeskrivning 2.1 Server 2.2 Klient
1 Manual: 1.1 Kamerauppkoppling: För att kunna använda programmet behövs det först och främst finnas två anslutningar till kamerorna som skall köras. För att skapa dessa anslutningar skrivs följande i konsolen: >> telnet argus X Trying 130.235.34.186... Connected to argus X.student.lth.se. Escape character is '^]'. 4.30 Linux 2.4.31 on a cris (10:50:10) >> axis 00408c7cbb58 login: rt >> Password: >> [rt@axis 00408c7cbb58 /var/tmp]3208$ /etc/cameraproxy 7878 CameraProxy running on port 7878 and 7879. Där lösenordet är sigge. Starta sedan ytterligare en konsol och skriv likadant fast telneta till argus Y (där Y!= X och 1 <= Y <= 14, helst 2) istället.
1.2 Starta servrarna: Starta kameraserver 1 genom att skriva följande i konsolen: java jar CamServer1.jar& och kameraserver 2 genom att skriva: java jar CamServer2.jar& Ovanstående kommandon kräver att man står i samma katalog som de nämnda filerna ligger i. Servrarna är inställda på att automatiskt ansluta till kamerorna argus 1 och argus 2 på port 7878. Om man vill ansluta till några andra kameror anger man adressen och porten som parameter till ovan nämnda kommandon. 1.3 Starta klienterna: När servrarna är startade ska klienten startas. Detta görs genom att i konsollen ge kommandot: java jar CamClient.jar& Även här är det viktigt att man står i den katalog där jar-filen finns. När detta sker visas ett användargränssnitt på skärmen.
1.4 Användargränssnitt: Gränssnittet består av följande komponenter: Två rutor som visar bilderna från kamerorna Ett synkfält som visar grönt när bildvisningen sker synkroniserat och rött när den är osynkroniserad Två fält som visar fördröjning för respektive kamera En knapp med rubriken Set idle mode, som säger till kamerorna att skicka bilder var femte sekund Figur 1: Bild av användargränssnittet med synkronisering Snabb bildvisning sker när rörelse har detekterats av en kamera och innebär att kamerorna skickar bilder oftare, närmare bestämt ungefär 11-12 bilder i sekunden. I vanligt läge skickas bilderna enbart var femte sekund. För att bildvisningen skall ske synkroniserat får fördröjningen hos kamerorna skilja med maximalt 27 millisekunder. Överstiger fördröjningsskillnaden detta värde tio
gånger i rad börjar bilderna skickas osynkroniserat. Om bildvisningen sker osynkroniserat kommer bilderna att visas upp så fort de anländer till klientprogrammet. 2 Programbeskrivning: Programmet består utav två paket. Ett på serversidan (HiddenCam) och ett på klientsidan (CamVoyeur). På serversidan finns det som hanterar kamerorna och skapar anslutningar till klientsidan. I serverpaketet finns följande klasser: Klientpaketet Serverpaketet Server:
Cammy Ett interface för att kunna starta flera servrar. CamServer Kameraservern för den ena kameran. CameraServer implementerar Cammy. I denna klass finns main-metoden som antingen ansluter till kameran argus-1 på port 7878 eller till den kamera man specificerat vid start av programmet. CamServer2 Samma som CamServer fast den ansluter som standard till argus-2. ImageSender Denna tråd skickar bilder över en Socket till klientprogrammet. Bilderna hämtas från kameran och skickas med korrekt intervall. CommandHandler En tråd som läser av de Event som skapas från följande två klasser. Klassen ändrar hastigheten på skickandet av bilder hos ImageSender och skriver även på en Socket när rörelse har detekterats. SocketCommands Detta är en tråd som lyssnar efter kommandon på en Socket. De kommandon som tas emot är att kameran ska skicka bilder oftare eller mer sällan. Denna tråd märker också av om klientprogrammet har avslutats. När ett kommando har hittats skapas ett Event som CommandHandler tar hand om. Motion Denna tråd läser av om kameran detekterar någon rörelse. När rörelse har detekterats skapas ett MotionDetectedEvent som CommandHandler läser MotionDetectedEvent
Skapas av Motion när rörelse har detekterats. DisconnectEvent Skapas av SocketCommands när klientprogrammet avslutats. StartMovieModeEvent Skapas av SocketCommands när klienten via en Socket talat om att kameran ska skicka bilder snabbare StopMovieModeEvent Skapas av SocketCommands när användaren tryckt på knappen Set Idle Mode När en CamServer startas skapas två ServerSockets som väntar på att en klient ska ansluta. När anslutningen har upprättats startas en ImageSender och en CommandHandler. Efter detta väntar servern tills klienten har avslutat och väntar därefter på ny anslutning från en klient.
Klient: CamClient Den klass som startar klientprogrammet. Här skapas ett CameraGUI och Sockets för att skicka och ta emot kommandon och för att ta emot bilder. Buffy En tråd som tar emot de bilder som skickas från en kamera. Av varje bild skapas ett Img-objekt och detta objekt läggs in i ImageContainer. I vår lösning finns två Buffy-trådar, en för varje kamera. Img Innehåller information om en bildruta, exempelvis vilken tid den är tagen, när den togs emot av klienten samt själva bilddatan. ImageContainer Detta objekt är en buffert av alla bilder som ska visas upp i
användargränssnittet. När en bild läggs till placeras den i ordning efter vilken tid den togs. När sedan gränssnittet ska visa bilden beräknas hur lång tid det ska dröja mellan de olika bilderna. I programmet finns bara en ImageContainer som är gemensam för de båda Buffy-trådarna. SocketListener Denna tråd lyssnar på en Socket efter kommandon som skickas från en server. CameraGUI Användargränssnittet körs som en tråd och hämtar bilder från ImageContainer så fort det finns en bild tillgänglig. IdleModeEvent Skapas av CameraGUI när användaren trycker på knappen Set Idle Mode. MotionDetectedEvent Skapas av SocketListener när någon kamera har detekterat rörelse. SystemExitEvent Skapas av CameraGUI när det avslutas för att CamClient ska kunna stänga alla Sockets. CameraClient skapas och körs. När det sker så skapas en ImageContainer som har plats för alla bilder som kamerorna skickar. CameraGUI skapas och visar bilderna, huruvida bildvisningen sker synkroniserat eller ej samt vilken fördröjning respektive kamera har. Sockets skapas och ansluter till de båda servrarna. Två Buffy-trådar skapas och startas. En SocketListener per server skapas. Efter detta väntar CamClient på Events från de olika trådarna.