Bevezetés
Biztosan mindenki látott már időjárásjelentés-alkalmazást, amely mutatja az aznapi időjárást, azaz a hőmérsékletet, hőérzetet, szélerősséget stb. A mai bejegyzés során egy ilyet fogunk elkészíteni a Weather Sensor segítségével.
Időjárás-érzékelő
Még anno a szenzorokkal foglalkozó bejegyzésben említés szintjén szóba került, hogy az Osp::Uix névtér érzékelőkkel kapcsolatos részében találunk egy nem oda illő dolgot, az időjárás-szenzort (Weather Sensor). Az osztály a megadott tartózkodási címhez megfelelő adatokat kéri le. Két típusú eredményünk lehet: lekérhetjük a pillanatnyi időjárási adatokat (RequestCurrentWeather) és a 7 napos előrejezlést is (RequestWeatherForecast).
Az időjárási adatok igen sokrétűek, ráadásul eltérő típusokat kapunk pillanatnyi időjárás és előrejelzés esetén. Pillanatnyi időjárásnál a választék:
- hőmérsékletet (valós, hőérzet és harmatpont, Celsiusban megadva),
- légnyomást millibarban,
- szélsebességet (km/h) és szélirányt (fok),
- páratartalmat (százalékban)
- és időjárás-kondíciót (szeles, napos, felhős stb).
Előrejelzés lekérdezése esetén egy kicsit szűkösebb a lista:
- dátum
- időjárás-kondíció
- legmagasabb hőmérséklet
- legalacsonyabb hőmérséklet
A háttérben egy webservice-híváson keresztül kapjuk meg a kért adatokat, amelyek a WeatherBug szerveréről érkeznek, az alábbi ábra szemléletesen bemutatja, mi is történik.
Hogyan néz ki ez kód-szinten?
A szolgáltatás használatához először is implementálnunk kell a megfelelő interfészt, az Osp::Uix::IWeatherEventListener-t, amely két függvénycsonk megírását vonja maga után, ezek az OnCurrentWeatherReceived és az OnWeatherForecastReceived. Az első felel a pillanatnyi időjárásjelentésért, a második pedig az előrejelzésért. Előbbi egy Osp::Uix::CurrentWeather példányt ad vissza, melyből getter függvényekkel kérdezhetjük le a fentebb említett tulajdonságokat. A második egy hét elemű listával tér vissza, amely hét darab Osp::Uix::WeatherForecast példányt tartalmaz, a fentieknek megfelelő tagváltozókkal.
A klasszikus szenzorokkal ellentétben az érzékelés itt nem folyamatos, lévén egy webservice-t kell meghívni a kívánt eredményhez. Ezt egy Osp::Uix::WeatherSensor-on keresztül tehetjük meg, melynek két, erre vonatkozó függvénye van. A RequestCurrentWeather() a pillanatnyi időjárást kérdezi le, ekkor az állapotgép az OnCurrentWeatherReceived() ágba ugrik, a RequestWeatherForecast() segítségével pedig előrejelzést kérhetünk, ami az OnWeatherForecastReceived() metódusba dob minket.
Mindkét függvény használatakor valahogy a programunk tudtára kell adnunk, mely földrajzi helyről szeretnénk adatokat lekérdezni. Ezt megtehetjük szélességi és hosszúsági koordináták megadásával (ekkor két float típust vár bemenőként), vagy egy stringként megadott városnévvel. Utóbbival persze összeakadhat a dolog két ugyanolyan nevű város esetén, nekem például a Budapest szóra hazánk fővárosát adta ki, nem pedig az ugyanilyen névre hallgató amerikai városkát.
A példaprogram ismét előrhető a Mobilarénás SVN-ből, az app az IdojarasJelentes névre hallgat.
dr. Kind