Stacja monitorująca na bazie Raspberry Pi

Cele

Celem projektu jest zastosowanie mini komputera Raspberry Pi z zainstalowanym systemem operacyjnym Linux Soft-float Debian “wheezy” do monitoringu wizualnego oraz pomiaru temperatury. Dostęp do obrazu z kamery i odczyt z czujników realizowany jest za pośrednictwem przeglądarki internetowej. Bezprzewodowe połączenie stacji z siecią internet nawiązane jest poprzez darmowy punkt HotSpot jednego z lokalnych dostawców.

Rys. Moduły i urządzenia systemu.

 

SAMSUNG DIGIMAX A403

Rys. Moduł TTMSB i Raspberry Pi w trakcie testów

1. Aplikacja serwera

Aplikacja serwera zapewnia wyświetlenie w przeglądarce internetowej graficznego interfejsu oraz prezentację danych podłączonemu użytkownikowi. Serwer został napisany w języku Python. Do jego działania wymagane jest zainstalowanie kilku bibliotek (zostaną sukcesywnie omówione w rozdziałach 1.1 i 1.2) przez wydanie polecenia:

sudo apt-get install python-imaging python-opencv python-serial python-daemon

Folder i pliki aplikacji umieszczono w folderze domowym użytkownika (pi):

/home/pi/videowindpi

Aplikacja serwera zostaje uruchomiona przy starcie systemu za sprawą odpowiedniego polecenia w pliku /etc/crontab.

Dzięki bibliotece python-daemon program może pracować jako daemon (w tle). Aplikację uruchomia się poleceniem:

sudo python /home/pi/videowind/server.py start

natomiast wyłącza:

sudo python /home/pi/videowind/server.py stop

Z uwagi na to, że do serwera w jednej chwili podłączony będzie jeden klient nie został on napisany wielowątkowo (nie umożliwia realizacji kilku połączeń na raz).  Za sprawą takiego rozwiązania w prymitywny sposób został zlikwidowany ewentualny konflikt przy obsłudze urządzeń peryferyjnych z uwagi na konkurowanie w dostępie do nich przez kilka wątków.

1.1. Transmisja wideo

Obraz wideo z podłączonej kamery do Raspberry Pi obserwowany jest przez użytkownika w przeglądarce internetowej.

Rys. Prezentacja obrazu z kamery w przeglądarce internetowej podłączonemu użytkownikowi.

Format strumienia obrazu to MJPEG (ruchomy jpeg), wszystkie popularne przeglądarki internetowe bezproblemowo obsługują ten typ. Problematycznym natomiast okazało się odtworzenie obrazu na telewizorach SmartTV gdyż nie wszystkie poprawnie rozpoznają ten format.

Obsługą kamery i obróbką obrazu zajmuje się biblioteka python-opencv za pomocą której obraz uzyskiwany jest w następujący sposób:

capture = cv.CaptureFromCAM(-1)
cv.SetCaptureProperty( capture, cv.CV_CAP_PROP_FPS, FPS)
cv.SetCaptureProperty( capture, cv.CV_CAP_PROP_FRAME_WIDTH, FRAME_WIDTH )
cv.SetCaptureProperty( capture, cv.CV_CAP_PROP_FRAME_HEIGHT, FRAME_HEIGHT )

Linie kodu z konfiguracją FPS (klatek na sekundę pobieranych z kamery) i wielkości obrazu (FRAME_WIDTH, FRAME_HEIGHT) nie muszą być obecne, jednak w tym przypadku nie było potrzeby by kamera pracowała w maksymalnej rozdzielczości i został on przeskalowany.

Obraz MJPEG konstruowany jest w następujący sposób:

self.send_response(200)
self.wfile.write(“Content-Type: multipart/x-mixed-replace; boundary=–aaboundary”)
self.wfile.write(“\r\n\r\n”)
while 1:
try:
img = cv.QueryFrame(capture)
cv2mat=cv.EncodeImage(“.jpeg”,img,(cv.CV_IMWRITE_JPEG_QUALITY,JPEG_QUALITY))
JpegData=cv2mat.tostring()
self.wfile.write(“–aaboundary\r\n”)
self.wfile.write(“Content-Type: image/jpeg\r\n”)
self.wfile.write(“Content-length: “+str(len(JpegData))+”\r\n\r\n” )
self.wfile.write(JpegData)
self.wfile.write(“\r\n\r\n\r\n”)
time.sleep(PACKET_DELAY)
except:
break
return

Na szczególną uwagę w kodzie należy zwrócić na zmienną PACKET_DELAY, która odpowiedzialna jest za czas który odpowiada liczbie klatek obrazu wyświetlanego użytkownikowi w przeglądarce internetowej. Zmienna JPEG_QUALITY to liczba całkowita z przedziału od 0 do 100, oznacza procentową jakość obrazu (a co za tym idzie jego wielkość w bajtach). Należy te wartości określić zależnie od potrzeb i możliwości łącza internetowego, jak i samego sprzętu.

1.2. Odczyt temperatury

Odczyt temperatury dokonywany jest cyklicznie z określonym interwałem czasowym poprzez oddzielny wątek uruchomiony przez aplikację serwera. Wyniki są zapisywane wraz z czasem pomiaru do bazy danych (sqlite) i prezentowane użytkownikowi na żądanie poprzez przeglądarkę internetową.

Rys. Prezentacja pomiarów temperatury w przeglądarce internetowej.

