Blog (34)
Komentarze (536)
Recenzje (0)
@mktos"Mądrzejszy" termometr, część 2

"Mądrzejszy" termometr, część 2

28.01.2014 14:08

Ok, czyli w poprzednim odcinku połączyłem termometr cyfrowy DS18B20 z moim Raspberry Pi. Mam "wirtualny" plik, który zawiera między innymi odczyt temperatury z czujnika. Czas udostępnić tę informację światu.

Bez problemów można napisać skrypt, np. w PHP, który wyciągnie odpowiednią informację z pliku i wyświetli w postaci odpowiedzi na żądanie HTTP do jakiegoś serwera. Prosta forma tekstowa była by najwygodniejsza... przypominam jednak, że docelowo chciałbym zbudować aplikację dla Windows 8. Aby aktualizować "kafelek" aplikacji najwygodniej będzie generować specjalny plik XML. Skoro mamy dwie formy prezentacji danych to można dorzucić w sumie np. jeszcze JSON, do współpracy pomiędzy systemami.

No i warto też pomyśleć o obsłudze wielu czujników, a nie tylko jednego, prawda? No i wypada je jakoś nazywać, zamiast posługiwać się ich identyfikatorami.

Jak to zwykle bywa w projektach programistycznych, wymagania rosną. Zdecydowałem się zatem na napisanie prostego skryptu PHP, który odpowie na żądania do adresów postaci:

http://example.com/Temperature/<nazwa czujnika>.<format>

Tak naprawdę, to skrypt reaguje na adresy posiadające parametry przekazane metodą GET - sensor oraz format, a "ładna" forma adresu URI realizowana będzie przez magię mechanizmów mod_rewrite lub podobnych. No i tak naprawdę, to nie jest tak prosty na pierwszy rzut oka, ale działa poprawnie. Dwuplikowy skrypt (główny + konfiguracja) dostępny jest na moim GitHubie jako TemperatureRestService, na wolnej licencji MIT.

Aby go uruchomić, na moim Raspberry Pi mam serwer HTTP nginx wraz z PHP pracującym w trybie FastCGI (przez php‑fpm). Wszystko skonfigurowane zgodnie z opisem z wiki Arch Linuksa. Prosta (?) reguła rewrite zapewnia przekształcenie formatu pokazanego wyżej do czegoś w rodzaju index.php?sensor=&format=.


        location /TemperatureRestService {
            index index.php;

            if (!-e $request_filename)
            {
                rewrite ^/TemperatureRestService/([a-z0-9]*)\.?([a-z]*)$ /TemperatureRestService/index.php?sensor=$1&format=$2 last;
                break;
            }
        }

W ten sposób mam możliwość aby pod adresem mojego serwera dostać się np. do adresu http://leia.ktos.me/TemperatureRestService/main.txt aby dostać temperaturę w postaci prostego kawałka tekstu. Mechanizm domyślnie zwraca format czystego tekstu. W przypadku błędów - nieobsługiwanego formatu zwraca błąd HTTP 400. W przypadku nieznanego czujnika - błąd 404 i tak dalej, przez co można uznać, że jest to ogólnie zgodne z podejściem REST.

111886
111887

Jednym z formatów, który prezentuje moja aplikacja, jest "format" WNS - Windows Notification Service. Pliki XML zgodne z definicjami opisanymi na MSDN mogą być wykorzystane do aktualizowania "kafelków", powiadomień "toast" oraz "znaczników" aplikacji Windows 8. W następnej części mam nadzieję opisać jak wygląda moja aplikacja dla Windows 8 i w jaki sposób działa. Na razie testuję i jestem zachwycony, bo póki co działa poprawnie :‑)

500479

Obecnie pokazuje temperaturę z pojedynczego czujnika w pokoju obok.

Wybrane dla Ciebie
Komentarze (9)