Windows iot remote client

Удаленное отображение Remote display

Просматривайте и контролируйте приложения универсальной платформы Windows 10 IoT Core на удаленном компьютере с Windows 10 Desktop, планшетом или телефоном. View and control your Windows 10 IoT Core UWP applications remotely, from a Windows 10 desktop PC, tablet, or phone

Удаленный клиент Windows IoT — это функция, предназначенная только для разработчиков. Windows IoT Remote Client is a developer only feature. Она не предназначена для рабочих устройств и не поддерживается. It is not intended or supported for production devices.

Удаленный клиент Windows IoT не работает на Raspberry Pi. The Windows IoT Remote client does not work for Raspberry Pi. Используйте плату с графическим ускорителем, такую как MinnowBoard Max или DragonBoard, либо подключите монитор к устройству. Use a board with accelerated graphics such as Minnowboard Max or Dragonboard or attach a monitor for local display.

Обзор Overview

Интерфейс удаленного дисплея — это средство разработки, используемое для удаленного управления приложениями UWP, работающими на устройстве Windows 10 IoT базовая. The remote display experience is a developer tool used to remotely control UWP applications running on a Windows 10 IoT Core device.

Настройка Setup

Чтобы приступить к работе, необходимо настроить устройство Windows 10 IoT Core с последней сборкой Windows 10. Чтобы настроить плату, посетите страницу Начало работы . To get started, you’ll need to set up a Windows 10 IoT Core device with the latest build of Windows 10 — visit the Get Started page to set up your board.

Программу установки можно быстро и просто выполнить три следующих действия, чтобы использовать технологию удаленного просмотра. Setup is quick and easy — follow the three steps below to use the remote display technology.

Убедитесь, что устройство центра Интернета вещей и компьютер разработки находятся в одной сети и не имеют безопасной среды. Ensure that your IoT Core device and development computer are on the same network and n a secure environment.

Один из способов — подключить устройство напрямую к ноутбуку с помощью USB-адаптера Ethernet, который поддерживает автоматическую перекрестию. One method is to connect your device directly to your laptop using a USB Ethernet adapter, which supports automatic crossover.

Включите функцию удаленного дисплея на устройстве Windows 10 IoT базовая. Turn on the remote display functionality on your Windows 10 IoT Core device.

Подключите устройство к Интернету и подключитесь к порталу устройств Windows. Connect your device to the Internet and connect to Windows Device Portal.

Выберите страницу «удаленный» в параметрах слева и пометьте флажок «включить Windows IoT Remote Server». Choose the page «Remote» from the options on the left, and mark the check box labeled «Enable Window IoT Remote Server». Теперь на устройстве включено удаленное отображение. Your device is now enabled for remote display experience.

Установите удаленный клиент Windows IoT на сопутствующем устройстве Windows 10. Install the Windows IoT Remote Client on your companion Windows 10 device.

Чтобы подключить устройство Windows 10 к устройству Windows 10 IoT базовая, необходимо установить приложение Магазина. To enable a Windows 10 device to connect to your Windows 10 IoT Core device, you need to install our Store application. Удаленное клиентское приложение Windows IoT в настоящее время доступно только по ссылке. его можно найти здесь. The Windows IoT Remote Client app is currently available by link only and can be found here.

Подключитесь к устройству Windows 10 IoT Core через установленное приложение. Connect to your Windows 10 IoT Core device through the installed application.

Запустите приложение удаленного клиента Windows IoT на устройстве с Windows 10. Run the Windows IoT Remote Client application on your Windows 10 companion device. На экране подключения введите IP-адрес устройства. At the Connect screen, enter the IP address of your device. Два устройства должны подключаться к удаленному взаимодействию с интерфейсом пользователя устройства Windows 10 IoT Core на сопутствующем устройстве. The two devices should connect, remoting the UI experience of the Windows 10 IoT Core device to the companion device.

Читайте также:  Установка linux как приложения windows

