Библиотека Windows 7 Sensor and Location .NET Interop Sample Library

Платформа Windows 7 Sensor and Location дает компьютеру и приложениям возможность приспосабливаться к текущему окружению и в зависимости от него менять свой облик или поведение. Например, представьте приложение, которое использует датчик освещения и может менять яркость и контрастность экрана, исходя из условий освещения. Или приложение, которое использует датчики местоположения и может определять местоположение. Это делает реальностью доселе невиданные сценарии, среди которых автоматическая локализация содержимого страниц и поиск в Интернете около текущего физического местоположения.

Платформа «Sensor and Location» представляет собой типовой способ интеграции датчиков и устройств в Windows 7, обеспечивая стандартную программную модель для приложений, позволяя реализовать возможности этих устройств. Производители аппаратного обеспечения могут узнать, как создавать драйверы для сенсоров и датчиков местоположения с помощью Windows 7 WDK. Разработчикам, желающим узнать, как создавать приложения, умеющие определять местоположение и поддерживают сенсоры, следует установить бета-версию Windows 7 SDK.

Кто-то спросит, а зачем вообще использовать платформу «Windows 7 Sensor and Location»? Чтобы ответить на тот вопрос, мы должны понять, что большинство приложений, которые ежедневно применяются, были разработаны для нормальных условий окружающей среды, например, для обычных условий внутреннего освещения. Однако, сегодняшние ноутбуки обладают более высокой мобильностью, чем когда-либо, позволяя использовать их в различных местах и в различных условиях освещения. Было бы здорово, если бы приложения умели менять свой интерфейс, стиль и поведение в зависимости от текущих условий окружающей среды. Так, к примеру, датчики освещения позволят компьютеру автоматически подстраивать яркость экрана ноутбука, исходя из условий окружающего освещения. А разработчики, со своей стороны, могут заставить приложения оптимизировать содержимое таким образом, чтобы упростить использование приложения в разных условиях освещения.

На следующем снимке вы увидите обновленную версию MSDN Reader. Эта версия умеет менять свой внешний вид в зависимости от уровня освещения, определяемого датчиком. С левой стороны можно видеть, как приложение выглядит при нормальном комнатном освещении, а с правой стороны – при наружном освещении. При ярком освещении приложение уменьшает количество используемых цветов, чтобы увеличить контраст, и увеличивает размер шрифта, делая отображаемый контент (текст) более удобочитаемым при ярком дневном освещении. Я использовал приложение Virtual Light Simulator, которое входит в состав бета-версии Windows 7 SDK: найти его можно в папке Program Files\Microsoft SDKs\Windows\v7.0\Bin\VirtualLightSensor.exe. В принципе можно загрузить пример кода, установить SDK и оценить его в действии на вашем компьютере. Обратите внимание, что при запуске приложения Virtual Light Sensor необходимо открыть Device Manager и запустить поиск драйверов (в той же папке), чтобы установить неподписанный драйвер Virtual Light. После этого приложение заработает.

image

Бета-версия Windows 7 SDK содержит инструменты, документацию и примеры кода для создания драйверов сенсорных устройств, а также примеры использования платформы Sensor and Location в разработке приложений для Windows 7. Как и большинство других API, Sensor and Location является собственным интерфейсом Windows 7. В SDK есть еще несколько примеров, иллюстрирующих, как приложения с управляемым кодом используют очень тонкий слой взаимодействия. Однако, библиотека Sensor and Location .NET Interop Sample Library предлагает более широкую и более .NET-подобную модель программирования со строго типизированными объектами и простой моделью расширяемости для отчетов Sensor Data Report.

Давайте рассмотрим архитектуру библиотеки Sensor and Location .NET Interop Sample Library Windows 7 и выделим важные классы.

Чтобы начать работать с сенсорами, для начала их следует получить. Это можно сделать, обратившись к SensorManager, чья главная задача состоит в том, чтобы представить классы сенсоров (например, классы датчиков освещения и акселерометров) разработчику. С помощью SensorManager разработчики могутвыполнять следующие операции:

· Получать массив датчиков по параметру CategoryID. CategoryID – глобальный уникальный идентификатор (GUID), который определяет известный класс сенсоров – датчиков освещения, акселерометров, датчиков движения или местоположения. Полный список сенсоров размещен в классе SensorCategories и в SDK.

· Получать массив датчиков по параметру TypeID. TypeID –тип сенсора, связанный с определенным классом. Например, тип LocationGPS – часть класса сенсоров Location Sensors, а Accelerometer3d и Accelerometer2d связаны с классом Accelerometer Sensors. С полным списком типов сенсоров можно ознакомиться в классе SensorCategories.

· Получить датчик по его GUID'у

· Получить все датчики (GetAllSensors) ‑ получить все зарегистрированные сенсоры. Вы можете использовать любые сенсоры из этого списка, если есть соответствующие права. Чтобы использовать сенсор, пользователь будет должен активировать его в приложении.

· Показать диалоговое окно разрешений, котороепозволяет пользователям активировать тот или иной сенсор.

· Уведомить приложение о доступности с помощью события SensorAttached.

clip_image004

