PROJEKTY SOFT Monitorowanie Raspberry Pi poprzez komunikator internetowy

Raspberry Pi to świetna platforma do stworzenia np. systemu automatyki ma serca ani talentu (ani czasu) do opraco- domowej. Duża liczba gotowych modułów oraz liczne przykładowe aplika- wywania GUI, wykorzystanie komunikatora cje pozwalają niemal błyskawicznie zestawić dosyć złożony system nadzo- może być zbawieniem. rujący mieszkanie lub dom. Problem pojawia się dopiero na etapie tworze- Który komunikator wybrać? nia interfejsu użytkownika. Umieszczenie w nim wszystkich funkcji oraz Na wstępie warto zdecydować się na któryś wbudowanie mechanizmu powiadomień jest po prostu mocno czasochłon- z dostępnych komunikatorów internetowych. ne. Zamiast tego można swój bezinterfejsowy system wzbogacić o obsługę Wybór nie jest mały, ale jeśli skoncentrować komunikatora internetowego i sterować domem w sposób tekstowy. się na jego uniwersalności, niezawodności lub otwartości oraz dostępności narzędzi dla Raspberry Pi, można go szybko ograniczyć. Na wstępie należy przyznać – sterowanie Natomiast używanie komunikatora inter- Ostateczna decyzja zależy od tego, kto i za urządzeniami za pomocą komend teksto- netowego w aplikacji przemysłowej to po- pomocą jakiego urządzenia będzie łączył się wych to obecnie archaizm, który w komercyj- myłka (z zastrzeżeniem, o którym piszemy z Raspberry Pi. Dobrym wyborem wydaje się nych rozwiązaniach konsumenckich raczej później). Ale dla majsterkowicza, który zna użycie bardzo popularnej usługi WhatsApp, nigdy nie będzie miał już zastosowania. się na elektronice i programowaniu, ale nie które nie tylko dostępna jest prawie na całym

Tabela 1. Biblioteki XMPP dostępne w różnych językach Tabela 1. cd. programowania Nazwa Język programowania Nazwa Język programowania jabber.net # / .net / Mono agsXMPP SDK C# / .net / Mono jabber.py Python Aioxmpp Python JabberLib Tcl AnyEvent::XMPP Jabber Stream Objects (JSO) Java as3xmpp Flash / ActionScript JAXL PHP AXMPP Ada jQuery-XMPP-plugin JavaScript Babbler Java Jreen C++/Qt Blather Ruby JSJaC JavaScript cl- Lisp Libstrophe C Coversant SoapBox SDK Studio C# / .net / Mono / C++ Libpurple C/C++ dojox.xmpp JavaScript Lightr PHP Dxmpp C++ Loudmouth C Echomine Feridian Java C# / .net / Mono Eiffel PHP net::XMPP Perl Emite Java node-xmpp JavaScript Escalus Erlang Oajabber C++ Exmpp Erlang Pontarius XMPP Haskell Frabjous JavaScript Pyxmpp Python Gloox C++ pyxmpp2 Python Headstock Python QXmpp C++ Hsxmpp Haskell seesmic-as3-xmpp Flash / ActionScript Hxmpp haXe Sharp.Xmpp C# / .net / Mono Iksemel C Skates Ruby IP*Works Internet Toolkit ActiveX, C++, C#, SleekXMPP Python Iris C++ Slixmpp Python

ELEKTRONIKA PRAKTYCZNA 3/2017 47 PROJEKTY SOFT

