Det här är hemtentan som går lördag 12 januari 2013 i kursen Mobila applikationer med Android.
Ansvarig lärare är
Thomas Padron-McCarthy
(thomas.padron-mccarthy@oru.se),
telefon 070-73 47 013.
Instruktioner
-
Skriv och provkör programmet som beskrivs i uppgiften,
och skicka sen in det färdiga programmet till mig
(thomas.padron-mccarthy@oru.se)
senast klockan 08:00 söndag 13 januari 2013.
-
Uppgiften ska lösas enskilt, dvs inga grupper av två eller flera studenter.
-
Du får använda dator, böcker och vilka andra hjälpmedel som helst, men
du får inte samarbeta eller fråga någon (utom mig).
-
Om du behöver fråga något, så kontakta gärna mig.
Det är nog bäst att ringa eller SMS:a
(se mobilnumret ovan),
för det är inte säkert att jag sitter vid datorn under lördagen.
-
Packa ihop hela katalogen med applikationen i en Zip-fil, och skicka den som en bilaga.
(Även rar- och tar-filer fungerar.)
APK-filen (Androids kompilerade installationsfil) måste vara med.
Men döp först om Zip-filen från nånting.zip till exempelvis nånting.info för att överlista överambitiösa virusfilter.
-
Om du inte senast under måndagen får e-post från mig med en bekräftelse
på att du skickat in uppgiften,
bör du kontakta mig, enklast genom att ringa eller SMS:a mig
(ifall det är e-posten som inte fungerar).
-
Godkänt resultat på den här hemtentan ger betyget G på teoridelen av kursen.
För att få hela kursen godkänd krävs dessutom godkända inlämningsuppgifter.
Uppgiften
Om man vill fjärrstyra något via ett datornät
spelar det ibland stor roll vilken fördröjning man har i nätet.
Nu vill vi mäta den fördröjningen.
Därför kör vi på servern basen.oru.se ett serverprogram
som vi kan skicka PING-kommandon till.
Servern svarar med PONG, och så mäter vi tiden det tog att få svaret.
Vi ska skriva en Android-app för det.
För att samla uppgifterna om de uppmätta tiderna på servern,
finns även ett REPORT-kommando som klienten kan använda för att skicka en rapport till servern.
Servern kan även laddas ner här, som en zip-fil, så att man kan köra den lokalt:
ReadyPingBounceServer.zip.
Det kan vara bra, till exempel om nätverket krånglar.
(Servern är inte en Android-app, utan en Java-applikation för vanliga skrivbords-Java.)
Kommunikationsprotokollet är enkelt.
Klienten kopplar upp sig mot servern på port 2003 och skickar kommandon i form av textrader.
Klienten kan skicka HELLO, och då svarar servern med HELLO.
Klienten kan skicka BYE, och då svarar servern med BYE samt kopplar ner förbindelsen.
Klienten kan skicka PING följt av ett meddelande på samma rad,
och då svarar servern med PONG och samma meddelande.
Klienten kan skicka REPORT följt av ett meddelande på samma rad,
och då svarar servern med REPORT OK, samt sparar det meddelandet på en fil.
Rättelse:
Servern svarar på REPORT-kommandot
med REPORT OK.
Tidigare stod det att servern svarar med enbart OK.
|
Sammanfattning av protokollet:
Klienten skickar | Servern svarar | Exempeldialog |
HELLO
|
HELLO
|
Klienten skickar: HELLO
Servern svarar: HELLO
|
BYE
|
BYE
|
Klienten: BYE
Servern: BYE
|
PING meddelande
|
PONG meddelande
|
Klienten: PING 117
Servern: PONG 117
Klienten: PING smurf tjohej
Servern: PONG smurf tjohej
Klienten: PING
Servern: ERROR
|
REPORT meddelande
|
REPORT OK
|
Klienten: REPORT count = 100; avg = 42.61;
Servern: REPORT OK
Klienten: REPORT bludderudd
Servern: REPORT OK
Klienten: REPORT
Servern: ERROR
|
något annat
|
ERROR
|
K: hej hej
S: ERROR
|
Här är ett exempel på hur appen kan se ut, även om detta är en mer ambitiös lösning
än vad som krävs för godkänt (klicka på bilden för att se den i större format):
Krav
-
Appen ska koppla upp sig mot port 2003 på servern basen.oru.se.
-
Den ska skicka minst ett PING-kommando till servern och mäta tiden tills svaret kommer.
-
Den ska skicka en rapport med hjälp av REPORT-kommandot.
-
I rapporten ska det stå åtminstone tiden det tog att få svar på PING-kommandot.
Om man skickat flera PING-kommandon kan man i stället skicka genomsnittstiden.
-
Man får skicka ytterligare information, som OS-version, nätverkstyp och geografisk position,
men det är inget krav.
-
Formatet på rapporten ska vara läsbart för människor, och behöver inte vara lätt för en maskin att tolka.
Rapporten måste skickas på en enda rad, men den får vara lång.
-
Det finns inga särskilda krav på appens användargränssnitt.
På exempelbilden ovan finns en startknapp och en textruta där appen visar information om vad som händer,
men det är bara ett förslag.
Den absolut minsta dialog med servern som behövs för godkänt på uppgiften följer det här mönstret:
Klienten: PING 1
Servern: PONG 1
Klienten: REPORT time=76
Servern: REPORT OK
|
Tips
-
Man behöver inte ta emot asynkrona meddelanden.
Kommandorader skickas till servern,
och ger alltid en (enda) rad som svar.
-
Det behövs ändå en separat tråd (eller motsvarande) för att sköta kommunikationen med servern,
för i nyare versioner av Android får man inte ha nätverkskommunikation i huvudtråden.
-
För att mäta tider kan man använda
System.currentTimeMillis(),
som returnerar en long,
före och efter det man vill mäta.
Skillnaden mellan de två värdena är den förflutna tiden, mätt i millisekunder.
-
Tiderna i exemplet på bilden, 40-50 ms,
är från en emulator som kördes på en dator uppkopplad med bredband och ett avstånd på någon kilometer till servern.
När jag provkörde på en riktig telefon eller surfplatta, uppkopplad via wifi och vanligt ADSL-bredband, någon kilometer från servern, tog det normalt 40-50 ms.
Med mobilt bredband via UMTS ("3G") låg tiderna på 200-400 ms.
Med mobilt bredband via HSDPA ("Turbo-3G" eller "3,5G") låg tiderna kring 100 ms.
-
Det som gör att man blir godkänd på tentan är inte att appen skickar ett REPORT-kommando.
Det som gör att man blir godkänd på tentan är att man mailat in en fungerande lösning, med källkod.
Thomas Padron-McCarthy
(thomas.padron-mccarthy@oru.se),
12 januari 2013