Wyślij zapytanie Dołącz do Sii

Platforma Microsoft .NET przez wiele lat znana była przede wszystkim jako środowisko do tworzenia aplikacji na systemy operacyjne z rodziny Windows. Od tego czasu sporo się zmieniło, głównie z powodu wydania w 2016 roku frameworku .NET Core w wersji 1.0, który zapewniał wsparcie dla systemów Windows, Linux oraz macOS.

Warto przy tej okazji wspomnieć, iż już w 2004 roku istniała możliwość uruchamiania aplikacji .NET na innych niż Windows platformach za pomocą projektu open source Mono.

W niniejszym artykule przedstawię dwie interesujące opcje skorzystania z możliwości platformy .NET na mikrokomputerach Raspberry Pi: wykorzystania środowiska uruchomieniowego .NET w systemie z rodziny Linux oraz w specjalnej wersji systemu Windows 10 – IoT Core.

Mikrokomputer Raspberry Pi
Ryc. 1 Mikrokomputer Raspberry Pi

Raspberry Pi jest rodziną mikrokomputerów stworzonych przez Raspberry Pi Foundation do nauki zagadnień związanych z obszarem szeroko rozumianej informatyki. Od czasu wydania pierwszej wersji urządzenia w 2012 roku są powszechnie wykorzystywane do nauki, jak i hobbystycznie stosowane w różnego rodzaju projektach m.in.: z zakresu IoT (ang. Internet of Things).

Do testów możliwości platformy .NET zostanie wykorzystane Raspberry Pi 3B, ponieważ zapewnia ono w tej chwili najszerszy wachlarz opcji. W przyszłości może to ulec zmianie, jeżeli nowe wersje Raspberry zapewnią wsparcie dla innych zaprezentowanych w niniejszym artykule narzędzi/wersji systemów. Przy każdej z opcji umieszczę informację na temat kompatybilności z innymi wersjami Raspberry.

Dodatkowo, nasza konfiguracja sprzętowa potrzebować będzie również trzech przewodów oraz jednego rezystora 4,7kΩ. Dokładną instrukcję tej konfiguracji możecie znaleźć na blogu Forbot.

.NET/.NET Core Runtime na systemie Linux

Najbardziej oczywistą możliwością wykorzystania platformy .NET na urządzeniach z systemem Linux jest użycie wersji środowiska uruchomieniowego, która jest przez niego wspierana. W przypadku Raspberry Pi możemy po prostu wykorzystać .NET Runtime. Po zainstalowaniu i skonfigurowaniu środowiska będziemy mogli uruchamiać aplikacje napisane w:

  • C#,
  • F#,
  • Visual Basic.

.NET Core już od wersji 2.0 wydanej w 2017 roku zapewniał wsparcie dla architektury ARM (a dokładniej ARM32). Pozwoliło to nie tylko tworzyć aplikacje na dotychczasowo wspierane platformy (takie jak komputery osobiste, serwery czy też inne urządzenia w ramach ekosystemu Windows), lecz także na sprzętach takich jak Raspberry Pi.

Przed rozpoczęciem właściwych działań należy zainstalować oficjalny systemy operacyjny dla Raspberry, czyli Raspbian. Instrukcja instalacji znajduje się na oficjalnej stronie projektu. Następnym krokiem jest skonfigurowanie sprzętu pod obsługę czujnika temperatury.

Instalacja frameworku .NET Runtime

Zacznijmy od zainstalowania frameworku .NET Runtime na Raspberry Pi. W tym celu należy wykonać sekwencję komend poniżej z poziomu systemowego terminala:

  • curl -sSL https://dot.net/v1/dotnet-install.sh | bash /dev/stdin –channel Current
  • echo 'export DOTNET_ROOT=$HOME/.dotnet’ >> ~/.bashrc
  • echo 'export PATH=$PATH:$HOME/.dotnet’ >> ~/.bashrc
  • source ~/.bashrc
  • dotnet –version

W przypadku poprawnej instalacji wynikiem ostatniej komendy powinna być aktualnie zainstalowania wersja .NET – w moim przykładzie jest to 6.0.401.

