Windows 10 IoT Core
Вот и наступил тот долгожданный день,когда ко мне пришел Resberry Pi 3. Заказывал я его из Китая и через пару недель он добрался до меня. Зачем я его заказывал? Всё хотел посмотреть что за зверь этот Windows 10 IoT Core. После того, как Microsoft представила UWP и объявила о том, что приложения написанные на универсальной платформе могут запускаться на разных устройствах, в том числе и на IoT. Мне стало интересно и я захотел посмотреть и разобраться в том, как с этим работать.
Первым делом я зашел на портал Microsoft, чтобы посмотреть с чего мне начать. Microsoft предлагали купить устройства, которые подерживали Windows 10 IoT Core. Так как этот пункт меня не интересовал, я его пропустил. Далее предлагали настроить устройства, но для начала мне нужна была SD-карта (SD card-based devices). Немножко покопаясь я нашел карты, которые рекомендовали Microsoft.
Дело оставалось за малым, зашел в Ситилнк, заказал рекомендованную почти флешку (Рекомендованная: Samsung 32GB EVO Class 10 Micro SDHC. Заказал: Samsung 32GB EVO Pluse Class 10 Micro SDHC).
Я, с большой надеждой, начал записывать образ OC’и на флешку.
Всё было хорошо, до появления сообщения об ошибке. Как наивный человек, я попробывал ещё 3 раза записать на флешку Windows 10 IoT Core и как итог: я получил только седую бороду.
Делать было нечего нашел старую флешку на 16 Гбайт 4 Class и попробывал с ней…Записалось WTF Microsoft?
После чего я собрал свой Rasberry Pi 3, подключил питание и начал ждать, пока мой rasiot (мой мини пк) отобразиться в IoT Dashboard’e. В инструкциии было сказано, что подключение к локальной сети может занять 15 минут. Это зависит от скрости чтения с флешки, а так как флешка, которую я использовал, была не самого хорошего класса, я подождал 40 минут, но так ничего не добился. После чего я подумал:” А что если rasiot не может подключится к Wi-Fi?”- и подключил его к локальной сети с помощью кабеля. Через пару секунд rasiot отобразился в Dashboard’e.
Полдела сделано. Мне стало интересно, а как выглядит Windows 10 IoT Core и что с ней можно делать.
Я представил себе какой-нибудь плиточный интерфейс (CShel on all). Ну что же надо зайти на устройтва. Открыл Device Portal. Как ни странно догадаться от меня потребывали логин и пароль администратора. Пароль я вводил при настройке, а вот логин я не вводил. Пришлось немножко потыкаться в IoT Dashboard’e, чтобы найти “Имя пользователя”. Имя по умолчанию Администратор.
Ввожу имя пользователя и пароль - ошибка. Ещё раз - ошибка. И тут я подумал: “Администратор имя по умолчанию для русской локализации, а у меня на rasiot’e , скорей всего, стоит английская локализация. А что если вдруг имя Администратор для rasiot - это Administrator”. И как ни странно я смог залогиниться.
Windows 10 IoT Core для внешнего наблюдателя представляет из себя web-портал.А как же CShell on all?
И так теперь можно запускать UWP приложение на нашем мини пк. Для этого запускаем Visual Studio. Создаем пустой UWP проект “SampleForRasIoT”. Ничего не будем изменять в бланке по умолчанию. Запустим отладку на “Удаленном компьютере”. При первом запуске отладки на удаленом копмптьютере Visual Studio попросит ввести IP адрес нашего устройства, на котором будет проходит удаленная отладка. Вводим IP rasiot. После того, как успешно был введен IP адрес, можно переходить в “Портал устройства” и посмотреть запущено ли наше приложение.
Как видно приложение работает нормально.
Ну что же пустое приложение на мини пк вещь интересная, но бесполезная. Напишем-ка приложение, которое показывало бы текущую погоду. В качестве сервиса с погодой будем использовать OpenWeatherMap.
Первое что надо сделать - это зарегистрироваться как разработчик. Это нужно для того, чтобы сервис OpenWeatherMap
предоставил нам APIID для использования сервиса.
Так как у нас rasiot может только отображать информацию, то реализуем одностраничное приложние, которое бы показывало текущую погоду на день.
Добавим в проект “SampleForRasIoT”, на страницу MainPage.xaml, нужные элементы. Добавим заголовок, который будет отображать геолокацию (Nuzhniy Novgorod Forever
), показание с “термометра”, ну и пиктограмму погоды.
<!--Title-->
<TextBlock x:Name="TitleTextBlock" Grid.Row="0" HorizontalAlignment="Center" FontSize="48" TextWrapping="WrapWholeWords"/>
<!--Temperature-->
<StackPanel Grid.Row="1" Orientation="Horizontal" HorizontalAlignment="Center">
<Image x:Name="WeatherImage" Height="100" Width="100"/>
<TextBlock x:Name="TempratureTextBlock" FontSize="100" VerticalAlignment="Center" Margin="0,0,0,25"/>
<TextBlock Text="°C" FontSize="32" VerticalAlignment="Center" Margin="0,0,0,60"/>
</StackPanel>
Теперь добавим данные на страничку. Для этого подпишемся на события Loaded
страницы. Создадим метод. В этом методе создадим httpClient, который будет стучаться до openweathermap и брать от туда данные и задавать элементам на страничке.
HttpClient httpClient = new HttpClient();
var serverAnswer = await httpClient.GetStringAsync(URL + _queryParameter + _apiKey);
Так как данные к нам приходят в json-формате (формат можно выберать из: json, xml и html), то их нужно распарсить. Для этого добавим в проект Newtonsoft.Json через Nuget. Далее нужно преобразовать данные с сервера в модель для того, чтобы ими было легче манипулировать. Так как мне лень писать для response модель, то воспользуемся динамическими возможностями языка C#, т.е. ключивым словом dynamic
.
dynamic dynObj = JsonConvert.DeserializeObject(serverAnswer);
Ну чтоже теперь зададим значение для элементов управления.
TitleTextBlock.Text = $"{dynObj.name}";
WeatherImage.Source = new BitmapImage(new Uri(_http + _apiImg + $"{dynObj.weather[0].icon}.png"));
TempratureTextBlock.Text = $"{dynObj.main.temp}";
Здесь нужно отметить, что “стучаться” за данными нужно на адрес:
http://api.openweathermap.org/data/2.5/weather
А чтобы получить пиктограмму на другой адрес:
http://openweathermap.org/img/w/
Теперь нужно проверить, что у нас получилось. Для этого запустим приложение.
Конечно хорошо, что приложение показывает гелокацию и погоду, но для настоящего погодного приложения этого маловато. Сервис OpenWeatherMap ограничивает прогоноз погоды одним днем, но это не означает что я не могу вывести всю доступную информацию о погоде на день.
Покапаясь в API openweathermap я понял какие данные можно получить от сервиса. В соответсвие с этим данными и был переработан интерфейс приложения (добавил пару элементов). Также я добавил автообновление данных каждые 10 минут.
Запускаем приложение на rasiot’e и смотрим, что получилось.