Опубликован: 15.05.2013 | Доступ: свободный | Студентов: 265 / 9 | Длительность: 24:25:00
Специальности: Системный архитектор
Лекция 10:

Устройства и печать

< Лекция 9 || Лекция 10: 123 || Лекция 11 >

Перечисление устройств в классе

Если вдруг вы знаете GUID интерфейса класса устройств для конкретной группы устройств, вы можете использовать статический метод Windows.Devices.Enumeration.DeviceInformation.findAllAsync (http://msdn.microsoft.com/library/windows/apps/br225435.aspx ) для получения подробной информации об этих устройствах. Подробности об этом можно найти в материале "Перечисление устройств" (http://msdn.microsoft.com/library/windows/apps/hh464977.aspx ), однако, позвольте мне сделать краткий обзор.

То, что передают в findAllAsync, называют селектором (selector), в частности, это срока Advanced Query Syntax (AQS) (http://msdn.microsoft.com/library/windows/desktop/bb266512.aspx ), с ними мы встречались в Главе 2 курса "Пользовательский интерфейс приложений для Windows 8, созданных с использованием HTML, CSS и JavaScript". Селектор устройства обычно выглядит так:

System.Devices.InterfaceClassGuid:="{E5323777-F976-4F5B-9B55-B94699C46E44}" 
AND System.Devices.InterfaceEnabled:=System.StructuredQueryType.Boolean#True

Здесь показан класс интерфейса GUID для вебкамер. Результат вызова findAllAsync это объект DeviceInformationCollection (http://msdn.microsoft.com/library/windows/apps/windows.devices.enumeration.deviceinformationcollection.aspx ), который может рассматриваться в JavaScript в виде массива объектов DeviceInformation (http://msdn.microsoft.com/library/windows/apps/windows.devices.enumeration.deviceinformation.aspx ). В Сценарии 1 примера "Перечисление устройств" (http://code.msdn.microsoft.com/windowsapps/Device-Enumeration-Sample-a6e45169 ) показано, как использовать этот массив для вывода подробной информации о каждом устройстве:

Windows.Devices.Enumeration.DeviceInformation.findAllAsync(selector, null).done(
function(devinfoCollection) {
var numDevices = devinfoCollection.length;
for (var i = 0; i<numDevices; i++) {	
displayDeviceInterface(devinfoCollection[i], id("scenario1Output"), i);
}	
});	

Некоторые результаты работы примера показаны на рис. 10.3 и рис. 10.4.

Вывод данных примером "Перечисление устройств" для вебкамеры – он отлично представляет камеру, прикрепленную к моему монитору

Рис. 10.3. Вывод данных примером "Перечисление устройств" для вебкамеры – он отлично представляет камеру, прикрепленную к моему монитору
Вывод данных примером "Перечисление устройств" для принтера, который выглядит точно так же, как тот, что стоит у моего стола

Рис. 10.4. Вывод данных примером "Перечисление устройств" для принтера, который выглядит точно так же, как тот, что стоит у моего стола

Сценарий 2 примера выполняет те же действия (с выводом в виде обычного текста) для объектов Plug and Play (PnP), используя Windows.Devices.Enumeration.Pnp.PnpObject.findAllAsync (http://msdn.microsoft.com/library/windows/apps/br225511.aspx ). Это API позволяет перечислять устройства по интерфейсу, классу интерфейса и контейнеру (видимые и локализованные сведения об устройстве, наподобие производителя и названия модели):

Windows.Devices.Enumeration.Pnp.PnpObject.findAllAsync(deviceContainerType,	
propertiesToRetrieve).done(function (containerCollection) {	
var numContainers = containerCollection.length;	
for (var i = 0; i<numContainers; i++) {	
displayDeviceContainer(containerCollection[i], id("scenario2Output"));
}	
});	

В вышеприведенном вызове переменная propertiesToRetrieve содержит массив строк, которые задают свойства Windows (http://msdn.microsoft.com/library/windows/desktop/dd561977.aspx ), которые вам интересны. В примере использованы следующие:

var propertiesToRetrieve = ["System.ItemNameDisplay", "System.Devices.ModelName", "System.Devices.Connected"];

Результат перечисления – переменная containerCollection в вышеприведенном коде – это коллекция PnpObjectCollection (http://msdn.microsoft.com/library/windows/apps/windows.devices.enumeration.pnp.pnpobjectcollection.aspx ), которая содержит экземпляры объекта PnpObject (http://msdn.microsoft.com/library/windows/apps/windows.devices.enumeration.pnp.pnpobject.aspx ). Пример берет информацию из этих объектов и выводит информацию по каждому из них в виде текста.

Обратите внимание, что существует вариант findAllAsync (http://msdn.microsoft.com/library/windows/apps/br225512.aspx ), который принимает AQS-строку в виде фильтра. Это строка, которую можно получить из API наподобие Windows.Devices.Portable.StorageDevice.getDeviceSelector (http://msdn.microsoft.com/library/windows/apps/windows.devices.portable.storagedevice.getdeviceselector.aspx ), которое упрощает перечисление подобных устройств.

Переносные устройства Windows и возможности Bluetooth

В дополнение к перечислению принтеров и вебкамер (так как у них есть стандартные GUID класса интерфейса), Сценарий 1 примера "Перечисление устройств" (http://code.msdn.microsoft.com/windowsapps/Device-Enumeration-Sample-a6e45169 ) так же работает с переностыми устройствами, как и пример "Переносные устройства" ( http://code.msdn.microsoft.com/windowsapps/Portable-Device-f97089b5). Это открывает нам дверь в тему Переносных устройств Windows (Windows Portable Devices или WPD) (http://msdn.microsoft.com/library/windows/hardware/gg463541.aspx ), технологии работы с драйверами, которая поддерживает устройства наподобии телефонов, цифровых камер, портативных медиа-проигрывателей и так далее, а так же – всё увеличивающийся класс Bluetooth-устройств, когда основная задача взаимодействия – передать данные между устройством и системой. WPD поддерживают инфраструктуру для реализации этой цели.

В WinRT, API Windows.Devices.Portable (http://msdn.microsoft.com/library/windows/apps/windows.devices.portable.aspx ) предоставляет средства для взаимодействия с этими устройства. Здесь вы можете найти классы ServiceDevice и StorageDevice. Оба просто предоставляют методы, которые возвращают строки селекторов и свойства id. В первом случае, однако, метод StorageDevice.fromId предоставляет объект Windows.Storage.StorageFolder посредством которого можно работать с содержимым устройства. Это показано в Сценарии 3 примера "Съемные носители информации" (http://code.msdn.microsoft.com/windowsapps/Removable-Storage-52cc49f0 ), который описан в Главе 2 курса "Пользовательский интерфейс приложений для Windows 8, созданных с использованием HTML, CSS и JavaScript". Он создает список съемных носителей информации, из которого можно выбрать устройства и затем показывает первое изображение, найденное на выбранном устройстве:


В примере о съемных носителях, в Сценарии 4, так же показано, как использовать автоматический запуск (AutoPlay) для автоматического вызова приложения, когда подключается подходящее устройство. Это включает в себя объявление в манифесте возможности Автозапуск содержимого (AutoPlay Content) (подключение устройства хранения данных) и/или Автозапуск устройства (AutoPlay Device) (подключение устройства). Смотрите материал "Запуск приложения с помощью автозапуска" (http://msdn.microsoft.com/library/windows/apps/hh452731.aspx ) для того, чтобы узнать подробности.

Что касается Bluetooth-устройств, то API Windows.Media.Devices.CallControl (http://msdn.microsoft.com/library/windows/apps/BR226746 ) предоставляет возможность работы с устройствами, имеющими отношение к телефонам. Смотрите материал "Управление вызовами на устройстве связи Bluetooth по умолчанию" (http://msdn.microsoft.com/library/windows/apps/hh452727.aspx ) и пример "Управление вызовами на Bluetooth-устройстве" (http://code.msdn.microsoft.com/windowsapps/Call-Control-b52ad696 ).

Другая группа Bluetooth-устройств включает в себя те, которые собирают сведения о физическом состоянии, о таком, как пульс, кровяное давление и температура. Смотрите материал "Bluetooth с низким энергопотреблением" в Википедии ( http://en.wikipedia.org/wiki/Bluetooth_low_energy). Работа с ними показана в примере "Устройства Bluetooth с низким энергопотреблением и сведения о физическом состоянии" (http://code.msdn.microsoft.com/windowsapps/Bluetooth-LE-Metro-sample-a2ba1b5b ), что мы кратко рассмотрим ниже, но в настоящее время доступ к таким устройствам ограничен приложениями для устройств.

Другой пример, "Простое управлени с помощью Bluetooth-устройства" (http://code.msdn.microsoft.com/windowsapps/Bluetooth-Simple-Key-e29ea456 ), кторый работает с контроллером CC2540 Mini Development Kit (http://www.ti.com/tool/cc2540dk-mini ). Это устройство было создано Texas Instruments для того, чтобы помочь разработке устройств на основе их микросхемы CC2540; в случае с примером, кнопки на устройстве управляют кнопками в приложении.

В последних двух примерах интересно то, как приложения подключаются к конкретному устройству с использованием элемента управления ActiveX, который называется PortableDeviceAutomation.Factory (один из нескольких доступных ActiveX-объектов такого рода). Например, для того, чтобы подключиться к термометру, мы сначала перечисляем устройство с помощью его GUID класса, {00001809-0000-1000-8000-00805f9b34fb} (смотрите js/thermometer.js в примере "Устройства Bluetooth с низким энергопотреблением и сведения о физическом состоянии"):

Windows.Devices.Enumeration.DeviceInformation.findAllAsync(
"System.Devices.InterfaceClassGuid:=\"{00001809-0000-1000-8000-00805f9b34fb}\"", null)
      

Результат этой асинхронной операции доступен в переменной, которая называется devices, а вот, как получают доступ к конкретному устройству и задают прослушиватели для его событий:

// Используется WPD Automation для инициализации объекта устройства
var deviceFactory = new ActiveXObject("PortableDeviceAutomation.Factory");

// Для целей данного примера инициализируем первое устройство
deviceFactory.getDeviceFromIdAsync(devices[0].id, function (device) {
//	Переменная 'device' содержит объект, соответствующий объекту устройства.
// Инициализация сервиса измерения температуры и ожидание результатов измерений
tempService = device.services[0];
tempService.onTemperatureMeasurement =
function (timestamp, thermometerMeasurementValue) {
// ...
};
});
      
< Лекция 9 || Лекция 10: 123 || Лекция 11 >