Sprawdzenie zainstalowanej wersji .NETu z poziomu terminala
Ryc. 2 Sprawdzenie zainstalowanej wersji .NETu z poziomu terminala

Stworzenie aplikacji konsolowej

Następnym krokiem jest stworzenie aplikacji konsolowej oraz zainstalowanie niezbędnych pakietów:

  • dotnet new console -o RaspberryTemperature
  • cd RaspberryTemperature
  • dotnet add package Iot.Device.Bindings
  • dotnet add package CsvHelper
  • dotnet add package Newtonsoft.Json

W celu poprawności działania nowo utworzonej aplikacji możemy uruchomić ją za pomocą komendy: dotnet run RaspberryTemperature.csproj

Uruchomienie przykładowej aplikacji konsolowej z poziomu terminala
Ryc. 3 Uruchomienie przykładowej aplikacji konsolowej z poziomu terminala

Po poprawnym uruchomieniu powinniśmy ujrzeć w terminalu napis „Hello, World”.

Przygotowanie przykładowego programu

Na potrzeby pokazania możliwości użycia platformy .NET stworzyłem prosty program służący do odczytu temperatury z popularnego cyfrowego czujnika temperatury DS18B20. Może on stanowić jeden z elementów nieskomplikowanego systemu automatyki domowej, do stworzenia której wielu pasjonatów wykorzystuje sprzęt taki jak Raspberry.

Następnie należy otworzyć plik Program.cs edytorem tekstu wedle uznania (w moim przypadku jest to Visual Studio Code – dostępny również na Raspberry) i wkleić tam kod źródłowy znajdujący się w repozytorium. Poniżej najbardziej interesujący fragment, ukazujący odczyt temperatury z czujnika.

//Pomiar temperatury z sensora DS18B20
var sensor = OneWireThermometerDevice.EnumerateDevices().FirstOrDefault();
var temperature = sensor?.ReadTemperature() ?? new UnitsNet.Temperature();
Console.WriteLine($"Aktualna temperatura: {temperature.DegreesCelsius.ToString("F3")}\u00B0C");

Uruchomienie aplikacji konsolowej

Możemy teraz przystąpić do uruchomienia naszej aplikacji konsolowej:

  • dotnet run RaspberryTemperature.csproj

W przypadku poprawnej konfiguracji środowiska oraz sprzętu naszym oczom powinien się ukazać zbliżony widok:

Uruchomienie gotowego projektu z poziomu terminala
Ryc. 4 Uruchomienie gotowego projektu z poziomu terminala

Aplikacja najpierw odczytuje poprzednie pomiary temperatury z pliku (jeżeli istnieją) i wyświetla ostatni z nich, następnie odczytuje aktualną temperaturę z sensora i wyświetla ją dla użytkownika. Wynik jest następnie zapisywany do pliku oraz wysyłany poprzez zapytanie HTTP na wskazany adres. W naszym przypadku jest to wyłącznie URL umożliwiający podejrzenie czy faktycznie zapytanie się powiodło i jaka była jego treść.

treść zapytania HTTP wysłanego przez aplikację w podglądzie na stronie webhook
Ryc. 5 Treść zapytania HTTP wysłanego przez aplikację w podglądzie na stronie webhook

Ta prosta aplikacja miała na celu pokazanie, iż platforma .NET na Raspberry Pi zapewnia wsparcie podstawowych funkcjonalności, jakie możemy chcieć użyć na sprzęcie tej klasy np. komunikację z czujnikami przez GPIO, zapis i odczyt w systemie plików czy też komunikację sieciowa.

Informacje praktyczne i ograniczenia

Najważniejszą informację na temat ograniczeń wykorzystania .NET na Raspberry stanowi kompatybilność. Obecnie wspierany jest .NET Core od wersji 2.0 w górę oraz .NET od 5.0 wzwyż.

Ze względu na ograniczenia architektury, na ten moment wsparcie otrzymuje jedynie ARM32v7, wykorzystywana w następujących sprzętach:

  • Raspberry Pi 2,
  • Raspberry Pi 3,
  • Raspberry Pi 4,
  • Raspberry Pi Zero 2W.