Tabela 1. cd. Tabela 2. Serwery XMPP dla różnych systemów opera- cyjnych Nazwa Język programowania Nazwa Platforma (System operacyjny) Smack Java (Java SE 7 and Android) Apache Vysper Windows / stanza.io JavaScript Citadel Linux strophe.js JavaScript CommuniGate Pro Linux / Mac OS X / Windows StropheCappuccino Objective-J Coversant SoapBox Server Windows Swiften C++ Djabberd Linux Tinder Java Linux / Mac OS X / Solaris / Windows Txmpp C++ IceWarp Linux / Windows Twisted Words Python iChat Server Mac OS X Ubeity C# in.jabberd Linux Verse Lua Isode M-Link Linux / Solaris / Windows XIFF Flash / ActionScript Jabber XCP Linux / Solaris / Windows xmpp-psn Python jabberd 1.x Linux Java / Android / Google Web jaxmpp2 Toolkit jabberd 2.x Linux / *BSD / Solaris / Windows xmpp4js JavaScript Jerry Messenger Linux / Windows XMPP4R Ruby Kwickserver Windows xmpp4r-simple Ruby Metronome IM Linux / Mac OS X Xmppframework Objective C MongooseIM Linux / Mac OS X Xmpphp PHP Openfire Linux / Mac OS X / Solaris / Windows Xmpppy Python Oracle Communications IM Server Linux / Solaris / Windows XMPP-FTW JavaScript Prosody IM Linux / Mac OS X / Windows Z-XMPP JavaScript Psyced Linux / Mac OS X / Windows

świecie, ale także oprogramowanie klienc- w aplikacjach In- Siemens OpenScape Linux kie zostało przygotowane na różne systemy ternetu Rzeczy. Tigase Linux / Solaris / Mac OS X / Windows operacyjne, a nawet można z niego korzystać Biblioteki XMPP Vines Linux / Mac OS X przez przeglądarkę internetową. Zaletą jest są dostępne m.in. Wokkel Linux / Solaris / Mac OS X też szyfrowanie komunikacji w trybie „end- w Pythonie, Ja- -to-end”, co oznacza – jeśli wierzyć usługo- vaScripcie, C++, dawcy, że przesyłane wiadomości są czytelne PHP i w Javie, przy czym w wielu przy- python3-dateutil, a w przypadku chęci za- tylko dla nadawcy i adresata, a potencjalni padkach istnieje więcej niż jedno rozwią- pewnienia szyfrowania: protobuf, pycrypto włamywacze musieliby zastosować silne zanie dla danego języka (tabela 1). Wybór i python3-axolotl-curve25519. Jeśli biblioteka maszyny deszyfrujące lub niezłą socjotech- serwerów też jest bardzo duży (tabela 2), ma być obsługiwana z linii komend, należy nikę. Pewnym problemem jest natomiast to, nie mówiąc już o liście gotowych aplikacji też doinstalować argparse, readline i ew. pil- że WhatsApp wymaga aktywnego numeru te- klienckich (tabela 3). low, który pozwala przesyłać obrazy. lefonu do rejestracji urządzenia klienckiego Teoretycznie, po pobraniu obrazu pełnego oraz że jeden numer może być wykorzysty- WhatsApp przez Yowsup Raspbiana instalacja Yowsupa powinna być wany przez maksymalnie jedno urządzenie W niniejszym przykładzie pokażemy, jak naj- prosta. Powinno wystarczyć polecenie pip w danej chwili. To uproszczenie może spra- szybciej podłączyć Raspberry Pi do popular- install yowsup2, ale już w wypadku obrazu wiać pewne trudności, ale w obecnych cza- nego komunikatora, a więc do WhatsAppa. Raspbiana w wersji lite, programu python- sach całkiem łatwo jest choćby na chwilę W dalszej części artykułu pokażemy, jak sko- -pip nie ma domyślnie zainstalowanego. zdobyć numer telefonu, za pomocą którego rzystać z czystego XMPP. Można go doinstalować poleceniem sudo można zarejestrować się w WhatsApp. By obsłużyć WhatsApp, użyjemy otwar- apt-get install python-pip lub gdy chcemy Alternatywnym sposobem będzie użycie tej biblioteki Yowsup w wersji 2.5.0, której korzystać z Pythona 3 (u nas dopiero tak własnego (lub gotowego, bezpłatnego) ser- szczegóły można poznać na GitHubie, pod działało) sudo apt-get install python3-pip. wera XMPP, a więc standardu bazującego adresem https://github.com/tgalal/yowsup. Wraz z programem python-pip doinstaluje na dawniej popularnym Jabberze. Aktualnie Biblioteka Yowsup została napisana w Py- się szereg narzędzi dla Pythona, które też XMPP też wspiera szyfrowanie, a możliwość thonie – i jak chwalą się jej autorzy – po- mogą się przydać. postawienia własnego serwera sprawia, że da służyła m.in. do utworzenia nieoficjalnej Ponadto instalator programu Yowsup2 się w pełni panować nad stanem komunika- aplikacji klienckiej Wazapp na telefon No- kończy działanie poleceniem setup.py in- cji. Co więcej, XMPP jest otwartym standar- kia N9 a także na system operacyjny Black- stall, które wymaga uprawnień roota, by móc dem, opartym na XML-u i sformalizowanym berry 10. Yowsup teoretycznie wymaga Py- zmodyfikować wszystkie potrzebne pliki. przez organizację Internet Engineering Task thona 2.6 lub 3.0 albo ich nowszych wersji, Stąd instalację najlepiej wywołać za pomocą Force. Lata doświadczeń dużych firm spra- przy czym w trakcie naszych testów okazało sudo pip3 install yowsup2. Gdyby instalacja wiły, że XMPP uważa się za sprawdzony się, że działa dopiero z Pythonem 3. Ponadto, nie powiodła się z jakiegoś powodu, można protokół, który można wykorzystać w prze- konieczne jest zainstalowanie dodatko- pobrać źródła programu yowsup i samodziel- myśle i świetnie nadaje się on do zastosowań wych pakietów. Będzie to przede wszystkim nie go skompilować. W tym celu należy:

48 ELEKTRONIKA PRAKTYCZNA 3/2017 Monitorowanie Raspberry Pi poprzez komunikator internetowy

Tabela 3. Aplikacje klienckie XMPP dla różnych syste- Tabela 3. cd. mów operacyjnych Nazwa Platforma (System operacyjny) Nazwa Platforma (System operacyjny) Linux OSX Mcabber Console / Text-Mode Apple OSX Miranda IM Windows AQQ Windows Miranda NG (Android, iOS) / Linux / OSX / AstraChat Windows Monal IM Mobile (iOS) Beem Mobile (Android) Movim Przeglądarka BitlBee Linux Linux / OSX / Windows Mobile (Android, Blackberry (BBOS), OneTeam for iPhone Mobile (iOS) BlueJabb Nokia S40/ i Asha) OneTeam Linux / OSX / Windows Boogie Chat Mobile (iOS) Linux / OSX / Windows Buddycloud Mobile / Web / Console Poezio Console / Text-Mode Candy Przeglądarka Profanity Console / Text-Mode ChatSecure Mobile (Android, iOS) Psi+ Linux / OSX / Windows Linux / OSX / Windows Psi Linux / OSX / Windows Conversations Mobile (Android) Windows Converse.js Przeglądarka qutIM Linux / OSX / Windows Coversant SoapBox Linux / Console / Text-Mode / Communicator Windows Salut à Toi Przeglądarka eM Client Windows Sim-IM Linux Linux Spark Linux / OSX / Windows Console / Text-Mode SparkWeb Przeglądarka Linux / Windows Swift Linux / OSX / Windows GNU Freetalk Console / Text-Mode Talkonaut Mobile GreenJab IBM i Tigase Messenger Przeglądarka IM+ Mobile Tigase Minichat Przeglądarka Instantbird Linux / OSX / Windows Linux / OSX / Windows -xmpp Console / Text-Mode Windows/ OSX / Mobile / Przeglądarka jabber.el Linux V&V Messenger Windows Jabbim Linux / OSX / Windows Vayusphere Mobile (BlackBerry) JAJC Windows VSTalk Windows Jappix Przeglądarka WTW Windows Linux / OSX / Windows Xabber Mobile (Android) JSXC Przeglądarka xmpp-client Linux / OSX JWChat Przeglądarka Xmppchat Przeglądarka Kadu Linux / OSX / Windows XMPPWebChat Przeglądarka Kaiwa Przeglądarka Yaxim Mobile (Android)

