{"id":16461,"date":"2022-10-21T07:00:00","date_gmt":"2022-10-21T05:00:00","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=16461"},"modified":"2023-05-10T15:04:59","modified_gmt":"2023-05-10T13:04:59","slug":"net-i-raspberry-pi-mozliwosci-wykorzystania-platformy-na-mikrokomputerach","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/net-i-raspberry-pi-mozliwosci-wykorzystania-platformy-na-mikrokomputerach\/","title":{"rendered":".NET i Raspberry Pi \u2013 mo\u017cliwo\u015bci wykorzystania platformy na mikrokomputerach"},"content":{"rendered":"\n<p>Platforma Microsoft .NET przez wiele lat znana by\u0142a przede wszystkim jako \u015brodowisko do tworzenia aplikacji na systemy operacyjne z rodziny Windows. Od tego czasu sporo si\u0119 zmieni\u0142o, g\u0142\u00f3wnie z powodu wydania w 2016 roku frameworku .NET Core w wersji 1.0, kt\u00f3ry zapewnia\u0142 wsparcie dla system\u00f3w Windows, Linux oraz macOS.<\/p>\n\n\n\n<p>Warto przy tej okazji wspomnie\u0107, i\u017c ju\u017c w 2004 roku istnia\u0142a mo\u017cliwo\u015b\u0107 uruchamiania aplikacji .NET na innych ni\u017c Windows platformach za pomoc\u0105 projektu open source Mono.<\/p>\n\n\n\n<p>W niniejszym artykule przedstawi\u0119 dwie interesuj\u0105ce opcje skorzystania z mo\u017cliwo\u015bci platformy .NET na mikrokomputerach Raspberry Pi: <strong>wykorzystania \u015brodowiska uruchomieniowego .NET w systemie z rodziny Linux oraz w specjalnej wersji systemu Windows 10 \u2013 IoT Core.<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"683\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Raspberry-1024x683.jpg\" alt=\"Mikrokomputer Raspberry Pi\" class=\"wp-image-16462\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Raspberry-1024x683.jpg 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Raspberry-300x200.jpg 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Raspberry-768x512.jpg 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Raspberry-1536x1024.jpg 1536w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Raspberry.jpg 1920w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption>Ryc. 1 Mikrokomputer Raspberry Pi<\/figcaption><\/figure>\n\n\n\n<p>Raspberry Pi jest rodzin\u0105 mikrokomputer\u00f3w stworzonych przez Raspberry Pi Foundation do nauki zagadnie\u0144 zwi\u0105zanych z obszarem szeroko rozumianej informatyki. Od czasu wydania pierwszej wersji urz\u0105dzenia w 2012 roku s\u0105 powszechnie wykorzystywane do nauki, jak i hobbystycznie stosowane w r\u00f3\u017cnego rodzaju projektach m.in.: z zakresu IoT (ang. Internet of Things).<strong><\/strong><\/p>\n\n\n\n<p><strong>Do test\u00f3w mo\u017cliwo\u015bci platformy .NET zostanie wykorzystane Raspberry Pi 3B<\/strong>, poniewa\u017c zapewnia ono w tej chwili najszerszy wachlarz opcji. W przysz\u0142o\u015bci mo\u017ce to ulec zmianie, je\u017celi nowe wersje Raspberry zapewni\u0105 wsparcie dla innych zaprezentowanych w niniejszym artykule narz\u0119dzi\/wersji system\u00f3w. Przy ka\u017cdej z opcji umieszcz\u0119 informacj\u0119 na temat kompatybilno\u015bci z innymi wersjami Raspberry.<\/p>\n\n\n\n<p>Dodatkowo, nasza konfiguracja sprz\u0119towa potrzebowa\u0107 b\u0119dzie r\u00f3wnie\u017c trzech przewod\u00f3w oraz jednego rezystora 4,7k\u03a9. <a href=\"https:\/\/forbot.pl\/blog\/kurs-raspberry-pi-czujnik-temperatury-ds18b20-id26430\" target=\"_blank\" rel=\"noreferrer noopener\" rel=\"nofollow\" >Dok\u0142adn\u0105 instrukcj\u0119 tej konfiguracji<\/a> mo\u017cecie znale\u017a\u0107 na blogu Forbot.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>.NET\/.NET Core Runtime na systemie Linux<\/strong><\/h2>\n\n\n\n<p>Najbardziej oczywist\u0105 mo\u017cliwo\u015bci\u0105 wykorzystania platformy .NET na urz\u0105dzeniach z systemem Linux jest u\u017cycie wersji \u015brodowiska uruchomieniowego, kt\u00f3ra jest przez niego wspierana. W przypadku Raspberry Pi mo\u017cemy po prostu wykorzysta\u0107 <strong>.NET Runtime<\/strong>. Po zainstalowaniu i skonfigurowaniu \u015brodowiska b\u0119dziemy mogli uruchamia\u0107 aplikacje napisane w:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>C#,<\/li><li>F#,<\/li><li>Visual Basic.<\/li><\/ul>\n\n\n\n<p>.NET Core ju\u017c od wersji 2.0 wydanej w 2017 roku zapewnia\u0142 wsparcie dla architektury ARM (a dok\u0142adniej ARM32). Pozwoli\u0142o to nie tylko tworzy\u0107 aplikacje na dotychczasowo wspierane platformy (takie jak komputery osobiste, serwery czy te\u017c inne urz\u0105dzenia w ramach ekosystemu Windows), lecz tak\u017ce na sprz\u0119tach takich jak Raspberry Pi.<\/p>\n\n\n\n<p>Przed rozpocz\u0119ciem w\u0142a\u015bciwych dzia\u0142a\u0144 nale\u017cy zainstalowa\u0107 <strong>oficjalny systemy operacyjny<\/strong> dla Raspberry, czyli <strong>Raspbian<\/strong>. Instrukcja instalacji znajduje si\u0119 na <a href=\"https:\/\/www.raspberrypi.com\/documentation\/computers\/getting-started.html\" target=\"_blank\" rel=\"noreferrer noopener\" rel=\"nofollow\" >oficjalnej stronie projektu<\/a>. Nast\u0119pnym krokiem jest <a href=\"https:\/\/forbot.pl\/blog\/kurs-raspberry-pi-czujnik-temperatury-ds18b20-id26430\" target=\"_blank\" rel=\"noreferrer noopener\" rel=\"nofollow\" >skonfigurowanie sprz\u0119tu<\/a> pod obs\u0142ug\u0119 czujnika temperatury.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Instalacja frameworku .NET Runtime<\/strong><\/h3>\n\n\n\n<p>Zacznijmy od zainstalowania frameworku .NET Runtime na Raspberry Pi. W tym celu nale\u017cy wykona\u0107 sekwencj\u0119 komend poni\u017cej z poziomu systemowego terminala:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>curl -sSL https:\/\/dot.net\/v1\/dotnet-install.sh | bash \/dev\/stdin &#8211;channel Current<\/li><li>echo 'export DOTNET_ROOT=$HOME\/.dotnet&#8217; &gt;&gt; ~\/.bashrc<\/li><li>echo 'export PATH=$PATH:$HOME\/.dotnet&#8217; &gt;&gt; ~\/.bashrc<\/li><li>source ~\/.bashrc<\/li><li>dotnet &#8211;version<\/li><\/ul>\n\n\n\n<p>W przypadku poprawnej instalacji wynikiem ostatniej komendy powinna by\u0107 aktualnie zainstalowania wersja .NET \u2013 w moim przyk\u0142adzie jest to 6.0.401.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/DotnetVersion.png\"><img decoding=\"async\" width=\"908\" height=\"85\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/DotnetVersion.png\" alt=\"Sprawdzenie zainstalowanej wersji .NETu z poziomu terminala\" class=\"wp-image-16464\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/DotnetVersion.png 908w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/DotnetVersion-300x28.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/DotnetVersion-768x72.png 768w\" sizes=\"(max-width: 908px) 100vw, 908px\" \/><\/a><figcaption>Ryc. 2 Sprawdzenie zainstalowanej wersji .NETu z poziomu terminala<\/figcaption><\/figure><\/div>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Stworzenie aplikacji konsolowej<\/strong><\/h3>\n\n\n\n<p>Nast\u0119pnym krokiem jest stworzenie aplikacji konsolowej oraz zainstalowanie niezb\u0119dnych pakiet\u00f3w:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>dotnet new console -o RaspberryTemperature<\/li><li>cd RaspberryTemperature<\/li><li>dotnet add package Iot.Device.Bindings<\/li><li>dotnet add package CsvHelper<\/li><li>dotnet add package Newtonsoft.Json<\/li><\/ul>\n\n\n\n<p>W celu poprawno\u015bci dzia\u0142ania nowo utworzonej aplikacji mo\u017cemy uruchomi\u0107 j\u0105 za pomoc\u0105 komendy: dotnet run RaspberryTemperature.csproj<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"710\" height=\"90\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/HelloWorld.png\" alt=\"Uruchomienie przyk\u0142adowej aplikacji konsolowej z poziomu terminala\" class=\"wp-image-16466\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/HelloWorld.png 710w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/HelloWorld-300x38.png 300w\" sizes=\"(max-width: 710px) 100vw, 710px\" \/><figcaption>Ryc. 3 Uruchomienie przyk\u0142adowej aplikacji konsolowej z poziomu terminala<\/figcaption><\/figure>\n\n\n\n<p>Po poprawnym uruchomieniu powinni\u015bmy ujrze\u0107 w terminalu napis \u201eHello, World\u201d.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Przygotowanie przyk\u0142adowego programu<\/strong><\/h3>\n\n\n\n<p>Na potrzeby pokazania mo\u017cliwo\u015bci u\u017cycia platformy .NET stworzy\u0142em prosty program s\u0142u\u017c\u0105cy do odczytu temperatury z popularnego cyfrowego czujnika temperatury DS18B20. Mo\u017ce on stanowi\u0107 jeden z element\u00f3w nieskomplikowanego <strong>systemu automatyki domowej<\/strong>, do stworzenia kt\u00f3rej wielu pasjonat\u00f3w wykorzystuje sprz\u0119t taki jak Raspberry.<\/p>\n\n\n\n<p>Nast\u0119pnie nale\u017cy otworzy\u0107 plik Program.cs edytorem tekstu wedle uznania (w moim przypadku jest to Visual Studio Code \u2013 dost\u0119pny r\u00f3wnie\u017c na Raspberry) i wklei\u0107 tam kod \u017ar\u00f3d\u0142owy znajduj\u0105cy si\u0119 w <a href=\"https:\/\/github.com\/Wituch\/RaspberryPiDotNet\" target=\"_blank\" rel=\"noreferrer noopener\" rel=\"nofollow\" >repozytorium<\/a>. Poni\u017cej najbardziej interesuj\u0105cy fragment, ukazuj\u0105cy odczyt temperatury z czujnika.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n\/\/Pomiar temperatury z sensora DS18B20\nvar sensor = OneWireThermometerDevice.EnumerateDevices().FirstOrDefault();\nvar temperature = sensor?.ReadTemperature() ?? new UnitsNet.Temperature();\nConsole.WriteLine($&quot;Aktualna temperatura: {temperature.DegreesCelsius.ToString(&quot;F3&quot;)}\\u00B0C&quot;);\n\n<\/pre><\/div>\n\n\n<h3 class=\"wp-block-heading\"><strong>Uruchomienie aplikacji konsolowej<\/strong><\/h3>\n\n\n\n<p>Mo\u017cemy teraz przyst\u0105pi\u0107 do uruchomienia naszej aplikacji konsolowej:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>dotnet run RaspberryTemperature.csproj<\/li><\/ul>\n\n\n\n<p>W przypadku poprawnej konfiguracji \u015brodowiska oraz sprz\u0119tu naszym oczom powinien si\u0119 ukaza\u0107 zbli\u017cony widok:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Result.png\"><img decoding=\"async\" width=\"800\" height=\"143\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Result.png\" alt=\"Uruchomienie gotowego projektu z poziomu terminala\" class=\"wp-image-16468\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Result.png 800w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Result-300x54.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Result-768x137.png 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/a><figcaption>Ryc. 4 Uruchomienie gotowego projektu z poziomu terminala<\/figcaption><\/figure><\/div>\n\n\n\n<p>Aplikacja najpierw odczytuje poprzednie pomiary temperatury z pliku (je\u017celi istniej\u0105) i wy\u015bwietla ostatni z nich, nast\u0119pnie odczytuje aktualn\u0105 temperatur\u0119 z sensora i wy\u015bwietla j\u0105 dla u\u017cytkownika. Wynik jest nast\u0119pnie zapisywany do pliku oraz wysy\u0142any poprzez zapytanie HTTP na wskazany adres. W naszym przypadku jest to wy\u0142\u0105cznie URL umo\u017cliwiaj\u0105cy podejrzenie czy faktycznie zapytanie si\u0119 powiod\u0142o i jaka by\u0142a jego tre\u015b\u0107.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/ResultWebhook.png\"><img decoding=\"async\" width=\"1024\" height=\"360\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/ResultWebhook-1024x360.png\" alt=\"tre\u015b\u0107 zapytania HTTP wys\u0142anego przez aplikacj\u0119 w podgl\u0105dzie na stronie webhook \" class=\"wp-image-16470\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/ResultWebhook-1024x360.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/ResultWebhook-300x106.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/ResultWebhook-768x270.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/ResultWebhook.png 1122w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption>Ryc. 5 Tre\u015b\u0107 zapytania HTTP wys\u0142anego przez aplikacj\u0119 w podgl\u0105dzie <a href=\"https:\/\/webhook.site\/\" rel=\"nofollow\" >na stronie webhook<\/a><\/figcaption><\/figure><\/div>\n\n\n\n<p>Ta prosta aplikacja mia\u0142a na celu pokazanie, i\u017c platforma .NET na Raspberry Pi zapewnia <strong>wsparcie podstawowych funkcjonalno\u015bci<\/strong>, jakie mo\u017cemy chcie\u0107 u\u017cy\u0107 na sprz\u0119cie tej klasy np. komunikacj\u0119 z czujnikami przez GPIO, zapis i odczyt w systemie plik\u00f3w czy te\u017c komunikacj\u0119 sieciowa.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Informacje praktyczne i ograniczenia<\/strong><\/h3>\n\n\n\n<p>Najwa\u017cniejsz\u0105 informacj\u0119 na temat ogranicze\u0144 wykorzystania .NET na Raspberry stanowi kompatybilno\u015b\u0107. Obecnie wspierany jest .NET Core od wersji 2.0 w g\u00f3r\u0119 oraz .NET od 5.0 wzwy\u017c.<\/p>\n\n\n\n<p>Ze wzgl\u0119du na ograniczenia architektury, na ten moment wsparcie otrzymuje jedynie ARM32v7, wykorzystywana w nast\u0119puj\u0105cych sprz\u0119tach:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Raspberry Pi 2,<\/li><li>Raspberry Pi 3,<\/li><li>Raspberry Pi 4,<\/li><li>Raspberry Pi Zero 2W.<\/li><\/ul>\n\n\n\n<p>Aktualnie mo\u017cliwe jest wy\u0142\u0105cznie tworzenie aplikacji konsolowych oraz webowych przy u\u017cyciu ASP.NET Core. W tym momencie nie ma wsparcia dla aplikacji desktopowych na system Linux (cho\u0107<br>w przysz\u0142o\u015bci mo\u017ce zosta\u0107 to umo\u017cliwione za spraw\u0105 projektu MAUI).<\/p>\n\n\n\n<p>Z uwagi na dosy\u0107 niszowy przypadek u\u017cycia jakim jest .NET na Raspberry, istnieje ryzyko sytuacji, w kt\u00f3rej jakie\u015b peryferia nie maj\u0105 zapewnionego wsparcia w postaci gotowych do pobrania bibliotek. Mo\u017cemy jednak wykorzysta\u0107 podstawowe dost\u0119pne interfejsy komunikacji takie jak:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>GPIO,<\/li><li>I2C,<\/li><li>SPI,<\/li><li>UART,<\/li><\/ul>\n\n\n\n<p>co otwiera drog\u0119 do stworzenia takich bibliotek samemu w razie potrzeby.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Windows 10 IoT Core<\/strong><\/h2>\n\n\n\n<p>Drug\u0105 mo\u017cliwo\u015bci\u0105 uruchamiania aplikacji .NET-owych, jak\u0105 dysponujemy na Raspberry, jest zainstalowanie dedykowanej wersji systemu Windows przeznaczonej na urz\u0105dzenia IoT \u2013 <a href=\"https:\/\/learn.microsoft.com\/en-us\/windows\/iot-core\/windows-iot-core\" target=\"_blank\" rel=\"noreferrer noopener\" rel=\"nofollow\" >Windows 10 IoT Core<\/a>. Wersja ta jest rozwini\u0119ciem systemu Windows Embedded i zosta\u0142a udost\u0119pniona po raz pierwszy w 2015 roku. Umo\u017cliwia ona uruchamiania aplikacji UWP (ang. Universal Windows Platform) na sprz\u0119tach takich jak Raspberry Pi i na innych wybranych mikrokomputerach.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Instalacja i konfiguracja<\/strong><\/h3>\n\n\n\n<p>Zainstalowanie Windows 10 IoT Core nie stanowi problemu. Do tego celu zosta\u0142a stworzona specjalna aplikacja Windows 10 IoT Core Dashboard, dzi\u0119ki kt\u00f3rej mo\u017cemy w \u0142atwy spos\u00f3b przeprowadzi\u0107 instalacj\u0119 systemu, podejrze\u0107 i konfigurowa\u0107 aktualne pod\u0142\u0105czone urz\u0105dzenia, a tak\u017ce wgrywa\u0107 dost\u0119pne przyk\u0142adowe aplikacje do przetestowania mo\u017cliwo\u015bci systemu. <a href=\"https:\/\/learn.microsoft.com\/en-us\/windows\/iot-core\/tutorials\/quickstarter\/devicesetup#using-the-iot-dashboard-raspberry-pi-minnowboard-nxp\" target=\"_blank\" rel=\"noreferrer noopener\" rel=\"nofollow\" >Instrukcj\u0119 instalacji znajdziemy na stronie Microsoftu<\/a>.<\/p>\n\n\n\n<p>Aby m\u00f3c stworzy\u0107 aplikacj\u0119 UWP, musimy posiada\u0107 \u015brodowisko programistyczne (takie jak Visual Studio od wersji 2015 w g\u00f3r\u0119) umo\u017cliwiaj\u0105ce realizacj\u0119 tego typu projekt\u00f3w. Przy instalacji pami\u0119tajmy, by zadba\u0107 o oznaczenie nast\u0119puj\u0105cej opcji:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/VisualStudioInstall.png\"><img decoding=\"async\" width=\"868\" height=\"402\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/VisualStudioInstall.png\" alt=\"Instalator Visual Studio wraz ze wskazanym pakietem UWP do zainstalowania\" class=\"wp-image-16472\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/VisualStudioInstall.png 868w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/VisualStudioInstall-300x139.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/VisualStudioInstall-768x356.png 768w\" sizes=\"(max-width: 868px) 100vw, 868px\" \/><\/a><figcaption>Ryc. 6 Instalator Visual Studio wraz ze wskazanym pakietem UWP do zainstalowania<\/figcaption><\/figure><\/div>\n\n\n\n<p>Po pomy\u015blnym zainstalowaniu niezb\u0119dnych sk\u0142adnik\u00f3w, przechodzimy do stworzenia nowego projektu, wybieraj\u0105c z dost\u0119pnych opcji Blank App (Universal Windows).<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/UWP.png\"><img decoding=\"async\" width=\"1024\" height=\"657\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/UWP-1024x657.png\" alt=\"Kreator tworzenia nowego projektu w Visual Studio ze wskazanym odpowiednim szablonem aplikacji\" class=\"wp-image-16474\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/UWP-1024x657.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/UWP-300x192.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/UWP-768x493.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/UWP-1536x986.png 1536w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/UWP.png 1543w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption>Ryc. 7 Kreator tworzenia nowego projektu w Visual Studio ze wskazanym odpowiednim szablonem aplikacji<\/figcaption><\/figure><\/div>\n\n\n\n<p>W nast\u0119pnym kroku kreator projektu poprosi nas o wskazanie wersji systemu, kt\u00f3r\u0105 chcemy obs\u0142ugiwa\u0107. Nale\u017cy dopasowa\u0107 wyb\u00f3r do wersji systemu zainstalowanej w poprzednich krokach na Raspberry.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/VersionSelector.png\"><img decoding=\"async\" width=\"677\" height=\"260\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/VersionSelector.png\" alt=\"Wyb\u00f3r docelowej, obs\u0142ugiwanej wersji sytemu Windows\" class=\"wp-image-16476\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/VersionSelector.png 677w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/VersionSelector-300x115.png 300w\" sizes=\"(max-width: 677px) 100vw, 677px\" \/><\/a><figcaption>Ryc. 8 Wyb\u00f3r docelowej, obs\u0142ugiwanej wersji sytemu Windows<\/figcaption><\/figure><\/div>\n\n\n\n<p>Po zako\u0144czonym procesie tworzenia projektu mamy dost\u0119p do nowej aplikacji UWP z interfejsem graficznym. Mo\u017cemy przyst\u0105pi\u0107 do wgrania aplikacji i uruchomienia jej na naszym Raspberry.<\/p>\n\n\n\n<p>W tym celu nale\u017cy wskaza\u0107 opcj\u0119 \u201eARM\u201d jako architektur\u0119 rozwi\u0105zania oraz \u201eRemote Machine\u201d jako \u015brodowisko. Powinno nam si\u0119 wy\u015bwietli\u0107 okno dialogowe z opcj\u0105 wyboru urz\u0105dzenia. Je\u017celi Raspberry jest poprawnie skonfigurowane oraz wyst\u0119puje w tej samej sieci co nasz komputer, powinno pojawi\u0107 si\u0119 jako jedna z opcji do wyboru. Po wyborze urz\u0105dzenia mo\u017cemy przyst\u0105pi\u0107 to wgrania aplikacji na nasz mikrokomputer. Pierwsza instalacja mo\u017ce trwa\u0107 d\u0142u\u017cej z uwagi na konieczno\u015b\u0107 przes\u0142ania<br>i zainstalowania niezb\u0119dnych bibliotek i paczek.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/DeviceSelection.png\"><img decoding=\"async\" width=\"469\" height=\"545\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/DeviceSelection.png\" alt=\"Wyb\u00f3r urz\u0105dzenia do uruchomienia aplikacji\" class=\"wp-image-16478\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/DeviceSelection.png 469w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/DeviceSelection-258x300.png 258w\" sizes=\"(max-width: 469px) 100vw, 469px\" \/><\/a><figcaption>Ryc. 9 Wyb\u00f3r urz\u0105dzenia do uruchomienia aplikacji<\/figcaption><\/figure><\/div>\n\n\n\n<p>Efektem uruchomienia aplikacji na Raspberry powinien by\u0107 pusty ekran wy\u015bwietlony na pod\u0142\u0105czonym do mikrokomputera ekranie (w miejsce poprzednio widocznych informacji o systemie).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Przyk\u0142adowa aplikacja na Windows 10 IoT Core<\/strong><\/h3>\n\n\n\n<p>Dla cel\u00f3w demonstracyjnych mo\u017cliwo\u015bci Windowsa 10 IoT Core wykorzystamy aplikacj\u0119 UWP<br>z interfejsem graficznym, w kt\u00f3rej umie\u015bcimy nieco zmodyfikowany kod \u017ar\u00f3d\u0142owy z poprzedniego przyk\u0142adu dla systemu Linux. Pe\u0142en kod dost\u0119pny jest w <a href=\"https:\/\/github.com\/Wituch\/RaspberryPiDotNet\" rel=\"nofollow\" >repozytorium<\/a>.<\/p>\n\n\n\n<p>Po uruchomieniu aplikacji na zdalnym urz\u0105dzeniu i pod\u0142\u0105czeniu do niego wy\u015bwietlacza, naszym oczom powinien ukaza\u0107 si\u0119 nast\u0119puj\u0105cy widok:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/IoTCoreResult.jpg\"><img decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/IoTCoreResult-1024x576.jpg\" alt=\"Zrzut ekranu z aplikacji na Windows 10 IoT Core po naci\u015bni\u0119ciu przycisku\" class=\"wp-image-16481\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/IoTCoreResult-1024x576.jpg 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/IoTCoreResult-300x169.jpg 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/IoTCoreResult-768x432.jpg 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/IoTCoreResult-1536x864.jpg 1536w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/IoTCoreResult-555x312.jpg 555w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/IoTCoreResult.jpg 1920w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption>Ryc. 10 Zrzut ekranu z aplikacji na Windows 10 IoT Core po naci\u015bni\u0119ciu przycisku<\/figcaption><\/figure><\/div>\n\n\n\n<p>Naci\u015bni\u0119cie przycisku \u201ePomiar\u201d powoduje wczytanie ostatniego pomiary temperatury z pliku, odczytanie \u201eaktualnego\u201d stanu temperatury, zapis wyniku do pliku oraz wys\u0142anie zapytania HTTP, podobnie jak w przypadku naszej pierwszej aplikacji konsolowej. R\u00f3\u017cnica polega na wykorzystaniu generatora liczb pseudolosowych. Powody, dlaczego tak si\u0119 dzieje, przedstawi\u0119 w podsumowaniu dla tej wersji systemu.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Informacje praktyczne i ograniczenia<\/strong><\/h3>\n\n\n\n<p>Windows 10 dla IoT wspiera wy\u0142\u0105cznie tworzenie aplikacji w modelu UWP, co jest do\u015b\u0107 sporym ograniczeniem, je\u015bli chodzi o mo\u017cliwo\u015bci wykorzystania bibliotek i framework\u00f3w. Jednak\u017ce mo\u017cemy tworzy\u0107 zar\u00f3wno aplikacje konsolowe (mog\u0105ce dzia\u0142a\u0107 w tle w tzw. modelu headless), jak r\u00f3wnie\u017c i te<br>z interfejsem graficznym.<\/p>\n\n\n\n<p>Warto wspomnie\u0107, i\u017c istniej\u0105 dwie wersje systemu Windows 10 dla IoT \u2013 omawiany przeze mnie IoT Core oraz IoT Enterprise. Ta druga wersja, opr\u00f3cz zapewnionego dodatkowego wsparcia oraz innych benefit\u00f3w podobnych do edycji Windows Enterprise, pozwala na uruchamianie ca\u0142ego spektrum aplikacji na Windowsa (Windows Forms, UWP, etc.), lecz nie zapewnia wsparcia architektury ARM, co w naszym przypadku wyklucza j\u0105 z wykorzystania na Raspberry Pi.<\/p>\n\n\n\n<p>Lista urz\u0105dze\u0144 z rodziny Raspberry wspieranych przez IoT Core ogranicza si\u0119 w zasadzie wy\u0142\u0105cznie do modeli:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Raspberry Pi 2,<\/li><li>Raspberry Pi 3B<\/li><li>Raspberry Pi 3B+ (wy\u0142\u0105cznie w wersji Technical Preview).<\/li><\/ul>\n\n\n\n<p>Wspomagane s\u0105 r\u00f3wnie\u017c mikrokomputery innych producent\u00f3w, lecz lista ta <a href=\"https:\/\/learn.microsoft.com\/en-us\/windows\/iot-core\/tutorials\/quickstarter\/prototypeboards\" target=\"_blank\" rel=\"noreferrer noopener\" rel=\"nofollow\" >nie jest zbyt d\u0142uga<\/a>.<\/p>\n\n\n\n<p>Du\u017cym plusem tworzenia i testowania aplikacji .NET na Windows 10 IoT Core jest \u015bwietna integracja<br>z Visual Studio, kt\u00f3ra pozwala nam w bardzo prosty spos\u00f3b wgrywa\u0107, uruchamia\u0107 oraz debugowa\u0107 nasze aplikacje z poziomu IDE.<\/p>\n\n\n\n<p>Czujnik DS18B20 nie jest bezpo\u015brednio wspierany w Windows 10 IoT Core. Sama biblioteka do jego obs\u0142ugi (dost\u0119pna w pakiecie Iot.Device.OneWire) jest dost\u0119pna, ale nie dzia\u0142a w tej konfiguracji. Nie b\u0119d\u0119 omawia\u0107 dok\u0142adnych powod\u00f3w braku wsparcia tego czujnika, odsy\u0142am jednak do mo\u017cliwych sposob\u00f3w obej\u015bcia tego problemu: <a href=\"https:\/\/www.hackster.io\/selom\/1-wire-ds18b20-sensor-on-windows-10-iot-core-raspberry-pi-2-7d9b67\" target=\"_blank\" rel=\"noreferrer noopener\" rel=\"nofollow\" >wykorzystanie protoko\u0142u UART<\/a> oraz <a href=\"https:\/\/github.com\/Rinsen\/OneWire\" target=\"_blank\" rel=\"noreferrer noopener\" rel=\"nofollow\" >mostk\u00f3w OneWire<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Bonus: Windows 10 ARM<\/strong><\/h2>\n\n\n\n<p>Ostatni\u0105 opcj\u0105 wykorzystania platformy .NET, jak\u0105 w ramach ciekawostki chcia\u0142bym zaprezentowa\u0107, jest\u2026 wykorzystanie pe\u0142noprawnej wersji systemu Windows 10 na Raspberry Pi. Istnieje mo\u017cliwo\u015b\u0107 instalacji wersji systemu pod architektur\u0119 ARM i jej wykorzystanie na mikrokomputerze. W takim przypadku mo\u017cemy uruchamia\u0107 aplikacje nie tylko skompilowane specjalne na t\u0119 architektur\u0119, lecz tak\u017ce na architektur\u0119 x86 za pomoc\u0105 wbudowanej w system warstwy emulacji.<\/p>\n\n\n\n<p>Najprostsz\u0105 metod\u0105 na instalacj\u0119 Windowsa 10 ARM jest skorzystanie z projektu \u201eWindows on Raspberry\u201d. Dok\u0142adn\u0105 instrukcj\u0119 jak to krok po kroku zrobi\u0107 znajdziecie pod tym adresem: <a href=\"http:\/\/Windows%20on%20Raspberry\" target=\"_blank\" rel=\"noreferrer noopener\" rel=\"nofollow\" >Windows on Raspberry<\/a>.<\/p>\n\n\n\n<p>Zrezygnowa\u0142em jednak z szerszego omawiania tej metody z powodu jej \u201enieoficjalnego\u201d charakteru. Cho\u0107 instalowane obrazy systemu pochodz\u0105 od samego Microsoftu, a autorzy projektu informuj\u0105, \u017ce jest on w pe\u0142ni legalny pod warunkiem posiadania stosownych licencji do Windowsa, <strong>nie jest to jednak (na razie) oficjalnie wspierana opcja<\/strong>. Warto jednak mie\u0107 \u015bwiadomo\u015b\u0107, \u017ce taka mo\u017cliwo\u015b\u0107 istnieje. Dla zainteresowanych tym, jak taki system zachowuje si\u0119 na tak prostym sprz\u0119cie jak Raspberry, odsy\u0142am do filmu na platformie Youtube pokazuj\u0105cego <a href=\"https:\/\/www.youtube.com\/watch?v=_LTEbN-08VI\" target=\"_blank\" rel=\"noreferrer noopener\" rel=\"nofollow\" >Windowsa 10 na Raspberry Pi<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Podsumowanie<\/strong><\/h2>\n\n\n\n<p>Podsumowuj\u0105c wszystkie powy\u017csze eksperymenty, <strong>sprawdzili\u015bmy dwa mo\u017cliwe sposoby wykorzystania platformy .NET na Raspberry Pi<\/strong> \u2013 uruchamianie aplikacji .NET na systemie Linux oraz na specjalnej wersji systemu Windows \u2013 Windows 10 IoT Core.<\/p>\n\n\n\n<p>Ka\u017cda z tych opcji cechuje si\u0119 innym wsparciem funkcjonalno\u015bci platformy .NET, obs\u0142ugiwanego sprz\u0119tu i peryferi\u00f3w, rodzajem mo\u017cliwych do uruchomienia aplikacji oraz og\u00f3lnym wsparciem platformy.<\/p>\n\n\n\n<p>Je\u015bli chodzi o u\u017cyteczno\u015b\u0107, <strong>najbardziej godn\u0105 zbadania opcj\u0105 pracy z .NET na Raspberry <\/strong>jest wykorzystanie natywnego wsparcia platformy dla system\u00f3w Linux. Ta mo\u017cliwo\u015b\u0107 jest ju\u017c wspierana od d\u0142u\u017cszego czasu, a ka\u017cda kolejna wersja platformy jest kompatybilna zar\u00f3wno z Linuxem jak<br>i architektur\u0105 ARM (.NET 6 oferuje dodatkowo wsparcie dla ARM64). Instalacja, konfiguracja i u\u017cytkowanie aplikacji przebiegaj\u0105 bezproblemowo. Otrzymujemy ponadto spore wsparcie dla zewn\u0119trznych peryferi\u00f3w takich jak czujniki, poprzez implementacje protoko\u0142\u00f3w wykorzystywanych przez IoT. Dzi\u0119ki mo\u017cliwo\u015bci tworzenia aplikacji webowych mo\u017cemy r\u00f3wnie\u017c wykorzysta\u0107 nasz mikrokomputer jako serwer.<\/p>\n\n\n\n<p>Ciekaw\u0105, cho\u0107 zdecydowanie <strong>mniej przysz\u0142o\u015bciow\u0105 opcj\u0105<\/strong> wydaje si\u0119 Windows 10 IoT Core. Zdecydowanym plusem jest mo\u017cliwo\u015b\u0107 tworzenia aplikacji UWP z interfejsem graficznym, jak r\u00f3wnie\u017c bardzo przyjazna dla developera integracja z narz\u0119dziami programistycznymi. Niestety, ta wersja systemu nie b\u0119dzie ju\u017c otrzymywa\u0107 nowych funkcjonalno\u015bci na rzecz wersji Enterprise. Sam\u0105 platform\u0119 UWP r\u00f3wnie\u017c spotka\u0142 ten los \u2013 otrzymywa\u0107 b\u0119dzie tylko poprawki b\u0142\u0119d\u00f3w i stabilno\u015bci. Ta opcja jednak mo\u017ce by\u0107 interesuj\u0105ca w przypadkach, kt\u00f3re zawieraj\u0105 konieczno\u015b\u0107 u\u017cycia aplikacji .NET<br>z graficznym interfejsem u\u017cytkownika.<\/p>\n\n\n\n<p>***<\/p>\n\n\n\n<p>Je\u015bli interesuje Ci\u0119 tematyka .NET, zach\u0119camy do zapoznania z innym artyku\u0142em autora: <a href=\"https:\/\/sii.pl\/blog\/ml-net-uczenie-maszynowe-w-wydaniu-microsoftu\/?category=development-na-twardo&amp;tag=net,c,ml-net,software-development,uczenie-maszynowe\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"ML.NET \u2013 uczenie maszynowe w wydaniu Microsoftu.\">ML.NET \u2013 uczenie maszynowe w wydaniu Microsoftu.<\/a><\/p>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-left kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;left&quot;,&quot;id&quot;:&quot;16461&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;6&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;5&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;11&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;5\\\/5 ( votes: 6)&quot;,&quot;size&quot;:&quot;18&quot;,&quot;title&quot;:&quot;.NET i Raspberry Pi \u2013 mo\u017cliwo\u015bci wykorzystania platformy na mikrokomputerach&quot;,&quot;width&quot;:&quot;139.5&quot;,&quot;_legend&quot;:&quot;{score}\\\/{best} ( {votes}: {count})&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 139.5px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 14.4px;\">\n            5\/5 ( votes: 6)    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>Platforma Microsoft .NET przez wiele lat znana by\u0142a przede wszystkim jako \u015brodowisko do tworzenia aplikacji na systemy operacyjne z rodziny &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/net-i-raspberry-pi-mozliwosci-wykorzystania-platformy-na-mikrokomputerach\/\">Continued<\/a><\/p>\n","protected":false},"author":378,"featured_media":19565,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":9,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1314],"tags":[272,435,794],"class_list":["post-16461","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development-na-twardo","tag-net","tag-iot","tag-raspberry-pi"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/NET-i-Raspberry-Pi-\u2013-mozliwosci-wykorzystania-platformy-na-mikrokomputerach-1.jpg","category_names":["Development na twardo"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/16461"}],"collection":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/users\/378"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=16461"}],"version-history":[{"count":3,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/16461\/revisions"}],"predecessor-version":[{"id":21570,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/16461\/revisions\/21570"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/19565"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=16461"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=16461"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=16461"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}