Aktualnie możliwe jest wyłącznie tworzenie aplikacji konsolowych oraz webowych przy użyciu ASP.NET Core. W tym momencie nie ma wsparcia dla aplikacji desktopowych na system Linux (choć
w przyszłości może zostać to umożliwione za sprawą projektu MAUI).

Z uwagi na dosyć niszowy przypadek użycia jakim jest .NET na Raspberry, istnieje ryzyko sytuacji, w której jakieś peryferia nie mają zapewnionego wsparcia w postaci gotowych do pobrania bibliotek. Możemy jednak wykorzystać podstawowe dostępne interfejsy komunikacji takie jak:

  • GPIO,
  • I2C,
  • SPI,
  • UART,

co otwiera drogę do stworzenia takich bibliotek samemu w razie potrzeby.

Windows 10 IoT Core

Drugą możliwością uruchamiania aplikacji .NET-owych, jaką dysponujemy na Raspberry, jest zainstalowanie dedykowanej wersji systemu Windows przeznaczonej na urządzenia IoT – Windows 10 IoT Core. Wersja ta jest rozwinięciem systemu Windows Embedded i została udostępniona po raz pierwszy w 2015 roku. Umożliwia ona uruchamiania aplikacji UWP (ang. Universal Windows Platform) na sprzętach takich jak Raspberry Pi i na innych wybranych mikrokomputerach.

Instalacja i konfiguracja

Zainstalowanie Windows 10 IoT Core nie stanowi problemu. Do tego celu została stworzona specjalna aplikacja Windows 10 IoT Core Dashboard, dzięki której możemy w łatwy sposób przeprowadzić instalację systemu, podejrzeć i konfigurować aktualne podłączone urządzenia, a także wgrywać dostępne przykładowe aplikacje do przetestowania możliwości systemu. Instrukcję instalacji znajdziemy na stronie Microsoftu.

Aby móc stworzyć aplikację UWP, musimy posiadać środowisko programistyczne (takie jak Visual Studio od wersji 2015 w górę) umożliwiające realizację tego typu projektów. Przy instalacji pamiętajmy, by zadbać o oznaczenie następującej opcji:

Instalator Visual Studio wraz ze wskazanym pakietem UWP do zainstalowania
Ryc. 6 Instalator Visual Studio wraz ze wskazanym pakietem UWP do zainstalowania

Po pomyślnym zainstalowaniu niezbędnych składników, przechodzimy do stworzenia nowego projektu, wybierając z dostępnych opcji Blank App (Universal Windows).

Kreator tworzenia nowego projektu w Visual Studio ze wskazanym odpowiednim szablonem aplikacji
Ryc. 7 Kreator tworzenia nowego projektu w Visual Studio ze wskazanym odpowiednim szablonem aplikacji

W następnym kroku kreator projektu poprosi nas o wskazanie wersji systemu, którą chcemy obsługiwać. Należy dopasować wybór do wersji systemu zainstalowanej w poprzednich krokach na Raspberry.

Wybór docelowej, obsługiwanej wersji sytemu Windows
Ryc. 8 Wybór docelowej, obsługiwanej wersji sytemu Windows

Po zakończonym procesie tworzenia projektu mamy dostęp do nowej aplikacji UWP z interfejsem graficznym. Możemy przystąpić do wgrania aplikacji i uruchomienia jej na naszym Raspberry.

W tym celu należy wskazać opcję „ARM” jako architekturę rozwiązania oraz „Remote Machine” jako środowisko. Powinno nam się wyświetlić okno dialogowe z opcją wyboru urządzenia. Jeżeli Raspberry jest poprawnie skonfigurowane oraz występuje w tej samej sieci co nasz komputer, powinno pojawić się jako jedna z opcji do wyboru. Po wyborze urządzenia możemy przystąpić to wgrania aplikacji na nasz mikrokomputer. Pierwsza instalacja może trwać dłużej z uwagi na konieczność przesłania
i zainstalowania niezbędnych bibliotek i paczek.

Wybór urządzenia do uruchomienia aplikacji
Ryc. 9 Wybór urządzenia do uruchomienia aplikacji