• utworzyć podkatalog na program sudo apt-get install -dev kraju, parametr mcc to tzw. Mobile Country yowsup, wejść do niego a następnie po- a następnie zaktualizować bibliotekę six, Code – numer identyfikujący kraj pod kątem brać spakowane źródła z githuba wget ht- która odpowiada za konwersję pomiędzy py- sieci komórkowych. Potrzebny jest też para- tps://.com/tgalal/yowsup/archive/ thonem 3 a starszym sudo pip3 install six – metr mnc, który identyfikuje konkretną sieć master.zip, upgrade. Wtedy można w końcu rozpocząć komórkową w ramach danego kraju. Listę • rozpakować je unzip master.zip, kompilację, która powinna przebiec już bez kodów MMC można znaleźć pod adresem • przejść do powstałego katalogu yowsup. błędów, wywołując sudo python3 setup.py https://goo.gl/XIqumG, a polskich MNC (Mo- W naszym wypadku kompilacja była moż- install w katalogu z programem. Następnie bile Network Code) na stronie https://goo.gl/ liwa po pobraniu dodatkowych bibliotek oraz należy przeprowadzić autoryzację numeru Oc3Duy. Kompletne tabele kodów państw aktualizacji jednej z bibliotek programu telefonu podłączonego do sieci Whats- i sieci oraz stan tych sieci można znaleźć pod pip. Konkretnie należało doinstalować pa- Appa. W tym celu należy wywołać polece- adresem https://goo.gl/17qUqc. Pomyślna re- kiety poleceniami: nie yowsup-cli registration –requestcode jestracja powinna zakończyć się potwierdze- sudo apt-get install python3-dateutil sms –phone 48123456789 –cc 48 –mcc 260 niem („status: ok”), a ustawienia powinny sudo apt-get install python3-setuptools –mnc 98, przy czym liczbę przy opcji phone zostać zapisane w pliku konfiguracyjnym. sudo apt-get install python3-dev należy zamienić na posiadany numer tele- Jeśli wszystko jest OK, wysłanie wiado- sudo apt-get install libevent-dev fonu, parametr cc określa numer kierunkowy mości whatsAppowej z Raspberry Pi będzie

