vi er her !!!

02120

DifferentielGPS
home

Data modtagelse

Vores program kan modtage data fra to typer "enheder": Serielle enheder (RS232 enheder) og fra det internetbaserede GPSNet. Programmet kan kun modtage data, der er i RTCM 2.1 formatet. Da der ikke er forskel på det signal vi får fra RS232 enhederne og GPSNet, har vi lavet den abstrakte klasse InputDevice.java, som indeholder en læsning løkke samt abstrakt erklæring af en række metoder. Således kan modtageren (Reciver.java) håndtere alle enheder som en instans af InputDevice og vi behøver kun at skelne mellem dem, når deres indstillinger skal sættes.
Opsamlingen af data udføres i Reciver.java.

Reciver.java

Denne klasse er den, som holder opsamler al data. I constructoren modtages indstillingerne for de serielle enheder og GPSNet enheder der skal modtages for. Ud fra indstillingerne dannes henholdsvist GPSNet og SerielDevice klasserne. Disse indsættes i et array, hvor de betragtes som InputDevice. Det vil sige, at man ikke efter programmet starter skelner mellem GPSNet enheder og serielle enheder.
Modtagelsen startes med start metoden og stoppes igen med stop metoden. start laver en tråd, som modtagelsen kører i. Tråden kører en løkke hvor alle enheder polles for nye beskeder. Alle tilgængelige beskeder læses og sendes videre til Serverklassen. Efter at alle enheder er blevet pollet bliver tråden sat til at "sove" (vente) i 20 millisekunder. Dette gøres, da den uendelige løkke ellers tager al tilgængelig processorkraft. De 20 millisekunder kan ændres til en anden tid med setSleepTime metoden. Hvis ventetiden er mindre end 1 bliver der ikke ventet.

InputDevice.java

Dette er en abstrakt klasse, som er brugt til at bygge de to modtagelsesenheder op over. Der er en række abstrakt definerede metoder: start og stop metoder. stopped, som returnerer sandt, hvis datamodtagelsen fra enheden er stoppet. ready, som angiver hvor mange beskeder der er klar og readMessage, som læser én hel besked, hvis der er nogen klar. Beskeden sendes som et integer array, hvor hvert ord er repræsenteret med én integer, som jo er på 32 bit og dermed stor nok til at holde et helt ord. Endelig er der metoden getDeviceId, som returnerer det brugervalgte enhedsnavn.
Der er implementeret en fælles modtagelsesmetode readLoop. Den modtager en InputStream som argument, som den læser fra. Metoden består af en løkke, som stoppes, når den booleske variabel go bliver sat til falsk eller når strømmen bliver tømt, hvilket markeres med at -1 en modtages. go styres med start og stop metoderne.
Til læsning er der to buffere. Den ene er en CRWBuffer indeholder de 6 bytes, som skal bruges til at lave et ord. De modtagne bytes bliver læst ind i denne buffer. Når der er modtaget 6 bytes læses de ind i den anden buffer, som er en WordBuffer. Denne sørger for at fjerne bytene fra CRWBufferen, så dette behøver løkken ikke at tage sig af.
Endeligt er implementeret metoder til at vise beskeder via en MessageHandler.

GPSNet