Efektem uruchomienia aplikacji na Raspberry powinien być pusty ekran wyświetlony na podłączonym do mikrokomputera ekranie (w miejsce poprzednio widocznych informacji o systemie).

Przykładowa aplikacja na Windows 10 IoT Core

Dla celów demonstracyjnych możliwości Windowsa 10 IoT Core wykorzystamy aplikację UWP
z interfejsem graficznym, w której umieścimy nieco zmodyfikowany kod źródłowy z poprzedniego przykładu dla systemu Linux. Pełen kod dostępny jest w repozytorium.

Po uruchomieniu aplikacji na zdalnym urządzeniu i podłączeniu do niego wyświetlacza, naszym oczom powinien ukazać się następujący widok:

Zrzut ekranu z aplikacji na Windows 10 IoT Core po naciśnięciu przycisku
Ryc. 10 Zrzut ekranu z aplikacji na Windows 10 IoT Core po naciśnięciu przycisku

Naciśnięcie przycisku „Pomiar” powoduje wczytanie ostatniego pomiary temperatury z pliku, odczytanie „aktualnego” stanu temperatury, zapis wyniku do pliku oraz wysłanie zapytania HTTP, podobnie jak w przypadku naszej pierwszej aplikacji konsolowej. Różnica polega na wykorzystaniu generatora liczb pseudolosowych. Powody, dlaczego tak się dzieje, przedstawię w podsumowaniu dla tej wersji systemu.

Informacje praktyczne i ograniczenia

Windows 10 dla IoT wspiera wyłącznie tworzenie aplikacji w modelu UWP, co jest dość sporym ograniczeniem, jeśli chodzi o możliwości wykorzystania bibliotek i frameworków. Jednakże możemy tworzyć zarówno aplikacje konsolowe (mogące działać w tle w tzw. modelu headless), jak również i te
z interfejsem graficznym.

Warto wspomnieć, iż istnieją dwie wersje systemu Windows 10 dla IoT – omawiany przeze mnie IoT Core oraz IoT Enterprise. Ta druga wersja, oprócz zapewnionego dodatkowego wsparcia oraz innych benefitów podobnych do edycji Windows Enterprise, pozwala na uruchamianie całego spektrum aplikacji na Windowsa (Windows Forms, UWP, etc.), lecz nie zapewnia wsparcia architektury ARM, co w naszym przypadku wyklucza ją z wykorzystania na Raspberry Pi.

Lista urządzeń z rodziny Raspberry wspieranych przez IoT Core ogranicza się w zasadzie wyłącznie do modeli:

  • Raspberry Pi 2,
  • Raspberry Pi 3B
  • Raspberry Pi 3B+ (wyłącznie w wersji Technical Preview).

Wspomagane są również mikrokomputery innych producentów, lecz lista ta nie jest zbyt długa.

Dużym plusem tworzenia i testowania aplikacji .NET na Windows 10 IoT Core jest świetna integracja
z Visual Studio, która pozwala nam w bardzo prosty sposób wgrywać, uruchamiać oraz debugować nasze aplikacje z poziomu IDE.

Czujnik DS18B20 nie jest bezpośrednio wspierany w Windows 10 IoT Core. Sama biblioteka do jego obsługi (dostępna w pakiecie Iot.Device.OneWire) jest dostępna, ale nie działa w tej konfiguracji. Nie będę omawiać dokładnych powodów braku wsparcia tego czujnika, odsyłam jednak do możliwych sposobów obejścia tego problemu: wykorzystanie protokołu UART oraz mostków OneWire.

Bonus: Windows 10 ARM

Ostatnią opcją wykorzystania platformy .NET, jaką w ramach ciekawostki chciałbym zaprezentować, jest… wykorzystanie pełnoprawnej wersji systemu Windows 10 na Raspberry Pi. Istnieje możliwość instalacji wersji systemu pod architekturę ARM i jej wykorzystanie na mikrokomputerze. W takim przypadku możemy uruchamiać aplikacje nie tylko skompilowane specjalne na tę architekturę, lecz także na architekturę x86 za pomocą wbudowanej w system warstwy emulacji.