Как только получен нужный сенсор из SensorManager, приложение может собирать данные, используя класс SensorDataReport, который является абстрактным базовым классом для всех отчетов DataReports. Чтобы датчик был поистине полезным, он должен выдавать понятные данные. Количество, частота и тип образования данных отличаются в разных датчиках. Например, датчик открытия дверей создает мало данных булевого типа, а датчик движения может непрерывно производить поток данных. Чтобы стандартизировать путь, по которому приложение получает данные, собственный Sensor API использует объект Sensor Data Report.

Вы можете получить доступ к данным из отчета сенсора через собственный API с интерфейсом ISensorDataReport. Этот интерфейс позволяет отыскать временной штамп отчета, а вы, в свою очередь, можете определить, насколько полезна информация в нем. Получить данные можно двумя способами: в качестве отдельного значения или набора значений. Чтобы получить данные в виде отдельного значения, используйте метод GetSensorValue. Чтобы получить набор значений, обратитесь к методу GetSensorValues. Получить тип данных или поля данных, которые требуется извлечь из отчета, можно с использованием структуры PROPERTYKEY. Эта модель программирования должна быть знакома разработчикам. Однако, в связи с определенными сложностями при обращении к управляемому коду, ощущается нехватка основных функций вроде строгого контроля типов, так как у каждого сенсора есть разные поля данных. Поэтому одна из наших целей состоит в том, чтобы создать строго типизированный .NET-класс для каждого сенсора и для каждого отчета, обеспечивая простой доступ к системе свойств .NET.

Управляемый код SensorDataReport – это основной класс отчетов о данных сенсора, специфичных для определенного типа (например, Accelerometer3DReport). Когда разработчики обеспечивают поддержку стандартного сенсора, они обычно создают набор из двух классов: Sensor и SensorDataReport. SensorDataReport предоставляет основные методы, среди которых запрос свойств из PropertyKey и которые должны быть замещены типобезопасными свойствами в полученных классах (например, AxisY_G из Accelerometer3DReport).

Следующая диаграмма иллюстрирует три полученных класса сообщений о данных, которые мы внедрили в библиотеку Windows 7 Sensor and Location .NET Interop Sample Library – Accelerometer3DDataReport, AmbientLightSensorDataReport и BooleanSwitchArrayDataReport:

clip_image006

Мы также осуществили поддержку LatLongLocationReport и CivicAddressLocationReport, которые можно найти в разделе Location Providers в Windows 7 Sensor and Location .NET Interop Sample Library.

Давайте рассмотрим фрагмент кода, который иллюстрируют процесс определения освещенности при использовании сенсора AmbientLightSensor и отчета. Для этого разработчику необходимо:

1. Получить класс AmbientLightSensor из SensorManager

2. Получить отчет о данных из класса AmbientLightSensor. Обратите внимание, что GetDataReport возвращает собственный SensorDataReport

Следующий фрагмент кода показывает, как получить сенсор освещения из SensorManager и использовать его, чтобы получить AmbientLightSensorDataReport: 

 

 //obtain a light sensor 
AmbientLightSensor[] lightSensors = 
    SensorManager.GetSensorsByType<AmbientLightSensor>();
if (lightSensors.Length > 0)
{
    _lightSensor = lightSensors[0];
    _lightSensor.ReportInterval = _lightSensor.MinReportInterval;
}
…
//use the light sensor to get en AmbientLightSensorDataReport
AmbientLightSensorDataReport lightReport = 
    (AmbientLightSensorDataReport)_lightSensor.GetDataReport();
//Get the lux value from that date report
_illuminanceLux = lightReport.IlluminanceLux;

Помимо получения отчетов разработчики могут провести с датчиком намного больше операций. Абстрактный класс Sensor содержит исчерпывающий набор свойств, которые предоставляют такую информацию, как FriendlyName, SensorDescription, SensorID, SensorSerialNumber и SensorState. Есть также такие свойства, как ReportInterval для установки интервала между созданием отчетов и MinReportInterval для установки минимального времени между отчетами. В дополнение к этому класс Sensor поддерживает ряд событий, включая события DataUpdated, сообщающее о готовности отчета, и OnStateChanged, которое сообщает об изменении состояния сенсора. Класс Sensor предоставляет к вашим услугам массу дополнительных свойств. Диаграмма ISensorEventsInternal показывает класс Sensor и три производных класса, созданных специально для библиотеки Sensors and Location Managed Library Sample.

clip_image008

Активация сенсоров

Для использования каждого установленного датчика конечный пользователь должен активировать его. Это можно сделать через апплет Location и Other Sensors, расположенный в панели управления. Приложение может инициировать то же самое диалоговое окно при вызове соответствующего API. На снимке ниже показаны сенсоры, установленные на моем рабочем компьютере:

clip_image010

В состав библиотеки Sensor and Location Managed Library Sample входят два примера: MSDN Reader и Marble Sample. Последний представляет собой XNA-приложение, для работы которого необходимо загрузить XNA Game Studio 3.0. Это демонстрационное приложение покажет, как использовать датчики Accelerometer3D. MSDN Reader использует AmbientLightSensor для смены размера и цвета шрифтов.

В следующей статье мы продолжим исследовать архитектуру, используемую в библиотеке Windows 7 Sensor and Location .NET Interop Sample Library, а это позволит лучше понять, как создавать собственные наборы сенсоров.

В создании этого сообщения принял участие Дмитрий Зурбалёв