Obsługę i komunikację (i2c) z układem LM75 (termometr cyfrowy) zapewnia opracowany układ TTMSB podłączony do portu UART Raspberry Pi. Mikrokontroler układu TTMSB po otrzymaniu polecenia odczytu temperatury (z aplikacji serwera) komunikuje się z układem LM75 po magistrali i2c z prędkością 500 Hz. Zastosowanie tak niskiej częstotliwości wynika ze sporej odległości układu LM75 od części bazowej.

2. Dostęp do sieci internet

Docelowa lokalizacja znajduje się w zasięgu darmowej sieci WiFi (HotSpot) jednego z lokalnych dostawców internetu, zarazem braku możliwości zapewnienia dostępu do sieci internet innymi drogami przesądziły o sposobie połączenia z siecią.

Rys. Schemat budowy sieci

Komunikacja z punktem HotSpot zapewniona jest przez TL-WA5210G który pracuje w trybie klienta na częstotliwości 2,4GHz. Urządzenie posiada wbudowaną antenę dwupolaryzacyjną o zysku 12dBi oraz dysponuje mocą nadawczą 27dBm. Po umieszczeniu na niewielkim maszcie od wielu lat utrzymuje stabilne łącze. Zasilanie urządzenia odbywa się w standardzie PoE.

Rys.  TL-WA5210G zainstalowany na maszcie

Port WAN routera WGR612 podłączony jest do TL-WA5210G. Jeden z portów switcha (WGR612 posiada dwa porty switch) został podłączony do Raspberry Pi, natomiast drugi port i wbudowany AP obsługuje pozostałe urządzenia wchodzące w skład lokalnej sieci.

Rys. WGR612 zarządzający siecią lokalną. Z boku urządzenia widoczny adapter PoE.

Tak złożona budowa sieci wynika jedynie z konieczności zapewnienia dostępu do internetu innym urządzeniom. Podłączenie do Raspberry Pi karty WiFi z anteną o odpowiednim wzmocnieniu w zupełności by wystarczyło.

2.1. Połączenie z punktem HotSpot

Punkt HotSpot (zbudowany na bazie Mikrotik) do którego podłączona jest stacja monitorująca zapewnia dostęp do sieci internet przez dwie godziny. Dopiero po zarejestrowaniu i otrzymaniu loginu oraz hasła dostęp staje się nielimitowany, jednak w przeglądarce internetowej co dwie godziny wyświetlana jest strona z logowaniem.

Zatem, by dostęp do sieci był ciągły, należało opracować system automatycznie logujący do HotSpotu. Skrypt logowania został zainstalowany na Raspberry Pi i wywoływany jest automatycznie przez Cron co kilka minut.

Algorytm skryptu logowania:

  1. Ping serwera google celem sprawdzenia dostępu do sieci internet. Jeśli jest dostęp do sieci, to zaniechanie dalszych procedur,
  2. pobranie soli do kodowania hasła z HotSpotu,
  3. wygenerowanie skrótu hasła algorytmem md5  z dodaną solą otrzymaną z HotSpotu,
  4. zalogowanie do HotSpotu.

Program (dostępny do pobrania w rozdziale 3) napisany jest częściowo w javascript (pkt.3 algorytmu logowania – skrypt został pobrany z HotSpotu). Najprostrzym rozwiązaniem było zainstalowanie silnika Rhino do jego obsługi. Pozostałe kroki algorytmu napisane zostały w języku PHP.

2.2. Dostęp do stacji z sieci internet – VPN Logmein Hamachi

Jednym z punktów które miał spełniać projekt było zapewnienie dostępu do stacji z sieci internet. Z uwagi na brak stałego adresu IP, oraz braku adresu z puli publicznej, koniecznym było nawiązywanie połączenia ze stacją za pomocą wirtualnej sieci prywatnej (VPN). Wirtualna sieć została zbudowana w oparciu o oprogramowanie Logmein Hamachi. Jest to program umożliwiający utworzenie wirtualnej sieci (w darmowej wersji do 5 maszyn) poprzez zainstalowanie wirtualnej karty sieciowej której przydzielony jest stały adres IP widoczny dla pozostałych urządzeń w obrębie utworzonej sieci.

W pierwszej kolejności należy wykonać aktualizację listy pakietów:

sudo apt-get update

Do poprawnego zainstalowania Logmein Hamachi na Raspberry Pi należy pobrać pakiet lsb-core:

sudo apt-get install lsb-core lsb

Pobranie programu (w chwili pisania artykułu była to wersja 2.1.0.101) i instalacja:

wget –no-check-certificate https://secure.logmein.com/labs/logmein-hamachi_2.1.0.101-1_armel.deb

 

Z uwagi na brak paczki instalacyjnej z programem Logmein Hamachi dla architektury ARM procesora Raspberry Pi należy wykonać instalację wymuszającą działanie na zastanej architekturze.

 

sudo dpkg -i –force-depends –force-architecture logmein-hamachi_2.1.0.101-1_armel.deb 

 

Istnieje również możliwość akceptacji paczek dla architektury ARMEL i wykonania “typowej” instalacji:

sudo dpkg –add-architecture armel

sudo dpkg -i logmein-hamachi_2.1.0.101-1_armel.deb

 

Konfiguracja zainstalowanego programu odbywa się po zalogowaniu do sieci Logmein Hamachi:

sudo hamachi login

Następnie należy utworzyć login który będzie widoczny w sieci. Słowo “nickname” należy zastąpić dowolną nazwą:

sudo hamachi set-nick nickname

Następnym krokiem jest utworzenie sieci w której będą pracowały urządzenia:

sudo hamachi create nazwa haslo

W przypadku gdy sieć już została wcześniej założona:

sudo hamachi join nazwa haslo

Wyświetlenie listy urządzeń podłączonych do utworzonej sieci i ich adresy IP:

sudo hamachi list

 

3. Odnośniki