Теперь вы подключены! You’re now connected! С этого момента можно использовать сенсорный ввод, а затем нажать кнопку Вход на сопутствующем устройстве Windows 10 для управления приложением универсальной платформы Windows 10 вещей Core. From this point forward, touch and click input on the companion Windows 10 device can be used to control the Windows 10 IoT Core UWP application.

Совместимость и область действия Compatibility and scope

Чтобы использовать удаленный клиент IoT, необходимо запустить последнюю сборку Windows 10 IoT Core на целевом устройстве и последнем клиентском приложении из магазина. In order to use the IoT Remote Client, you must be running the latest build of Windows 10 IoT Core on the target device and the latest client application from the store.

Устранение неполадок Troubleshooting

Использование технологии удаленного дисплея выполняется быстро и просто, но по-прежнему возникают проблемы, которые могут возникнуть у пользователей. Using the remote display technology is quick and easy, but there are still some issues that users may experience. Обязательно выполните приведенные выше инструкции по настройке. Если проблемы не удается устранить, см. ниже. Make sure to follow the Setup instructions above closely — if problems persist, check below.

При попытке подключения клиентское приложение переходит на белый экран. When I try to connect, the client app goes to a white screen.

Неудачные подключения могут быть вызваны несколькими проблемами, но мы разработали несколько более распространенных проблем: Failed connections can be caused by a number of issues, but we’ve run into a couple more common problems:

Windows IoT Remote Client

The Windows IoT Remote Client app for Windows IoT Core and Windows 10.

Hardware components

Microsoft Windows 10 devices
× 1
MinnowBoard MAX
You can use DragonBoard, Raspberry Pi instead.
× 1
Qualcomm DragonBoard 410c
You can use MinnowBoard MAX, Raspberry Pi instead.
× 1
Raspberry Pi 2 Model B
You can use MinnowBoard MAX, DragonBoard instead.
× 1
Raspberry Pi 3 Model B
You can use MinnowBoard MAX, DragonBoard instead.
× 1

Software apps and online services

Microsoft Windows 10 IoT Core
Not supported with main version of Windows 10 IoT Core. You need to use Windows 10 IoT Core Insider Preview.
Microsoft Windows IoT Remote Client

The Windows IoT Remote Client app allows you to display the IoT device screens without an external screen.

NOTE: You need an Internet Connection to use Windows IoT Remote Client.

There are 3 ways to connect your computer with your IoT device:

  • Use auto discovery to discover your IoT device then connect to it.
  • Connect manually by entering the IP Address.
  • Using the IoT Dashboard: Right-click your IoT device name to open Device Menu, then choose Open IoT Remote Client.

How to get this app

You can download the Windows IoT Remote Client app in the Windows Store (Windows 10 required).

Windows 10 IoT Core: GPIO, Lightning и RemoteClient

Существует огромное количество примеров и статей про Windows 10 IoT Core, рассказывающих о том, как легко и удобно делать с его помощью разнообразные устройства. Однако в реальности работа с любым «железом» всегда связана со множеством не самых очевидных нюансов, знание которых приходит только с практикой. Я расскажу о некоторых особенностях работы c GPIO на Raspberry Pi2 и Windows 10 IoT Core и заодно о новой функции Remote Client, доступной в версии Insider Preview.

Началось все с того, что мне нужно было получить номер карты со считывателя системы СКУД (контроля доступа). Почти все считыватели умеют передавать эти данные по интерфейсу Wiegand. Он представляет собой 3 провода: сигнальный для передачи единиц, сигнальный для передачи нулей и земля. В режиме ожидания на каждом сигнальном проводе устанавливается 5В. Данные передаются «обратными» импульсами. Ширина импульсов от 50 до 200 мкс, период от 300 до 3000 мкс:

Читайте также:  The great escape windows 10

Данные идут всегда в одну сторону от считывателя к контроллеру. Количество бит может варьироваться и их интерпретация тоже может быть разной. Окончание посылки определяется тайм-аутом от 50 до 250 мс.

Такой разброс параметров произошел потому, что это «исторически сложившийся» интерфейс, который не имеет четкого стандарта.

