Serwer WWW z elementami grafiki 3D – praktyczne wykorzystanie pakietów Node.js oraz Three.js w systemach wbudowanych (część 1)

Jedną z niewątpliwych zalet wykorzystania systemu operacyjnego Linux w procesie projektowania urządzeń wbudowanych jest szybki i łatwy dostęp do otwartych, darmowych i wolnych (w sensie wolności) repozytoriów oprogramowania implementujących m.in. rozbudowane stosy graficzne, protokoły sieciowe czy złożone algorytmy obliczeń. Fakt ten odgrywa szczególnie ważną rolę, kiedy zadanie stawiane przed naszym urządzeniem może zostać chociaż częściowo zrealizowane za pomocą istniejących już pakietów oprogramowania. Samodzielna implementacja stosów obsługi USB, Ethernet, Bluetooth czy bardziej złożonych interfejsów graficznych użytkownika może być czasochłonna i podatna na błędy. Wykorzystując gotowe sterowniki i pakiety oprogramowania (o ile są one udostępnione na dogodnej licencji), zyskujemy nie tylko czas, ale i pewność, że oprogramowanie zostało przetestowane przez tysiące innych użytkowników Linuksa.

W niniejszym artykule, na przykładzie komputera jednopłytkowego VisionSOM firmy SoMLabs  przedstawiono przykład prostego i szybkiego tworzenia bardziej rozbudowanych projektów sprzętowo-programowych, z wykorzystaniem bibliotek gotowego i darmowego oprogramowania. Wykorzystując wyłącznie minimalną funkcjonalność środowiska uruchomieniowego Node.js oraz biblioteki Three.js, przygotujemy prosty serwer WWW, prezentujący wyniki danych pomiarowych (odczytanych z modułu żyroskopu komunikującego się po magistrali I2C) w postaci animowanej kostki 3D. Proces budowy kompletnego projektu został przedstawiony etapowo – od najprostszej implementacji serwera WWW wyświetlającej napis „Hello World”, poprzez podział serwera na funkcje front-end/back-end oraz implementację odczytu danych z procesu obsługującego moduł żyroskopu (tematyka pierwszej części artykułu), aż do przygotowania właściwej obsługi modułu żyroskopu i prezentacji wyników pomiarów w postaci animowanej kostki 3D (część druga artykułu).

Node.js – systemy wbudowane i JavaScript?

Czym jest Node.js? Jest to wieloplatformowe środowisko uruchomieniowe JavaScript udostępnione na licencji open-source. Inaczej ujmując ogólnodostępną definicję – platforma Node.js umożliwia uruchomienie kodu JavaScript poza przeglądarką internetową. Należy podkreślić, że samo Node.js nie jest serwerem, umożliwia jednak proste i szybkie utworzenie serwera HTTP oraz bardziej złożonych aplikacji internetowych. Ponieważ kod programu jest uruchamiany poza przeglądarką, programista ma możliwość tworzenia typowych rozwiązań „server-side”, czyli takich w których aplikacja może realizować odczyt/zapis systemu plików, baz danych oraz co równie istotne pod kątem realizacji urządzeń wbudowanych – wchodzić w interakcję z dołączonym do systemu urządzeniami peryferyjnymi – czujnikami, aktuatorami, itp.

W niniejszym artykule wykorzystano komputer jednopłytkowy VisionSOM pracujący pod kontrolą dystrybucji Debian. Autor celowo pominął opisy przygotowania komputera do pracy – przygotowanie karty SD z systemem Debian oraz konfiguracja i kompilacja jądra systemu i plików Device Tree została przedstawiona w ramach artykułu „Emulator konsoli NES w systemie Linux na komputerze VisionSOM”. Komplet informacji został również udostępniony na stronie Wiki producenta komputera.

Ze względu na dużą popularność platformy Node.js (warto nadmienić, że korzystają z niej takie serwisy jak Netflix, PayPal, LinkedIn czy Uber), gotowe pakiety oprogramowania są obecnie dostępne w niemal wszystkich dystrybucjach linuksowych. Dla dystrybucji Debian, instalacja pakietu nodejs przebiega w sposób standardowy dla narzędzia apt-get:

Aby przetestować poprawność instalacji, wywołajmy komendę nodejs -v.

Jeśli w wyniku powyższego polecenia został wyświetlony numer wersji oprogramowania Node.js, możemy przystąpić do przygotowania najprostszej implementację serwera WWW.

Prosta implementacja serwera WWW

Implementację serwera WWW rozpoczynamy od utworzenia pliku main.js. W pierwszej linii kodu zaimportujmy wbudowany w Node.js moduł http:

oraz zdefiniujmy numer portu na którym będzie nasłuchiwał tworzony serwer:

Kolejnym krokiem jest utworzenie właściwego serwera poprzez wywołanie metody createServer() na module http:

Metoda createServer() jako argument przyjmuje funkcje zwrotną, której zadaniem jest obsługa zapytań przychodzących do serwera. Funkcja ta przyjmuje dwa argumenty:

  • request – argument zawiera informacje o szczegółach zapytania,
  • response – obiekt zawierający metody i własności do obsługi odpowiedzi.

W naszej prostej implementacji serwera, w odpowiedzi na zapytanie klienta prześlemy: informację z kodem odpowiedzi (200–OK), typ zwracanego dokumentu (text/plain – czyste dane tekstowe) oraz napis „Hello World!”. Uzupełniony kod metody createServer() o obsługę zapytania został przedstawiony poniżej:

Listing 1. Skrypt main.js z implementacją prostego serwera WWW

Po zapisaniu zmian w pliku main.js, możemy uruchomić skrypt za pomocą polecenia:

Jeżeli próba uruchomienia skryptu została zakończona sukcesem, wpisując w oknie przeglądarki adres IP podłączonego do sieci komputera VisionSOM, zobaczymy pierwszy rezultat działania serwera WWW, jak przedstawiono to na rysunku 1.

Rys. 1. Implementacja prostego serwera WWW

O autorze

Łukasz Skalski
Łukasz Skalski - absolwent Politechniki Gdańskiej, miłośnik FLOSS, autor książki "Linux. Podstawy i aplikacje dla systemów embedded" oraz szeregu artykułów dotyczących programowania systemów wbudowanych. Zawodowo związany z firmą Samsung. Wszystkie wolne chwile poświęca projektowaniu i programowaniu urządzeń wyposażonych w mikroprocesory 8-/16- i 32-bitowe. Szczególnym zainteresowaniem obejmuje tematykę systemu Linux w aplikacjach na urządzenia embedded.