Datainsamling över Internet I den här uppgiften skall du styra ett mätförlopp och hämta mätdata via internet. Från en dator skall du styra en annan dator och beordra den att utföra en mätning och skicka tillbaka mätdata. En sådan konfiguration brukar kallas Clien-Server, där klienten är den dator som styr processen och servern är den dator som utför klientens order. Uppgiften är att göra en temperaturmätning med en enchipsdator och skicka mätvärdet över internet till en klientdator någon annan stans i världen. Enchipsdatorn med temperaturmätaren sitter ansluten till en serverdator och kommunicerar med den via RS-232. Servern skickar sedan mätvärdet vidare till klienten via internet. Mätningarna initieras från klientdatorn. 1 8 Internet RS232 2 3 7 6 Klient Server Enchipsdator 4 5 Givare När man kommunicerar över internet, sker det på ett standardiserat sätt, ett s.k. protokoll. Ett protokoll beskriver hur datat skall förpackas när det skickas över internet. Beroende på vad man vill göra, använder man sig av olika protokoll. När man skickar mail kan man använda t.ex. IMAP ellet POP3- protokollen. Surfar man omkring bland hemsidor så använder man HTTP-protokollet, och när man överför filer används FTP-protokollet. I vår client-server applikation skall vi använda oss av TCP-protokollet, som är lämpligt för allmänna tillämpningar. Samtliga dessa protokoll använder sig i sin tur av ett underliggande protokoll, kallat IP-protokollet. Med TCP/IP-protokollen kan vi skicka över godtyckliga textsträngar mellan datorerna. Varje dator identifieras med ett s.k. IP-nummer, som är ett 32-bits tal. De 32 bitarna brukar skrivas i form av fyra stycken 8-bitars grupper, separerade av en punkt, och vars värden dessutom ges på decimal talbas. Ett IP-nummer kan t.ex. se ut så här: 130.237.268.32 IP-numret identifierar alltså datorn. Ofta är det praktiskt att ge datorn ett namn, t.ex Faktaruta IP: Internet Protokoll. Reglerar dataöverföringen på låg nivå TCP: Transport Control Protokol. Sköter dataöverföringen på transportnivån FTP: File Transfer Protokoll. Används vid ren filöverföring HTTP: Hypertext Transfer Protokoll. Används för läsa HTML-sidor (surfa) POP: Post Office Protokol. Avsett för mail-hantering IMAP: Internet Message Access Protokol. Hanterar mail. DNS: Domain Name Server. Översätter datornamn till IP-nummer. Per Nylén 1 2003-11-25
SERVER33. När man sedan vill kontakta en namngiven dator så kontaktas en s.k. Domain Name Server (DNS) som sitter på nätet som kan tala om vad en namngiven dator har för IP-nummer. Varje dator kan naturligtvis sköta flera internetkommunikationer samtidigt. Datorn måsta alltså kunna identifiera vilket program som skall ta emot ett datapaket som kommer in till datorn. Det sker genom att varje datapaket är märkt med ett s.k. PORT-nummer som identifierar det program som skall ta emot paketet. De olika standardprogrammen använder sig av standardiserade portnummer. T.ex. FTP använder port nummer 21 och HTTP port nummer 80. Programmen Eftersom det är två datorer som skall kommunicera med varandra, bli det två olika program som skall skrivas: ett klientprogram och ett serverprogram. Klientprogrammet etablerar kontakt med servern och begär en mätning. När nätresultatet kommer tillbaka presenteras det i klientprogrammets fönster. Serverprogrammet väntar på att bli kontaktat av klienten, och på att det kommer en order om mätning från klienten. När servern mottar en order om mätning, skickar servern ordern vidare till enchipsdatorn som utför temperaturmätningen. När mätningen är utförd skickar enchipsdatorn mätresultatet till servern, som i sin tur skickar mätresultatet vidare till klienten. Sändare Uppk oppling Datablock 1 Datablock 2 Mottagare För att hantera datakommunikationen över internet använder vi oss av protokollet TCP/IP. Det är ett protokoll av typen connection oriented, dvs själva datatransporten föregås av en uppkoppling och avslutas med en nedkoppling. Ett eller flera datablock kvitteras innan nästa block sänds.överföring med TCP/IP är säker på bekostnad av snabbheten. Nerkoppling TCP/IP använder en omfattande kvittering för att få en säker överföring Klientprogrammet Klienten använder sig av TCP/IP-klient klassen i Indy-client biblioteket, var ikon ser ut så här: För att kunna ansluta till servern måste du känna till serverns IP-nummer. Ditt program skall därför ha ett fönster i vilket man anger serverns IP-nummer. Vidare måste man känna till serverprogrammets port-nummer, så även det skall man kunna ange i ett fönster. Per Nylén 2 2003-11-25
När IP-nummer och port-nummer är kända kan man ansluta sig till servern. Det skall man göra genom att klicka på knappen Connect. Då hämtar programmet informationen om IP-nummer och port-nummer till TCP-klienten och försöker ansluta till servern. Här måste vi vara försiktiga. Det kan ju hända att det inte går att ansluta till servern, och i så fall måste vi ta hand om den felsituationen. try IdTCPClient1.Host := edserverip.text; IdTCPClient1.Port := edserverport.text; IdTCPClient1.Connect(1000); except on EIdConnectTimeout do edmessage.text:= No Connection ; Parametern (1000) anger time-out tiden i millisekunder för att ansluta. När förbindelsen är etablerad skall detta meddelas. På händelsen OnConnected skriver du just Connected to Server i meddelande-fönstret. Samtidigt aktiverar du knapparna Test, Mät och Disconnect, och av-aktiverar Exit - knappen så att man inte kan lämna programmet utan att först koppla ner förbindelsen. När man är klar med mätningarna skall man koppla ner förbindelsen. Det gör man genom att klicka på knappen DisConnect och då utförs proceduren: IdTCPClient1.Disconnect; När förbindelsen är nedkopplad skall det meddelas. Det gör du genom att på händelsen OnDisconnected ändra texten i meddelandefönstret till Disconnected samt ändra aktiveringarna för knapparna. Bl.a. skall Exit-knappen bli aktiv så att man kan avsluta programmet. Själva mätningen av temperaturen skall initieras genom att man klickar på knappen Mät. Då skickar programmet en order om mätning till servern. Det kan t.ex. ske genom att man skickar textsträngen Temp till servern. Det gör du med satsen: IdTCPClient1.WriteLn( Temp ); Därefter går programmet över till att vänta på mätresultatet. Här måste vi åter vara lite försiktiga. Det kan ju hända att servern är nere så att vi aldrig får tillbaka något mätvärde. Det felet måste vi vara beredda på och ta hand om. Därför försöker vi läsa mätresultatet och om vi får ett fel så tar vi hand om det, och ger ett vänligt felmeddelande. try Svar := IdTCPClient1.ReadLn; except //Hämta mätvärdet //Kolla fel Per Nylén 3 2003-11-25
on EIdSocketError do begin edmessage := Error: No reply ; edtemp.text:= ; Exit; end, edtemp.text:=svar; //Skriv felmeddelande //Avbryt proceduren //Skriv mätvärdet Serverprogrammet Servern använder sig av TCP/IP-server klassen i Indy-Server klassbibliotek. När programmet startar skall det först ta reda på serverdatorns IP-nummer och visa det i ett fönster så att klienten vet vilket IP-nummer som den skall etablera kontakt med. Du kan få reda på den egna datorns IP-nummer med satsen edipnummer.text:=idipwatch1.localip; där vi använt klassen IdIPWatch i klassbiblioteket Indy-Misc för att ta reda på datorns IP-nummer. Vid programstart skall programmet också visa vilket port-nummer som programmet använder sig av. Man skall givetvis undvika de nummer som standardprogrammen använder sig av. 4711 kan vara ett lämpligt nummer. Vid programstarten skall du även aktivera TCP-servern. När programmet blir kontaktat av klienten är det lämpligt att meddela det på något sätt, t.ex. genom att i formulärets meddelandefönster skriva Connected from: och sedan klientens IP-nummer. Att servern blivit kontaktad av en klient märker man genom att följande händelse (event) inträffar: IdServer1Connect Klientens IP-nummer ges som en sträng av: AThread.Connection.Socket.Binding.PeerIP När klienten slutligen kopplar ifrån, sker händelsen Disconnect och då skall du skriva Client Disconnected i meddelandefönstret. För att utföra de olika servicearna som klienten skickar kommandon om, börjar vi med att definiera de olika kommandon som klienten kan skicka. De är i allmänhet textsträngar, eventuellt med parametrar. Markera IdTCPServer1 och titta på det objektets properties. Där finns en som heter CommandHandlers. Markera den egenskapen och klicka på dess knapp med fyra punkter. Per Nylén 4 2003-11-25
Då öppnas dess CommandHandler Editor, och den är tom från början. Där lägger du till ett nytt kommando. Nu skall vi tala om vad det är för kommando från klienten som skall starta detta kommando. Det gör du genom att klicka på kommandot i kommandoeditorn så att det blir blåmarkerat. Då kommer det kommandot upp i Delphi s objektinspektor. Där skriver du in att denna CommandHandlers kommando är Temp. Det bestämde vi ju redan när vi skrev klientprogrammet. Nu skall vi tala om vad det är för åtgärder som skall vidtagas när servern får detta kommando. Det gör du genom att dubbelklicka i CommandHandler0:s event OnCommand. Då skapas en procedur (CommandHandler0Command) där du skriver de satser som servern skall utföra när den får just detta kommando: procedure TForm1.IdTCPServer1TIdCommandHandler0Command( ASender: TIdCommand); var TXT: String; begin TXT := Temperatur; //Mät temperaturen Asender.Thread.Connection.WriteLn(TXT); //Skicka temp. till klienten wtemp.text := IntToStr(T); //Skriv ut temperaturen I den här uppgiften skulle vi mäta temperaturen med hjälp av enchipsdatorn, och skicka tillbaka mätresultatet som en textsträng till klienten. Hur man utför själva temperaturmätningen finns beskrivet i uppgiften Seriekommunikation med Enchipsdatorn. Jag antar därför helt enkelt att det finns en funktion, som heter Temperatur, och som returnerar temperaturen som en sträng. Denna sträng skriver jag ut i serverprogrammets fönster och skickar tillbaka till klienten. För att testa programmet kan du ju till en början sätta strängen TXT till en fix text, t.ex 38,4, och se att kommunikationen över internet fungerar. Programmeringstips. 1. För att underlätta programutvecklingen har jag lagt in en testfunktion. Med den kan man kolla att förbindelsen mellan klienten och servern fungerar. Klienten har en extra knapp som sänder kommandot Test till servern. När servern får det kommandot, skriver den Test i temperaturfönstret och returnerar strängen OK till klienten. När klienten får tillbaka OK från servern, så visar den det i sitt temperaturfönster. 2. Du kan utveckla både klient och serverprogrammet i din dator, och provköra kommunikationen mellan programmen. Det gör ingen skillnad att de två programmen råkar köras i samma dator, det är ändå två helt skilda program som kommunicerar med varandra över TCP/IP. Per Nylén 5 2003-11-25