Technipelago AB

Technipelago Blog Stuff that we learned...


Varför göra något enkelt när man kan krångla till det?

Publicerad den 20 jun 2008

Jag utvecklade ett program som läser data från min väderstation och publicerar statistiken på nätet. Så här gick det till.

Jag behövde en dedicerad file/subversion-server så jag köpte en liten server från Dell och placerade i serverrummet. Men även en liten server producerar värme och den här servern var den som fick bägaren (termometern) att rinna över. Det blev för hett och jag insåg att utan åtgärd så skulle något tråkigt inträffa.

Vad göra? Det fanns två huvudalternativ som jag såg det:

  1. Uppgradera kylanläggningen
  2. Göra sig av med en gammal energislukande server

Jag valde alternativ 2 och den gamla Windowsservern med dubbla Xeonprocessorer och 3 st SCSI-diskar (varav 2 st i en RAID0 array) hamnade på dödslistan. Det skulle utrota Microsoftoperativen från datorrummet helt och hållet, vilket inte gjorde mig det minsta olycklig.

Men den servern hade ju den ärofyllda uppgiften att ladda upp data från väderstationen till Internet var 10:e minut. Och av någon anledning så dög inte de väderstationsprogram för Linux som jag hittade på nätet. Hmmm…. Vad gör man då? Jo man skriver ett eget program så klart! Och enligt mina efterforskningar så fanns det inte många väderstationsprogram skrivna i Java så det fick bli mitt val. Man vill ju inte göra som alla andra.

Först av allt var jag tvungen att skriva en emulator som emulerade väderstationen. Jag ville ju inte utveckla och testa direkt mot den riktiga stationen för då fanns ju risken att jag skulle förlora data, och ingen information skulle laddas upp till Internet under tiden. Och det här kunde ju ta några veckor. Jag vill inte riskera några hack i kurvan på temperatur.nu.

Emulatorn var riktigt rolig att utveckla. Med dokumentationen från Davis så gick det som en dans. Därefter kunde jag ge mig på seriekommunikationen och här var jag också tvungen att emulera för jag ville fortfarande inte dra ur sladden ur väderstationen och börja hacka loss. Jag skrev en egen implementation av Java Communications API som istället för att öppna en serieport på datorn, öppnade en TCP/IP förbindelse till emulatorn. Så här långt var det fortfarande frid och fröjd allt såg ut att fungera galant. Nu kunde jag ge mig på den delen som laddade ner data och lagrade den i en MySQL databas. Hej och hå inga problem här heller. Och slutligen utvecklade jag diagramgenerering med JFreeChart, generering av HTML-sidor med FreeMarker och uppladdning på hemsidan med Apache Commons Net.

Nu fungerade hela kedjan från nedladdning och lagring av data till visualisering på webben. Äntligen dags att dra ur seriekabeln ur Windowsservern och koppla in väderstationen på Linuxservern istället.

Det var nu problemen började…

För att kommunicera med serieporten (RS-232) så valde jag Suns Java Communications API. Sun har implementationer för följande plattformar:

  • Solaris SPARC
  • Solaris x86
  • Linux x86

Det fanns en windowsimplementation tidigare, men den har man tagit bort från hemsidan av någon anledning. Det finns en open source variant också som heter RXTX men jag ville först testa den officiella implementationen från Sun.

Jag bytte ut min egen javax.comm implementation mot Suns och kopplade in väderstationen till Linuxservern. Men det gick inte lika smärtfritt som med emulatorn. Först spökade devicedrivern för /dev/ttyS0 som konverterade tecken både på in och utvägen. Dessutom var hårdvaruhandskakning inte aktiverat så jag tappade tecken. Men efter att alla I/O parametrar satts rätt (med stty kommandot) så började också rätt tecken komma från väderstationen. Men sedan visade sig den sida av javax.comm som många andra ha beskrivit på nätet. Det är inte den populäraste och stabilaste implementationen från Sun. Under ett dygn så fick jag omkring 10 st JVM krascher (Segmentation Violation). Jag fick bygga stöd för omstart av serieservern när den kraschade. Jag körde så en dryg vecka men sedan bestämde jag mig för att köpa en dedicerad hårdvarulösning för TCP/IP <-> RS232 konverteringen. Jag beställde en IP-port (se referenser). Men innan den hann komma så testade jag den open source implementation som är nästan helt kompatibel med javax.comm. Man byter bara ut alla ”import javax.comm” till ”import gnu.io”. Det vara bara några rader i en källkodsfil så det var inga problem.

Plötsligt fungerade allt som förväntat! Serieservern har inte kraschat på flera dagar. Dessutom så har RXTX stöd för både amd64 och Windows vilket Suns implementation inte har stöd för.

Innan jag påbörjade projektet så läste jag alla positiva kommentarer om RXTX, men jag vill alltid prova den officiella och standardiserade varianten först. Därför valde jag Suns Java Communications API. Jag ångrar inte att jag gjorde det. Det gav nyttiga erfarenheter. Det var ett hobbyprojekt så jag hade tid att testa och strula. Men i ett tids- och kostnads-kritiskt projekt så har man inte tid med såna här experiment.

Så mina råd till dig som ska kommunicera seriellt över RS232 från Java är:

  1. Ladda ner RXTX från http://www.rxtx.org/
  2. Se till att serieportens inställningar är korrekta. I mitt fall fungerade följande bra:

    stty -F /dev/ttyS0 9600 sane clocal crtscts -hupcl -icrnl -opost -onlcr

Jag kunde ha undvikt allt det här om jag hade låtit bli att röra Windowsservern och istället åkt till Jula och köpt en stor fläkt. Men vilka erfarenheter hade det gett mig? :-)

Referenser

Tags: java weather


« Tillbaka