Мне досталось устройство с протоколом wiegand26 — посылка в нем содержит 26 бит, в которых 2 бита контроля четности.

Задание было дано в рамках создания демонстрационного стенда, так что можно было поэкспериментировать с платформой. Поэтому очень кстати пришлась Raspbery Pi2 с Windows 10 IoT Core на борту.

Проблемы с GPIO

Решить эту задачу можно двумя способами:

  • использовать прерывания при изменении напряжения на пинах
  • использовать опрос пинов

Самым простым мне показался первый вариант. Правильно инициализировав пины, можно не грузить процессор постоянным опросом, а отрабатывать только асинхронные вызовы. Код тут очень прост:

Сразу нужно сказать про DebounceTimeout. Вообще он тут не нужен, так как, как правило, при нормальной работе интерфейса без существенных наводок «дребезга» в нем нет. Но из-за того, что в общем случае мы не знаем, с каким считывателем и в каких условиях будет все это работать, то я решил поэкспериментировать с этим таймаутом.

Но ничего хорошего из этого не получилось. В примерах DebounceTimeout везде задается в миллисекундах, но для моего случая нужны микросекунды. Какое бы значение я не устанавливал, события ValueChanged не появлялись. Поэтому таймаут пришлось просто отключить, и все стало работать нормально:

Данные считывались так:

Затем пришла пора решать вопрос с моментом окончания посылки. Как я писал выше, окончанием посылки считается отсутствие импульсов на обоих сигнальных контактах в течение минимум 50 мс. Тут отлично подошел бы таймер, который бы регулярно проверял, был ли обмен, и если нет, то отправлял бы полученный результат дальше.

Такой подход работал плохо. Я использовал ThreadPoolTimer, так как код должен был работать и без UI. Особенностью этого таймера является то, что каждый раз его обработчик вызывается в новом потоке. Если обработчик выполняется дольше периода таймера, то параллельно будет запущен еще один, а потом еще один, и так далее. При этом в нашем случае, в обработчике таймера должны быть сброшены данные, чтобы начать новый прием. Поэтому он является критической секцией и не должен выполняться одновременно более чем в одном экземпляре. Соответственно, короткие интервалы таймера использовать было нельзя.
Далее оказалось, что и длинные интервалы тоже нельзя использовать, как и синхронизацию обработчика через lock, так как пока выполняется обработчик таймера, перестают приходить события ValueChanged от портов. Похоже, что эти события менее приоритетны, чем обработчики таймеров. Причем эксперименты показали, что события не висят в очереди, а просто молча отбрасываются.

Поэтому, как ни крути, использование таймера приводило к потере событий от GPIO и, как следствие, потере данных. Их можно было уменьшить путем подбора периода таймера и перераспределения вычислений на ValueChanged. Но абсолютной надежности достичь с таким подходом нельзя даже теоретически. Кроме того, выяснилось, что к пропуску событий и потере данных ведет и слишком долгое выполнение ValueChanged.

Я решил использовать вместо таймера поток. Для синхронизации применялась queue, в которую складывались пришедшие в ValueChanged биты. Поток должен некоторое время спать, затем проверять, был ли обмен за это время, и если не было, то забирать биты из очереди, собирать из них результат и отправлять дальше.

Но и тут ничего не вышло. Можно было предположить, что ValueChanged не будет вызываться при работе потока, но вот то, что он не вызывается, когда поток спит, для меня оказалось сюрпризом. В качестве аналога Thread.Sleep я использовал Task.Delay. Не знаю, происходит ли при этом выполнение других Task’ов (судя по документации, Delay запускает еще один Task с таймером), но события от GPIO это все наглухо блокирует.

Читайте также:  But the windows lyrics

В общем, драйвер GPIO для Windows 10 IoT написан так, что его почти невозможно использовать асинхронно, так как его события имеют кране низкий приоритет в системе.

Lightning