ELEKTRONIKA PRAKTYCZNA 3/2017 49 PROJEKTY SOFT wymagało już tylko wydania polecenia yowsup-cli demos -s 48987654321 „To jest tresc wiadomosci”, gdzie pierwszy parametr to numer telefonu adresata, a drugi to oczy- wiście treść nadawanej wiadomości. Wysyłanie wiadomości można zauto- matyzować, wbudowując w skrypty ob- sługujące elementy automatyki domowej odpowiednie procedury, które samodziel- nie będą wywoływać komendę yowsup-cli z adekwatnymi parametrami. Można w ten sposób np. informować o przekroczeniu po- żądanej temperatury na wybranym czujniku czy np. o wykryciu zdarzenia otwarcia drzwi do mieszkania. Rysunek 1. Rejestracja w serwisie jabbim.pl Rysunek 3. Dodanie nowego kontaktu do listy XMPP na darmowym serwerze WhatsApp jest usługą, którą kontroluje jedna konkretna firma i może zajść sytuacja, że zmieni coś w działaniu swojego serwisu, powodując, że istniejąca aplikacja przestanie działać. W przypadku skorzystania z XMPP unikamy tego problemu, szczególnie jeśli sami postawimy serwer XMPP. Na potrzeby tego przykładu, by skrócić ar- tykuł, skorzystamy jednak z gotowego, dar- mowego serwera XMPP. Wybór tego typu usług jest bardzo duży – można je znaleźć spisane pod adresem https://goo.gl/GYtZVa, gdzie aktualnie zabrano 150 pozycji. Każdy Rysunek 2. Webowy klient XMPP – jwchat.org Rysunek 4. Lista kontaktów z serwerów na liście ma podaną datę utworze- nia, kraj, w którym się znajduje, organizację, a następnie, po spacji, hasło. Po zapisaniu konieczności pisania dodatkowych progra- która wydała mu certyfikat bezpieczeństwa, pliku należy zmienić dla niego uprawnienia. mów, przesyłać dosyć duo informacji przez wykorzystywane oprogramowanie (dominuje Inaczej program nie będzie działać chmod komunikator. Przykładowo w komendzie Prosody i ejabberd) wraz z datą aktualiza- 600 ~/.sendxmpprc. echo można wyświetlić wynik dowolnego cji oraz ocenę klasy bezpieczeństwa. W Pol- Teoretycznie już teraz można korzystać polecenia systemowego. Jeśli chcemy prze- sce dostępnych jest kilka serwerów, z czego z usługi, ale warto chwilę poczekać – z na- słać z Raspberry Pi aktualną datę, możemy nie wszystkie mają dobre oceny bezpieczeń- szych doświadczeń wynika, że serwer Jab- użyć polecenia echo „Jest już ” $(date) | sen- stwa. My skorzystaliśmy z serwisu jabster. bim.pl potrzebuje kilku minut, zanim dxmpp -t [email protected]. Efekt widać na ry- pl, który jak się okazało, wskazuje aktualnie „zorientuje się”, że ma nowego użytkow- sunku 5. To otwiera wiele możliwości. Jeśli na serwery jabbim.pl. nika. Samo wysłanie wiadomości wymaga np. mamy do Raspberry Pi dołączony czujnik Rejestracja w serwisie jabbim.pl jest bar- przekazania na wejście programu sendxmpp temperatury, z którego wskazanie pobieramy dzo łatwa. Wystarczy podać pożądany login przesyłanej treści oraz wskazania nazwy ad- poleceniem ~/temp, to wywołując echo „Ak- i hasło oraz potwierdzić, że nie jest się ro- resata. Przykładowo w ten sposób echo „To tualna temperatura w domu to: ” $(~/temp) botem (rysunek 1). Chwilę później pojawia jest wiadomość z Raspberry Pi” | sendxmpp | sendxmpp -t [email protected], prześlemy ją się ekran potwierdzenia. Jeśli wcześniej nie -t [email protected]. Jeśli na razie nie chcemy do naszego klienta. korzystało się z żadnego konta XMPP, warto instalować żadnego specjalnego komuni- Raspberry Pi ma domyślnie wbudowany stworzyć sobie od razu drugie, na którym katora, albo użyć dotychczasowych kont sensor temperatury, którego wskazanie będziemy odbierać wiadomości z Raspberry na potrzeby testów, możemy użyć darmo- można zdobyć poleceniem /opt/vc/bin/vc- Pi. My do komunikacji z serwerem Jabstera wego, webowego klienta XMPP – np. jwchat. gencmd measure_temp i już teraz można będziemy używać gotowego, perlowego opro- org (rysunek 2). Wystarczy wejść przeglą- je wykorzystać, bez żadnych dodatkowych gramowania, dostępnego w repozytoriach darką na stronę jwchat.org i zalogować się czujników, ale trzeba mieć na uwadze, Raspberry Pi – programu sendxmpp. Można za pomocą danych podanych w jabbimie. że będzie to wartość temperatury procesora, go zainstalować wraz ze wszystkimi potrzeb- My zalogowaliśmy się za pomocą drugiego a nie otoczenia. nymi zależnościami za pomocą polecenia z utworzonych kont. sudo apt-get install sendxmpp. Następnie warto dodać nowy kontakt do li- Regularnie lub w razie potrzeby Obsługa programu sendxmpp również sty, tj. wysłać zaproszenie do konta użytego Raspberry Pi może wysyłać informacje re- jest łatwa. Najpierw należy stworzyć plik w Raspberry Pi (rysunek 3). Nie ma potrzeby gularnie, co określony czas, albo np. tylko z danymi konfiguracyjnymi, a więc z na- potwierdzać przyjęcia zaproszenia, jeśli nie w razie potrzeby, gdy wystąpi określone zwą konta i hasłem. Plik ten powinien się zależy nam na dzieleniu się statusami wiado- zdarzenie. W tym drugim przypadku wy- nazywać .sendxmpprc i być dostępny tylko mości. Mając już kontakt na liście (rysunek 4), starczy po prostu napisać stosowny pro- dla właściciela. Tworzymy go poleceniem możemy natomiast otworzyć czat do niego gram i umieścić w nim w odpowiednim nano ~/.sendxmpprc, a w jego „wnętrzu” i rozmawiać z naszym minikomputerem. miejscu wywołanie polecenia systemo- wpisujemy w jednej linijce, najpierw nazwę Powłoka bash z Raspbiana pozwala na tak wego echo z określonymi parametrami. konta, z którego ma korzystać Raspberry Pi, wiele, że możemy już za samą jej pomocą, bez Natomiast, jeśli chcemy regularnie