Najprostszą metodą na instalację Windowsa 10 ARM jest skorzystanie z projektu „Windows on Raspberry”. Dokładną instrukcję jak to krok po kroku zrobić znajdziecie pod tym adresem: Windows on Raspberry.

Zrezygnowałem jednak z szerszego omawiania tej metody z powodu jej „nieoficjalnego” charakteru. Choć instalowane obrazy systemu pochodzą od samego Microsoftu, a autorzy projektu informują, że jest on w pełni legalny pod warunkiem posiadania stosownych licencji do Windowsa, nie jest to jednak (na razie) oficjalnie wspierana opcja. Warto jednak mieć świadomość, że taka możliwość istnieje. Dla zainteresowanych tym, jak taki system zachowuje się na tak prostym sprzęcie jak Raspberry, odsyłam do filmu na platformie Youtube pokazującego Windowsa 10 na Raspberry Pi.

Podsumowanie

Podsumowując wszystkie powyższe eksperymenty, sprawdziliśmy dwa możliwe sposoby wykorzystania platformy .NET na Raspberry Pi – uruchamianie aplikacji .NET na systemie Linux oraz na specjalnej wersji systemu Windows – Windows 10 IoT Core.

Każda z tych opcji cechuje się innym wsparciem funkcjonalności platformy .NET, obsługiwanego sprzętu i peryferiów, rodzajem możliwych do uruchomienia aplikacji oraz ogólnym wsparciem platformy.

Jeśli chodzi o użyteczność, najbardziej godną zbadania opcją pracy z .NET na Raspberry jest wykorzystanie natywnego wsparcia platformy dla systemów Linux. Ta możliwość jest już wspierana od dłuższego czasu, a każda kolejna wersja platformy jest kompatybilna zarówno z Linuxem jak
i architekturą ARM (.NET 6 oferuje dodatkowo wsparcie dla ARM64). Instalacja, konfiguracja i użytkowanie aplikacji przebiegają bezproblemowo. Otrzymujemy ponadto spore wsparcie dla zewnętrznych peryferiów takich jak czujniki, poprzez implementacje protokołów wykorzystywanych przez IoT. Dzięki możliwości tworzenia aplikacji webowych możemy również wykorzystać nasz mikrokomputer jako serwer.

Ciekawą, choć zdecydowanie mniej przyszłościową opcją wydaje się Windows 10 IoT Core. Zdecydowanym plusem jest możliwość tworzenia aplikacji UWP z interfejsem graficznym, jak również bardzo przyjazna dla developera integracja z narzędziami programistycznymi. Niestety, ta wersja systemu nie będzie już otrzymywać nowych funkcjonalności na rzecz wersji Enterprise. Samą platformę UWP również spotkał ten los – otrzymywać będzie tylko poprawki błędów i stabilności. Ta opcja jednak może być interesująca w przypadkach, które zawierają konieczność użycia aplikacji .NET
z graficznym interfejsem użytkownika.

***

Jeśli interesuje Cię tematyka .NET, zachęcamy do zapoznania z innym artykułem autora: ML.NET – uczenie maszynowe w wydaniu Microsoftu.

5/5 ( głosy: 6)
Ocena:
5/5 ( głosy: 6)
Autor
Avatar
Wojciech Agaciński

Software Engineer w Sii. Zajmuje się programowaniem na platformę .NET. W wolnym czasie gra w planszówki, obserwuje gwiazdy i czasem uwarzy piwo. Lubi też pogrzebać w danych.

Zostaw komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Może Cię również zainteresować

Pokaż więcej artykułów

Bądź na bieżąco

Zasubskrybuj naszego bloga i otrzymuj informacje o najnowszych wpisach.

Otrzymaj ofertę

Jeśli chcesz dowiedzieć się więcej na temat oferty Sii, skontaktuj się z nami.

Wyślij zapytanie Wyślij zapytanie

Natalia Competency Center Director

Get an offer

Dołącz do Sii

Znajdź idealną pracę – zapoznaj się z naszą ofertą rekrutacyjną i aplikuj.

Aplikuj Aplikuj

Paweł Process Owner

Join Sii

ZATWIERDŹ

This content is available only in one language version.
You will be redirected to home page.

Are you sure you want to leave this page?