Denne klasse modtager data fra den Internet baserede NTRIP protokol GPSNet. For at modtage data, skal en forbindelse oprettes med en Socket. Dette gøres ud fra en given host (adressen på maskinen) og port. Man sender et tekstlogon til hosten. Logonet består af:

  • Ønsket GPS station
  • Angivelse af HTTP 1.1 format
  • Angivelse af "brugeragent", hvilket er navnet på programmet (vi kalder vores "NTRIP dGPSServer"
  • Brugernavn og kodeord adskilt af ":" og konverteret til base64 formatet.
Logonet sendes med en OutputStream, som er forbundet til hosten via Socket'en. Herefter modtages dataene ved at læse en InputStream.
Det første man modtager er en tekst header, som indeholder informationer om serveren. Vi modtager teksten som bytes, der hver især repræsenterer et ASCII tegn. For eksempel repræsenterer 65 tegnet A. Headeren består af flere linjer og har intet med RTCM dataene at gøre og afsluttes med et dobbelt linjeskift. Man kan vælge at læse headeren som RTCM data, da der med ekstremt lille sandsynlighed ville være noget, som kunne fejlfortolkes som RTCM data i headeren. Men da det er nemt at finde slutningen på den, har vi valgt at læse den, så den ikke bliver sendt igennem RTCM konverteringen.
Linjeskift markeres med ASCII tegnene "carrige return" () og "new line" (). Således består et linjeskift af to tegn.
Vi har lavet en lille tilstandsmaskine med 6 tilstande, hvor hver af tilstandene repræsenterer, at et af tegnene er læst. Den tilstand 0 repræsenterer, at headeren læses. Herfra skifter vi til tilstand 1, når et "carrige return" modtages. Vi ser bort fra "new line". Når næste "carrige return" modtages skiftes der fra tilstand 1 til 2. Fra tilstand 2 skiftes tilbage til tilstand 1 medmindre "new line modtages", i hvilket tilfælde der skiftes til tilstand 3 og så videre. Maskinen er afbilledet på følgende FIGUR REFERENCE.
Den første linje af headeren skal være "ICY 200 OK". Hvis det ikke er tilfældet er det en fejlkode man får, som eksempeltvist kan være "HTTP/1.1 401 Unauthorized", hvilket angiver at man har opgivet forkert kodeord og dermed ikke har adgang til servicen. Derfor gemmer vi headeren, så vi kan se, at den rigtige header er modtaget. Vi ser ikke på hvilken fejlkode man får, men går ud fra, at det er forkert kodeords fejlkoden. Hvis vi skulle læse hele fejlkodelinjen ville det kræve at vi oversætter de modtagne bytes til ASCI tegn og gemmer dem i det variabelt array. Dette har vi vurderet er unødvendigt. Vi læser således kun bytene ind i et array og undersøger om de har de rigtige talværdier. Hvis flere end 11 tegn (10 for teksten plus 1 for linjeskifttegnet) modtages, kan det ikke være den rigtige header og vi gør ikke mere med headeren.

Når den korrekte header er modtaget, kommer RTCM korrektionerne. De læses med readLoop metoden fra InputDevice. Her konverteres de til GPSWords, hvorefter den samlede data gemmen i Èn enkel integer. Herved er det en indbygget datatype, som skal læses af værtsklassen. GPSWord klassen kan igen konvertere integerværdien til bytes uden at udføre endnu et paritetstjekket

GPSNetSettings

Indeholder indstillinger til GPSNet enheden. Følgende indstillinger gemmes for hver enhed:
  • host - adressen på den computer, der udsender korrektionerne
  • port - den port man forbinder igennem (eks 9000)
  • gpsnet station - navnet på den station der modtages fra, eksempelvis TaarnbyDPGS
  • brugernavn
  • kodeord
  • enhedsnavn - det brugervalgte enhedsnavn, som bruges til at identificere enheden i databasen.
Da klassen kun er en opbevarelses klasse, er alle variable på nær kodeordet offentligt tilgængelige. Kodeordet og brugernavnet skal samles i én streng konverteret til base64 format. Derfor har vi en metode setPassword, som sætter kodeordet for enheden og konverterer det til base64 sammen med brugernavnet.
Vi har også lavet metoden saveSettings, som gemmer indstillingerne i en Properties klasse og den statiske metode loadSettings som henter indstillinger fra en Properties klasse. Af sikkerhedshensyn gemmes kodeordet ikke. I nuværende version understøtter kun, at man gemmer én standard indstilling til GPSNet. Så for nemheds skyld har vi lavet constructor metode, som laver en ny GPSNetSettings med samme indstillinger som en anden, der modtages som argument. Den vigtigste grund til, at vi har valgt at have en standardinstilling er, at indstillingerne kræves, når man skal hente en stationstabel, som beskrevet nedenfor.

En anden ting, som vi har bygget ind i GPSNet er muligheden for at finde de stationer, som serveren udbyder. En liste med alle tilgængelige stationer fås med metoden getStations.
Når man ikke angiver noget kilde i logonet, vil man modtage en stationstabel. Vi har ikke set en specifikation af hvordan tabellen, man henter, er opbygget, men har gættet os frem. Et eksempel på hvordan en stationstabel ser ud er vedlagt i som BILAG REFERENCE. I lighed med når der modtages data starter tabellen med en header, som sluttes med dobbelt linjeskift. Den første linje af headeren skal være "SOURCETABLE 200 OK". Efter headeren kommer der en række linjer med forskelligt indhold. En linje kan se således ud:
STR;TaarnbyDGPS;TaarnbyDGPS;RTCM 2.3;1(1), 23(11), 24(11);0;GPS;GPSnet.dk;DNK;55.62;12.65;0;0;GPSNet;none;B;Y;1500;
Denne linje angiver stationen TaarnbyDGPS to gange. Indholdet er adskilt af semikolon. Generelt start alle linjer, som angiver stationsnavne, med "STR". Indtil der er en angivelse af hvilket RTCM version, der bruges, er der efter "STR" angivelse af stationer. Versionen angives med "RTCM 2.X".
For at gøre det lettere at komme frem til en hel linje ad gangen læser vi linjerne med en BufferedReader. Ved at dele hver linje op i tokens med en StringTokenizer, kan man nemt læse indholdet. Først undersøges om den første token er "STR". Hvis det er tilfældet læses alle tokens ind i en liste, indtil man når en token, som starter med "RTCM".
Listen kommer til at indeholde alle de angivne stationer. Der undersøges ikke, om der er dobbelt angivelse af stationerne ligesom det er tilfældet i eksemplet ovenfor. Dette må sorteres andet steds.
TIL BILLAG + LINJESKIFT SOURCETABLE 200 OK Server: Trimble-iGate/1.0 Date: Sun, 08 May 2005 20:24:42 GMT Standard Time Content-Type: text/plain Content-Length: 3874 STR;TaarnbyDGPS;TaarnbyDGPS;RTCM 2.3;1(1), 23(11), 24(11);0;GPS;GPSnet.dk;DNK;55.62;12.65;0;0;GPSNet;none;B;Y;1500; STR;VestermarieDGPS;VestermarieDGPS;RTCM 2.1;3(13),9(1);0;GPS;GPSnet.dk;DNK;55.10;14.82;0;0;GPSNet;none;B;Y;1500; STR;VestermarieRTCM;VestermarieRTCM;RTCM 2.1;1(1),3(13),18(1),19(1);2;GPS;GPSnet.dk;DNK;55.10;14.82;0;0;GPSNet;none;B;Y;6000; STR;GPSnetDGPS;GPSnetDGPS;RTCM 2.3;1(1),23(11),24(11);0;GPS;GPSnet.dk;DNK;0.00;0.00;1;1;GPSNet;none;N;Y;1500; STR;GPSnetRTCM30;GPSnetRTCM30;RTCM 3.0;1(1),3(10),18(1),19(1);2;GPS;GPSnet.dk;DNK;0.00;0.00;1;1;GPSNet;none;B;Y;4000; STR;GPSnetRTCM;GPSnetRTCM;RTCM 2.1;1(1),3(13),18(1),19(1),59(9);2;GPS;GPSnet.dk;DNK;0.00;0.00;1;1;GPSNet;none;B;Y;6000; CAS;Makalu.GPSnet.dk;9000;GPSnet Danmark;Trimble Center Danmark;1;DNK;55.73;12.37;http://www.GPSnet.dk NET;GPSnet.dk;Trimble Center Danmark;B;Y;http://Everest.GPSnet.dk;http://www.GPSnet.dk/daekning_int.php;hgt@trimblecenter.dk; CAS;www.euref-ip.net;2101;EUREF-IP;BKG;0;DEU;50.12;8.69;http://igs.ifag.de/index_ntrip_cast.htm STR;FuglebjergDGPS;FuglebjergDGPS;RTCM 2.3;1(1), 23(11), 24(11);0;GPS;GPSnet.dk;DNK;55.30;11.54;0;0;GPSNet;none;B;Y;1500; STR;OdenseDGPS;OdenseDGPS;RTCM 2.3;1(1), 23(11), 24(11);0;GPS;GPSnet.dk;DNK;55.40;10.37;0;0;GPSNet;none;B;Y;1500; STR;EsbjergDGPS;EsbjergDGPS;RTCM 2.3;1(1), 23(11), 24(11);0;GPS;GPSnet.dk;DNK;55.46;8.43;0;0;GPSNet;none;B;Y;1500; STR;SkanderborgDGPS;SkanderborgDGPS;RTCM 2.3;1(1), 23(11), 24(11);0;GPS;GPSnet.dk;DNK;56.04;9.93;0;0;GPSNet;none;B;Y;1500; STR;SkiveDGPS;SkiveDGPS;RTCM 2.3;1(1), 23(11), 24(11);0;GPS;GPSnet.dk;DNK;56.56;9.04;0;0;GPSNet;none;B;Y;1500; STR;HalsDGPS;HalsDGPS;RTCM 2.3;1(1), 23(11), 24(11);0;GPS;GPSnet.dk;DNK;56.99;10.31;0;0;GPSNet;none;B;Y;1500; STR;HornbaekDGPS;HornbaekDGPS;RTCM 2.3;3(13), 23(11), 24(11);0;GPS;GPSnet.dk;DNK;56.08;12.45;0;0;GPSNet;none;B;Y;1500; STR;NykoebingDGPS;NykoebingDGPS;RTCM 2.3;3(13), 23(11), 24(11);0;GPS;GPSnet.dk;DNK;55.92;11.65;0;0;GPSNet;none;B;Y;1500; STR;RoesnaesDGPS;RoesnaesDGPS;RTCM 2.3;3(13), 23(11), 24(11);0;GPS;GPSnet.dk;DNK;55.72;10.95;0;0;GPSNet;none;B;Y;1500; STR;StegeDGPS;StegeDGPS;RTCM 2.3;3(13), 23(11), 24(11);0;GPS;GPSnet.dk;DNK;54.98;12.37;0;0;GPSNet;none;B;Y;1500; STR;GedserDGPS;GedserDGPS;RTCM 2.3;3(13), 23(11), 24(11);0;GPS;GPSnet.dk;DNK;54.55;11.98;0;0;GPSNet;none;B;Y;1500; STR;NakskovDGPS;NakskovDGPS;RTCM 2.3;3(13), 23(11), 24(11);0;GPS;GPSnet.dk;DNK;54.82;11.13;0;0;GPSNet;none;B;Y;1500; STR;KegnaesDGPS;KegnaesDGPS;RTCM 2.3;3(13), 23(11), 24(11);0;GPS;GPSnet.dk;DNK;54.85;9.93;0;0;GPSNet;none;B;Y;1500; STR;HoejerDGPS;HoejerDGPS;RTCM 2.3;3(13), 23(11), 24(11);0;GPS;GPSnet.dk;DNK;54.95;8.72;0;0;GPSNet;none;B;Y;1500; STR;KoldingDGPS;KoldingDGPS;RTCM 2.3;3(13), 23(11), 24(11);0;GPS;GPSnet.dk;DNK;55.48;9.42;0;0;GPSNet;none;B;Y;1500; STR;RingkoebingDGPS;RingkoebingDGPS;RTCM 2.3;3(13), 23(11), 24(11);0;GPS;GPSnet.dk;DNK;56.08;8.25;0;0;GPSNet;none;B;Y;1500; STR;LemvigDGPS;LemvigDGPS;RTCM 2.3;3(13), 23(11), 24(11);0;GPS;GPSnet.dk;USA;56.53;8.32;0;0;GPSNet;none;B;Y;1500; STR;BrandeDGPS;BrandeDGPS;RTCM 2.3;3(13), 23(11), 24(11);0;GPS;GPSnet.dk;DNK;55.95;9.10;0;0;GPSNet;none;B;Y;1500; STR;RandersDGPS;RandersDGPS;RTCM 2.3;3(13), 23(11), 24(11);0;GPS;GPSnet.dk;DNK;56.48;10.02;0;0;GPSNet;none;B;Y;1500; STR;GrenaaDGPS;GrenaaDGPS;RTCM 2.3;3(13), 23(11), 24(11);0;GPS;GPSnet.dk;USA;56.40;10.87;0;0;GPSNet;none;N;Y;1500; STR;HanstholmDGPS;HanstholmDGPS;RTCM 2.3;3(13), 23(11), 24(11);0;GPS;GPSnet.dk;DNK;57.10;8.63;0;0;GPSNet;none;B;Y;1500; STR;SuldrupDGPS;SuldrupDGPS;RTCM 2.3;3(13), 23(11), 24(11);0;GPS;GPSnet.dk;DNK;56.85;9.70;0;0;GPSNet;none;B;Y;1500; STR;LoekkenDGPS;LoekkenDGPS;RTCM 2.3;3(13), 23(11), 24(11);0;GPS;GPSnet.dk;USA;57.35;9.70;0;0;GPSNet;none;B;Y;1500; STR;SkagenDGPS;SkagenDGPS;RTCM 2.3;3(13), 23(11), 24(11);0;GPS;GPSnet.dk;DNK;57.70;10.58;0;0;GPSNet;none;B;Y;1500; ENDSOURCETABLE

GPSNetSettingsGUI.java

Dette er en GUI, hvor brugeren kan indtaste indstillingerne til en GPSNet forbindelse. Den består af en række labels med tilhørende editeringsfelt svarende til indstillingerne i GPSNetSettings samt en Ok- og Annullerknap. Når den bliver vist kan brugeren ændre indstillingerne.
Der er en enkelt editerbar ComboBox, som indeholder stationen, som skal modtages fra. Hvis brugeren har valgt det, bliver samtlige tilgængelige stationer hentet og lagt ind i denne. Dette gøres med addSource metoden, som kun indsætter stationer, der ikke allerede er i ComboBoxens liste. Vi bruger funktionen isInComboBox til at undersøge om den tilføjede station allerede er i listen. Metoden er omtalt under REFERENCE SERVER.JAVA.
Klassen holder en GPSNetSettings, som opdateres med brugerens valg. Hvis brugeren trykker Okknappen køres metoden updateSettings, som opdaterer indstillingerne til brugerens valg. Hvis der trykkes på Annuller køres metoden cancelSettings, som ændrer værdierne af editeringsfelter tilbage til deres oprindelige værdi.

Serielle enheder

SerielDevice.java

Denne klasse kan modtage data serielle (RS232C) enheder, som sender signalet i rå RTCM kodning. Vi har erfaret, at nogle serielle enheder koder signalet på anden vis. Disse understøttes ikke af vores program. Klassen implementerer InputDevice interfacet. Vi har modelleret vores enhed over Suns SimpleRead eksempel.
Som beskrevet i REFERENCE ANALYSE implementeres SerialPortEventListener, som giver besked hver gang der er ny data. For at starte modtagelsen må porten åbnes. Dette gøres ud fra en CommPortIdentifier. Når man har åbnet porten modtages en SerialPort, hvor man skal tilføje en SerialPortEventListener (denne klasse) og sætte indstillingerne. Herefter er klassen klar til at modtage data.
Når en event modtages undersøges det, om det er en "ny data" event. I så fald læses dataen med readLoop fra InputDevice.

SerielSettings.java

Denne klasse opbevarer indstillinger til en SerielDevice. Da porten skal gemmes, skal der bruges en SerielSettings per port der er tilsluttet computeren. Følgende instillinger gemmes:
  • deviceId - det brugervalgte enhedsnavn
  • BAUD - positivt heltal, som angiver portens hastighed. Er som standard sat til 9600
  • Databits - antal bits indeholdende data. Kan være 5,6,7 eller 8. Standard er 8.
  • Stopbits - kan være 1, 1.5 eller 2. Standard er 1.5
  • Parity - hvilken paritetsmetode, som bruges. Kan være 'None', 'Odd', 'Even', 'Mark' eller 'Space'. Standard er 'None'
  • portId - en CommPortIdentifier ud fra hvilken porten åbnes
  • brug enhed - boolesk værdi, som afgør om enheden skal bruges.
  • startText - eventuelt indledende opstartskommandoer, som skal sendes for at starte enheden
  • stopText - eventuelt indledende kommandoer, som skal sendes når enheden skal stoppes
Alle indstillinger er offentligt tilgængelige. Der er ligesom med GPSNetSetting metoder til at gemme og hente indstillinger. Hvis der mangler indstillinger vil standardindstillingerne blive brugt. Disse er valgt så de passer til DTUs Trimble GPS modtager.

SerielSettingsGUI

Dette er en GUI til at ændre indstillingerne for de serielle enheder. Den består af en række editeringsfelter med tilhørende labels svarende til indstillingerne i SerielSettings samt en Ok- og Annullerknap.
Da valget af indstillinger for Databits, Stopbits og Parity er begrænset er alle mulighederne læst ind i ComboBoxe. Dette gør det besværligt, at gemme indstillingerne, da man skal konverterer det valgte indeks i ComboBoxen til en konstant fra SerielPort. Dette gøres med en række casesætninger. Trykkes Ok gemmes indstillingerne med metoden updateParameters og trykkes Annuller genoprettes de tidligere valg med metoden cancelParameters. Det er en tilfældighed, at vi har valgt at kalde indstillingerne for parametre her og ikke settings, som i GPSNetSettingsGUI.


home