Одним из компонентов Windows 7 является Платформа датчиков и локации .
Датчик и местоположение — часть Windows 7, позволяющая организовать работу с различными датчиками и дополнительными устройствами для измерения чего-либо.
Почему это необходимо? Датчики нужны, чтобы упростить некоторые тривиальные действия и избавить нас от лишних забот в работе.
Особенно это актуально для владельцев ноутбуков, жизнь которых очень динамична.
Представьте, что ваш компьютер имеет встроенный датчик освещенности, который доступен всем приложениям и позволяет этим приложениям корректировать свое изображение в зависимости от освещения.
Другим примером может быть датчик координат GPS. В этом случае приложения смогут адаптироваться к местности, где вы сейчас находитесь.
Например, приложения могут отображать информацию о погоде конкретно для города, в котором вы находитесь.
На самом деле примеров можно привести большое количество, все зависит от фантазии и конкретных случаев.
Приложения, меняющие свое поведение в зависимости от внешних условий, выделяются в отдельный класс приложений и называются контекстно-зависимые приложения .
Может возникнуть вопрос: «а что же собственно изменилосьЭ», «почему это нельзя было сделать раньшеЭ» Ответ прост – раньше эти сценарии тоже можно было реализовать.
Однако сделать это было не так-то просто.
Фактически работа с внешними датчиками сводилась к обмену информацией через COM-порт и каждый датчик имел свой определенный API. По этой причине было очень сложно организовать какой-то универсальный программный интерфейс, с которым можно было бы работать одновременно из нескольких приложений и этот процесс был бы прозрачным.
Именно эту проблему и решает библиотека Sensor and Location. С его помощью вы можете получить доступ к различным датчикам и получать от них информацию единообразно для всех стилей.
Важно, чтобы эта проблема была решена на уровне операционной системы.
Этот шаг может дать новый импульс развитию контекстно-зависимых приложений.
Ниже представлена схема, показывающая структуру объектов для работы с датчиками.
Далее мы рассмотрим это более подробно.
Чтобы подключить датчик к платформе Sensor and Location в Windows 7, необходимо реализовать для него драйвер и простые классы-оболочки в .
NET для работы с этим датчиком.
Конечно, конечные пользователи вряд ли смогут в полной мере ощутить возможности всей этой платформы в ближайшем будущем.
Разработчикам оборудования потребуется некоторое время для разработки и интеграции своих датчиков в аппаратные платформы.
Однако мы, разработчики, можем начать готовиться к этому уже сегодня.
Поэтому дальше я планирую рассказать о том, как работать с платформой Sensor and Location в контексте наших бизнес-приложений.
Для того, чтобы проводить эксперименты не с виртуальными датчиками, а с чем-то более-менее приближенным к реальности, мы будем использовать устройство от Freescale Semiconductor, построенное на базе микроконтроллера JMBADGE2008-B. Данное устройство представляет собой небольшую плату, на которой также имеется несколько датчиков — акселерометр, датчик освещенности и кнопки.
Этот устройство разработан специально для демонстрации возможностей платформы Sensor and Location в Windows 7. Фактически, каждый может купить его.
Так что это устройство хорошо подходит для демонстрации этой возможности Windows 7. Прежде чем рассматривать конкретные приложения, давайте посмотрим, как устроена платформа Sensor and Location. До появления Windows 7 и платформы Sensor&Location подключение различных датчиков сводилось к реализации драйвера и программного обеспечения для него.
При такой организации задача взаимодействия с внешними датчиками возможна, но сложна.
Для этого каждое приложение должно взаимодействовать с API, который предложит разработчик датчика и ПО, обслуживающего этот датчик.
Проблема особенно остра, если приложение должно использовать множество однотипных датчиков от разных производителей.
Как платформа Sensor&Location предлагает решить эту проблему? На уровне операционной системы есть механизмы работы с датчиками.
Имеется стандартный унифицированный программный интерфейс для работы с датчиками — Sensor API. При этом все взаимодействия с датчиком происходят через API датчика.
Важно, чтобы взаимодействие со всеми датчиками происходило в одном стиле.
Теперь вам не нужно интегрироваться с собственным API через p/invoke.
Чтобы работать с API датчиков и местоположения, необходимо загрузить соответствующую библиотеку примеров взаимодействия .
NET. Он содержит оболочки .
NET для работы с API Sensor. Он содержит несколько классов, с которыми можно работать с датчиками.
Класс SensorManager является точкой входа.
Через него можно получать информацию о датчиках, а также работать с ними.
Например, используя GetSensorBySensorId<> метода, вы можете получить доступ к интересующему нас датчику.
Каждый датчик должен иметь класс-оболочку, унаследованную от базового класса Sensor. В библиотеке примеров взаимодействия .
NET уже есть три таких реализации — AmbientLightSensor, Accelerometer3D, UnknownSensor.
Основная идея при работе с датчиками заключается в следующем.
При изменении состояния датчика (подключен/отключен/активен/и т.д.) генерируется событие StateChanged. Данное событие необходимо для начала или прекращения работы с датчиками.
После установления связи с датчиком при получении новых данных генерируется событие DataReportChanged. Как часто будет генерироваться это событие, зависит от реализации датчика и его драйвера.
При обработке этого события вы можете прочитать состояние датчиков и как-то изменить работу приложения.
Для этих целей используется метод GetProperty. В параметрах этого метода передается идентификатор свойства, которое необходимо считать с датчика.
Обычно подробности вызовов этого метода скрыты в классах, реализованных для конкретного датчика.
Кроме того, каждый датчик имеет свой идентификатор (GUID), по которому можно идентифицировать устройство.
При реализации класса-оболочки для датчика этот идентификатор указывается с помощью атрибута.
Таким образом, доступ к датчику можно получить либо явно указав идентификатор этого датчика, либо обратившись к этому классу-обертке.
/// /// Представляет собой стандартный датчик внешней освещенности /// [SensorDescription("97F115C8-599A-4153-8894-D2D12899918A")] открытый класс AmbientLightSensor: Датчик { //… //… //… var датчики = SensorManager.GetSensorsByTypeId ();Попробуем реализовать несколько примеров работы с датчиками, имеющимися в устройстве от Freescale. Мы будем работать с двумя типами датчиков – акселерометром (позволяет измерить угол наклона устройства) и датчиком освещенности (измеряет уровень освещенности в помещении).
Первое приложение, которое мы реализуем, будет отображать на форме уровень освещенности в виде горящей лампочки.
Во-первых, давайте подпишемся на событие изменения состояния в Sensor API. Это необходимо для того, чтобы приложение начало работать, если датчик подключен в пути.
В обработчике этого события мы получим список всех датчиков нужного типа и подпишемся на событие DataReportChanged от них.
В обработчике этого события мы прочитаем значение с датчика освещенности и запишем его в TextBox формы.
Поскольку событие генерируется в дополнительном потоке, вам также потребуется вызвать метод Dispatcher.Invoke, чтобы обработка происходила в основном потоке и мы могли взаимодействовать с элементами формы.
Таким образом мы получаем следующий код.
Private void Window_Loaded (отправитель объекта, RoutedEventArgs e) { SensorManager.SensorsChanged += SensorManagerSensorsChanged; } void SensorManagerSensorsChanged (изменение SensorsChangedEventArgs) { Dispatcher.Invoke((System.Threading.ThreadStart)(UpdateSensorsList)); } частная пустота UpdateSensorsList() { var датчики = SensorManager.GetSensorsByTypeId (); foreach (датчик var в датчиках) датчик.Теперь TextBox формы отображает текущее значение освещенности.DataReportChanged += делегат (отправитель датчика, EventArgs e) { Dispatcher.Invoke((System.Threading.ThreadStart)(делегат { если (ActiveSensorsListBox.SelectedItem == отправитель) { ТекущееЗначение.
Текст = ((AmbientLightSensor)отправитель).
CurrentLuminousIntensity.Intensity.ToString(); } })); }; }
Теперь не сложно реализовать для этого какую-то визуализацию.
Используя привязки в WPF, мы будем отображать степень освещенности в виде лампочек.
В результате мы получаем следующее приложение.
Поскольку по фотографии очень сложно судить о работе приложения, я записал небольшое видео, на котором хорошо видно, как сенсор реагирует на степень освещенности.
Демо > > Интереснее другой датчик — он позволяет определить степень наклона устройства по разным осям.
Чтобы продемонстрировать степень наклона, мы возьмем 3D-модель самолета для WPF-приложения и повернем ее в пространстве в зависимости от показаний датчика.
Принцип работы этого приложения аналогичен предыдущему — находим нужные датчики, подписываемся на события и при их обработке записываем координаты в поля ввода на форме.
После этого мы привязываем координаты модели к значениям этих полей ввода.
частная пустота UpdateSensorsList() { foreach (датчик var в SensorManager.GetSensorsByTypeId ()) { датчик.Как видно из этого примера, код работы с датчиками не сильно изменился.DataReportChanged += делегат (отправитель датчика, EventArgs e) { Dispatcher.Invoke((System.Threading.ThreadStart)(делегат { если (UseXCoordinate.IsChecked == true) CurrentXValue.Text = ((Accelerometer3D)sender).
CurrentAcceleration[Accelerometer3D.AccelerationAxis.X].
ToString(); if (UseYCoordinate.IsChecked == true) CurrentYValue.Text = ((Accelerometer3D)sender).
CurrentAcceleration[Accelerometer3D.AccelerationAxis.Y].
ToString(); if (UseZCoordinate.IsChecked == true) CurrentZValue.Text = ((Accelerometer3D)sender).
CurrentAcceleration[Accelerometer3D.AccelerationAxis.Z].
ToString(); })); }; } }
По сути, изменился только код получения данных с датчиков, остальное осталось неизменным.
Как видно на фото, при наклоне устройства датчик передает информацию в приложение и координаты модели меняются.
Таким образом, мы можем увидеть эффект наклона 3D-модели.
Демо > > Что интересно, эти датчики могут использовать несколько приложений одновременно.
Вы также можете использовать несколько датчиков в одном приложении.
Давайте объединим приложение вращения 3D-модели с датчиком освещенности.
В данном случае помимо вращения модели мы будем показывать солнце.
Если освещенность в комнате уменьшится, солнце тоже будет скрыто.
Чем больше освещения в комнате, тем интенсивнее будет светить солнце.
Соответственно, в этом приложении используется код из двух предыдущих примеров.
Поэтому код приводить не буду, а сразу покажу результат.
Вы также можете посмотреть это приложение в динамике.
Демо > > Эти примеры наглядно показывают, что работать с датчиками в Windows 7 очень просто.
Однако для этого вам понадобится драйвер для Windows 7 и класс-оболочка для платформы Sensor&Location. Как правило, драйверы предоставляет сам производитель аппаратной платформы, но класс-обертка может быть реализован самостоятельно.
Как я уже говорил, точкой входа является класс SensorManager. Используя этот класс, вы можете получить доступ к необходимым датчикам и работать с ними.
В этом классе есть такие методы, как получение списка всех датчиков, получение датчика по идентификатору или типу, запрос на использование датчика, а также событие для изменения количества датчиков в системе.
Каждый датчик имеет два основных типа идентификаторов — SensorId и TypeId. TypeId идентифицирует конкретный класс устройства.
Например, вы можете использовать его для получения всех датчиков освещенности в системе или некоторых других типов устройств.
SensorId присваивается уникально каждому устройству.
Например, если в системе три датчика движения одного типа, то каждый будет иметь уникальный идентификатор.
Также существует CategoryId, который группирует датчики по категориям.
Каждый идентификатор представляет собой GUID. Они задаются производителями при разработке устройств и драйверов.
Таким образом, получить конкретный датчик можно, только зная его идентификатор.
Каждый датчик представлен классом Sensor. Он имеет общую сенсорную информацию и методы, позволяющие получать данные из обобщенных коллекций в нетипизированном виде.
Понятно, что такое представление данных не очень удобно для наших приложений.
Поэтому для каждого датчика принято реализовывать класс-обертку внутри Sensor API. Он реализован путем наследования от общего класса Sensor. В демо-примерах таких реализаций уже две — для акселерометра и для датчика освещенности.
Однако устройство, которое мы рассмотрели ранее, также имеет сенсорные кнопки, которыми тоже можно пользоваться.
Итак, давайте реализуем такой класс для этого датчика.
Мы определим новый класс, который будет наследоваться от класса Sensor. Чтобы он был распознан в API датчика, он должен быть помечен атрибутом SensorDescription, в котором должен быть указан TypeId для этого типа датчика.
В базовом классе Sensor для нас есть две важные вещи — свойство DataReport и событие DataReportChanged. Это свойство содержит данные от датчика, и событие срабатывает при их изменении.
Задача нашего класса — взять эти данные и доставить их пользователю нашего класса в удобном виде.
Для этого мы создадим еще один небольшой класс, который будет анализировать информацию из DataReport. Экспериментальным путем выясним, что при нажатии кнопки 1 генерируется код 1, при нажатии 2 генерируется код 2, при нажатии 3 генерируется код 4, при нажатии 4 генерируется код 8. Видно, что здесь используются просто двоичные цифры.
Код 0 также генерируется, если все кнопки отпущены.
Итак, мы можем написать следующий код.
[Описание датчика("545C8BA5-B143-4545-868F-CA7FD986B4F6")] открытый класс SwitchArraySensor: Датчик { открытый класс SwitchArraySensorData { частный статический Guid KeyStateProperyId = новый Guid(@"38564a7c-f2f2-49bb-9b2b-ba60f66a58df"); общедоступный SwitchArraySensorData (отчет SensorReport) { состояние uint = (uint) report.Values[KeyStateProperyId][0]; Button1Pressed = (состояние & 0x01) != 0; Button2Pressed = (состояние & 0x02) != 0; Button3Pressed = (состояние & 0x04) != 0; Button4Pressed = (состояние & 0x08) != 0; } общественный bool Button1Pressed {get; частный набор; } общественный bool Button2Pressed {получить; частный набор; } общественный bool Button3Pressed {get; частный набор; } общественный bool Button4Pressed {получить; частный набор; } } общедоступный SwitchArraySensorData Current { получить {вернуть новый SwitchArraySensorData(DataReport); } } публичное событие EventHandler StateChanged; общедоступный SwitchArraySensor() { DataReportChanged += SwitchArraySensor_DataReportChanged; } void SwitchArraySensor_DataReportChanged (отправитель датчика, EventArgs e) { если (StateChanged!= ноль) { StateChanged.Invoke(отправитель, е); } } }По сути, этот класс является оберткой в Sensor API для нужного нам датчика.
Чтобы использовать его, мне нужно подписаться на событие StateChanged и получать информацию через свойство Current. Чтобы получить список доступных датчиков заданного типа, вы можете использовать метод GetSensorsByTypeId класса SensorManager. В этом случае TypeId этих датчиков будет определяться на основе указанного атрибута SensorDescription. Теперь с помощью этих датчиков мы можем подписываться на необходимые события и получать данные в удобном для приложения виде.
Например, мы можем отображать состояние нажатия кнопок в форме.
Private void Window_Loaded (отправитель объекта, RoutedEventArgs e) { var датчики = SensorManager.GetSensorsByTypeId (); foreach (датчик SwitchArraySensor в датчиках) { переключатель (sensor.FriendlyName) { случай «Левый датчик массива переключателей»: датчик.В результате мы получим вот такое приложение.StateChanged += делегат (объект leftSensor, EventArgs arg) { кнопки var = ((SwitchArraySensor) leftSensor).
Current; SwitchState(LeftButton1, button.Button1Pressed); SwitchState(LeftButton2, button.Button2Pressed); SwitchState(LeftButton3, button.Button3Pressed); SwitchState(LeftButton4, button.Button4Pressed); }; перерыв; корпус «Правый датчик массива переключателей»: датчик.
StateChanged += делегат (объект rightSensor, EventArgs arg) { кнопки var = ((SwitchArraySensor)rightSensor).
Current; SwitchState(RightButton1, button.Button1Pressed); SwitchState(RightButton2, button.Button2Pressed); SwitchState(RightButton3, button.Button3Pressed); SwitchState(RightButton4, button.Button4Pressed); }; перерыв; } } }
Конечно, пример реализации такого датчика достаточно синтетический.
Однако он наглядно демонстрирует процесс подключения датчика к API датчика.
Также, если вам необходимо реализовать собственный драйвер для устройства, чтобы подключиться к платформе Windows 7 Sensor and Location, рекомендую обратиться чиновник ресурс.
Удачи в создании контекстно-зависимых приложений! Демо-приложения: Ambient.zip Акселерометр3D.zip Комбинированный.
zip ButtonSensor.zip Теги: #Windows 7 #программирование #сенсор #сенсор и платформа определения местоположения #Разработка для Windows
-
Инвестиции
19 Oct, 24 -
Как Вывести Ваш Компьютер Из Эксплуатации
19 Oct, 24 -
Мировой Финансовый Кризис И Рунет
19 Oct, 24 -
Саундтрек №44
19 Oct, 24 -
Они Объявили Мне Войну?
19 Oct, 24 -
Мысли О Будущем Компьютерных Игр
19 Oct, 24