В процессе изучения работы с GPIO я узнал, что существует еще один, более быстрый драйвер, который можно использовать на Windows 10 IoT Core. Называется он Lightning и включает в себя не только GPIO, но и работу с ADC, I2C, PWM, SPI. Быстрота работы достигается за счет «прямого доступа к памяти»(direct memory access).

Драйвер находится на стадии preview, но уже включен в версии Windows 10 IoT Core Insider Preview. Использовать его стоит тем, кому не хватает скорости работы стандартного драйвера. Я же надеялся тут получить более приоритетный ValueChanged.

По ссылке выше есть инструкция, как его использовать, НО, просто так он не заработает. Проблема заключается в NuGet пакете. Все устанавливается, но до namespace Microsoft.IoT.Lightning.Providers достучаться невозможно. Причем единственное упоминание о том, что проблему нельзя побороть, я нашел в этой статье. Автор рассказывает как управлять светодиодами. В частности, он столкнулся с медленной работой PWM и исправил ситуацию с помощью использования Lightning.
Выглядит оно так:

Мне помог способ, описанный в статье. Я тоже скачал исходники, добавил в Solution файл проекта и сделал на него Reference. И какого же было мое удивление, когда оказалось, что события ValueChanged в Lightning не реализованы.

После этого я бросил идею использовать асинхронный подход и решил сделать опрос пинов в цикле.

UPDATE: В процессе решения задачи я задал разработчикам вопрос по поводу ValueChanged. Они ответили, что скоро все сделают. И свое обещание они выполнили.

Кроме того, в NuGet появилась Microsoft.IoT.Lightning.Providers 1.0.0, которая делает видимым namespace Microsoft.IoT.Lightning.Providers.

Решение задачи

В итоге задачу удалось решить путем создания цикла с периодом опроса пинов в 10 мкс. Сначала были опасения, что может не хватить скорости, но оказалось, что все работает достаточно быстро даже на стандартном драйвере.

Код выглядит примерно так:

Чтобы не блокировать выполнение других потоков, цикл сделан внутри Task:

Работает стабильно, но при условии, что карточки к ридеру подносятся не чаще чем 1 раз в секунду.

Данный проект со всеми инструкциями о подключении ридера к Raspberry Pi2 я планирую через пару недель выложить на GitHub.

Remote client

Многие разработчики, пользующиеся Windows 10 IoT Core, отмечают, что им очень не хватает удаленного рабочего стола. Монитор или телевизор не всегда есть под рукой, да и пользоваться ими не всегда удобно. Наконец этот пробел был закрыт и, начиная с версии 10.0.14295.1000, появился удаленный клиент. Сейчас эта и более новая версия доступны как Insider Preview.
Работает все очень просто. На стороне Windows 10 IoT Core нужно разрешить подключение удаленного клиента в веб интерфейсе:

Установить сам клиент

Запустить его и подключиться с Windows IoT Core

В инструкции указано, что все хорошо работает на Raspberry Pi 2 и 3, Minnowboard Max и Dragonboard. При этом на Pi2 производительность немного ниже, так как там отсутствует поддержка GPU.

У меня как раз была Rapberry Pi2.

Небольшие задержки есть, но, на мой взгляд, они не критичны. При этом работает все стабильно и без проблем.

Выводы

Подводя итог всему вышесказанному, отмечу, что Windows 10 IoT Core работает не всегда так, как может ожидать от нее человек, привыкший к микроконтроллерам. Все-таки это полноценная операционная система, которая достаточно сильно абстрагируется от «железа»:

  1. Приоритет событий от GPIO крайне низкий. Да и механизм событий не совсем понятен.
  2. Сложности с асинхронным программированием, непосредственно не связанные с работой прерываний.
  3. Существующего функционала не всегда хватает, а тот, что представлен в виде preview, не всегда корректно работает. Хотя развивается все это очень быстро.
  4. Производительности Windows 10 IoT Core вполне хватает для задач, чувствительных ко времени выполнения. При этом есть еще запас в виде Lightning.
  5. Появился Remote Client, что существенно повысило удобство работы.
Оцените статью