50 ELEKTRONIKA PRAKTYCZNA 3/2017 Monitorowanie Raspberry Pi poprzez komunikator internetowy

Listing 1. Kod skryptu przesyłającego ostrzeżenie o zbyt wysokiej temperaturze #!/bin/bash #pobieranie temperatury procesora i wycinanie z niej jedynie wartości liczbowej, po czym przypisywanie jej do zmiennej temp temp=$(/opt/vc/bin/vcgencmd measure_temp | cut -c6-7) #sprawdzanie czy temperatura przekracza 45 stopni Celsjusza if [ „$temp” -gt 45 ]; then #przesyłanie ostrzeżenia przez XMPP echo Procesor RPi ma zbyt wysoką temperaturę: $(/opt/vc/bin/vcgencmd measure_ temp) | sendxmpp -t [email protected] fi

Struktura pliku crontab składa się z linii, musimy w kolumnie minut wpisać 0. Możemy w których kolejno podawane są minuty, go- też zażądać, by wykonywała się co 5 minut dziny, dni miesiąca, miesiące i dni tygodnia – wtedy w kolumnie minut wpisujemy */5. oraz komendy do wywołania. Poszczególne W ramach komend wskazywanych w ta- wartości są od siebie oddzielane tabulatorami blicy crontab można podawać nazwy skryp- lub spacjami. Program crond po uruchomie- tów, które mogą zawierać szereg poleceń niu wczytuje tablicę konfiguracyjną do pa- oraz zdarzenia warunkowe. W ten sposób mięci i następnie co minutę sprawdza, które możemy np. co 5 minut sprawdzać tempe- z wierszy należy w danej chwili wykonać. raturę, ale powiadamiać użytkownika tylko Wpisanie liczby na pozycji odpowiadającej o jej przekroczeniu. Wtedy w crontabie wpi- np. godzinie będzie oznaczało, że komenda sujemy linijkę */5 * * * * ~/temp.sh, a w ka- z tej linii ma się wykonać tylko, gdy aktu- talogu domowym użytkownika tworzymy Rysunek 5. Efekt działania polecenia alna godzina odpowiada wpisanej wartości. skrypt temp.sh, taki jak na listingu 1. „echo” Należy jednak pamiętać, że by komenda była wykonana, muszą być spełnione wszystkie Podsumowanie przekazywać jakieś dane, warto skorzy- warunki w linii, czyli jeśli chcemy, by akcja Zaprezentowany sposób to jeden z najszyb- stać z programu crond, który domyślnie była uruchamiana w poniedziałki o godzinie szych, by utrzymywać powiadomienia ko- dostępny jest w większości, jak nie wszyst- 15, musimy w drugiej kolumnie wpisać 15, munikatorem z Raspberry Pi. Dalej program kich linuksach. a w piątej 1. W pozostałe kolumny powinni- można rozbudować o przyjmowanie zdalnych Program crond działa w oparciu o plik śmy wpisać * (gwiazdki), jeśli minuty, dni poleceń, wykorzystanie własnego serwera oraz konfiguracyjny, tzw. crontab. W Raspberry i miesiące nie mają dla nas znaczenia. Trzeba o wykorzystanie eksperymentalnego protokołu Pi można go utworzyć lub edytować za po- jednak zauważyć, że pozostawienie gwiazdki XMPP-IoT, który jest opracowywany pod kątem mocą polecenia crontab -e. Przy pierwszym w polu minut sprawi, że komenda zostanie Internetu Rzeczy. Ma on rozwiązywać m.in. uruchomieniu system zapyta o edytor tek- wykonana w każdy poniedziałek łącznie problem akceptowania zaproszeń do listy zna- stu, którego chcemy użyć do zmiany 60 razy – od 15:00 do 15:59, co minutę. Jeśli jomych przez komunikujące się ze sobą rzeczy. pliku konfiguracyjnego. komenda ma być wykonywana tylko o 15:00, Marcin Karbowniczek, EP

REKLAMA

w prezencie na każdą okazję

https://goo.gl/TiDLmR

ELEKTRONIKA PRAKTYCZNA 3/2017 51