Соединение с устройствами, которые расположены близко устройства, на котором исполняется ваше приложение, это одна из областей, в которой я ожидаю увидеть самые креативные инновации в ближайшие годы, так как ПК всё чаще комплектуются соответствующим аппаратным обеспечением. В данном случае мы действительно говорим об "устройствах" в более общем смысле, чем обычно. В некоторых случаях это – отдельные самостоятельные устройства, в частности, Bluetooth-устройства или RFID-метки. Но мы так же говорим о приложениях, исполняющихся на компьютере, подключенных либо к собственному экземпляру, исполняющемуся на другом компьютере, либо к другому приложению с другого ПК. В этом смысле приложения могут взаимодействовать друг с другом так, если бы они сами были отдельными "устройствами".
Предостережение. Хотя различные приложения могут знать друг о друге и взаимодействовать друг с другом, требования Магазина Windows по сертификации не позволяют приложениям быть взаимозависимыми. Сценарии взаимодействия приложений – это способ расширить их функциональность, но приложения должны предоставлять ценность и тогда, когда исполняются в изоляции от других приложений.
Технология Near Field Communication (NFC) – это один из ключевых способов, с помощью которых приложения могут подключаться к устройствам и взаимодействовать, исполняясь на разных устройствах. NFC работает с электромагнитными датчиками (включая RFID-метки, которые не имеют автономного питания), которые входят друг с другом в резонанс, находясь рядом, в пределах 3-4 сантиметров. Практически говоря, это означает, что устройства физически контактируют друг с другом, что позволяет эффективно инициировать цифровое рукопожатие, установление соединения, начинающее процесс обмена данными. Когда это происходит между двумя копиями приложения, исполняющимися на разных устройствах, этот процесс известен как образование пар, соединение (pairing), в итоге, у приложений появляется возможность вести непрерывный обмен данными.
Думая в этой связи об "устройствах", учтите, что они могут очень сильно различаться. Таким образом, устройства, которые устанавливают соединение, не должны быть одинаковыми. Одно устройство может быть, например, вашим планшетным компьютером, а другое – чем-то от большого, включающего в себя массу функций дисплея ПК, до простой RFID-метки, вмонтированной в плакат или в бейдж с именем.
Приложения так же могут узнавать о других приложениях, исполняющихся на других устройствах, посредством WiFi Direct (если беспроводной адаптер это поддерживает) и Bluetooth. В подобных случаях возможно, чтобы приложение произвело поиск доступных (объявленных) соединений на других устройствах, которые могут исходить от копии того же самого приложения, а могут и от другого.
В любом случае, работа с бесконтактным взаимодействием устройств – как обо всём этом можно сказать – полезна для многих сценариев, таких, как передача полезного содержимого, многопользовательские игры, широковещательная передача данных и, на самом деле, всё что угодно другое, предусмативающее обмен какими-то данными, в том числе – единовременная передача каких-либо данных или установка постоянного соединения.
Существуют три основных условия для использования возможностей бесконтактного взаимодействия (смотрите материал "Руководство по разработке с использованием бесконтактного взаимодействия" (http://msdn.microsoft.com/library/windows/apps/hh465215.aspx)):
API для работы с бесконтактного взаимодействия находятся в пространстве имен Windows.Networking.Proximity ( http://msdn.microsoft.com/library/windows/apps/windows.networking.proximity.aspx), как в примере "Бесконтактное взаимодействие" (http://code.msdn.microsoft.com/windowsapps/Proximity-Sample-88129731), с которым мы будем здесь работать. Понятно, что разработка для бесконтактного взаимодействия требует наличия двух компьютеров, оборудованных соответствующим образом (если только вы не работаете только с RFID-метками). Для NFC-соединения между двумя устройствами имеется пример драйвера в Windows Driver Kit, который имитирует NFC-соединение, используя обычное сетевое соединение. Для того, чтобы его использовать, учтите, что вам так же понадобится Visual Studio 2012 Ultimate Edition; Express-версия не поддерживает разработку драйверов. Больше смысла будет в том, чтобы просто приобрести несколько планшетных компьютеров, поддерживающих NFC.
В любом случае, для установки Windows Driver Kit, следуйте инструкциям о том, как это сделать (http://msdn.microsoft.com/en-US/windows/hardware/gg487428) после установки Visual Studio 2012 Ultimate. Когда вы начнете загрузку, не пугайтесь указанного размера в 1 Гб. Запустите установщик (его размер 937 Кб), и затем выберите опцию для получения набора для использования на другом компьютере (что, на самом деле, приводит к загрузке 307 Мб). Затем, следуя странице описания примера бесконтактного взаимодействия:
После того, как вы установите WDK и примеры, вы можете найти пример реализации драйвера бесконтактного взаимодействия в папке src\nfp там, куда вы установили примеры WDK. Просмотрите файл NetNfpProvider.html в папке src\nfp\net для того, чтобы найти инструкции по построению и запуску имитатора. [Примечание: не забудьте задать целью построения Windows 8]. После запуска имитатора, он выполняется в фоновом режиме, пока ваше приложение для работы с бесконтактным взаимодействием исполняется на переднем плане. Ваше приложение должно работать на переднем плане для того, чтобы имитация касания устройств могла работать.
Принимая во внимание, таким образом, что у вас есть среда, где бесконтактное взаимодействие можно, по крайней мере, имитировать, посмотрим на два основных сценария в следующих разделах. Первый использует класс PeerFinder для создания соединения на основе сокетов между двумя одноранговыми приложениями для продолжительного сеанса связи. Второй использует класс ProximityDevice для передачи пакетов между устройствами.
Для реализации поиска одноранговых приложений, приложение на одном из компьютеров может объявить о своей доступности, таким образом, приложения на других устройствах могут обнаружить экземпляры приложения, заявившие о себе и инициировать подключение через WiFi Direct или Bluetooth. Второй способ поиска заключается в использовании касания NFC. Оба метода показаны в Сценарии 1 примера "Бесконтактное взаимодействие" (http://code.msdn.microsoft.com/windowsapps/Proximity-Sample-88129731), но три различные функции: объявление, поиск и касание для соединения перемешаны, так как каждая из них использует и отдельные части класса Windows.Networking.Proximity.PeerFinder (http://msdn.microsoft.com/library/windows/apps/windows.networking.proximity.peerfinder.aspx), и, в то же время, некоторые общие для всех части.
В частности, общее у них статическое свойство PeerFinder.supportedDiscoveryTypes, которое указывает на то, как может быть выполнено подключение. Оно содержит комбинацию значений из перечисления PeerDiscoveryTypes и зависит от доступного на устройстве аппаратного обеспечения. Это следующие значения: browse (доступен WiFi Direct), triggered (доступно касание NFC), и none (нет возможности пользоваться PeerFinder). Вы можете использовать эти значения для выборочного включения или выключения определенных возможностей приложения. Сценарий 1 примера о бесконтактном взаимодействии, например, проверяет доступные типы подключения для установки некоторых флагов и включения кнопок для работы с NFC. В противном случае он просто показывает разочарующие сообщения (код взят из js/PeerFinder.js, и обратите внимание на переменную для пространства имен в верхней части):
var ProxNS = Windows.Networking.Proximity;
var supportedDiscoveryTypes = ProxNS.PeerFinder.supportedDiscoveryTypes;
// Активировать интерфейс, предназначенный для реализации NFC-касаний при наличии поддержки аппаратного обеспечения
if (supportedDiscoveryTypes pg ProxNS.PeerDiscoveryTypes.triggered) {
triggeredConnectSupported = true;
} else {
peerFinderErrorMsg = "Tap based discovery of peers not supported \n";
}
// Активировать кнопки, связанные с просмотром только при наличии поддержки соответтсвующего аппаратного обеспечения
if (supportedDiscoveryTypes pg ProxNS.PeerDiscoveryTypes.browse) {
browseConnectSupported = true;
// [Добавить прослушиватели к кнопкам, опущено]
} else {
// [Покаать сообщения, опущено]
}
if (triggeredConnectSupported || browseConnectSupported) {
// [Настроить дополнительный пользовательский интерфейс]
}
// ...
}
Теперь давайте посмотрим, как приложения узнают друг о друге.
Процесс предложения подключения состоит из двух частей: объявление о возможности принять подключение и прослушивание на предмет входящих подключений.
Предполагая, что доступен какой-либо способ взаимодействия, первый шаг заключается в конфигурировании PeerFinder с помощью displayName , которое будет видно другим устройствам, когда вы объявите о возможности подключения и установка параметров allowBluetooth, allowInfrastructure, и allowWiFiDirect желаемым образом для позволения обнаружения устройства с помощью дополнительных способов связи (infrastructure jnyjcbncz r TCP/IP). Если не устанавливать ни один из этих флагов, то соединение, всё равно, будет доступно посредством NFC-касания, которое активировано всегда.
Далее, нужно настроить обработчик для события ), за которым следует вызов статического метода PeerFinder.start (снова, ProxNS это переменная для пространства имен):
ProxNS.PeerFinder.onconnectionrequested = connectionRequestedEventHandler; ProxNS.PeerFinder.start();
Примечание. connectionrequested это событие, которое исходит из WinRT. Так как вы, возможно, будете прослушивать это событие лишь временно, не забудьте вызвать removeEventListener или присвоить null свойству события для предотвращения утечки памяти. Подробнее об этом – в Главе 3 курса "Введение в разработку приложений для Windows 8 с использованием HTML, CSS и JavaScript".
Событие ), который содержит единственное свойство – ). Это простой объект, он содержит лишь displayName, но этого достаточно чтобы установить соединение.
function connectionRequestedEventHandler(e) {
requestingPeer = e.peerInformation;
ProximityHelpers.displayStatus("Connection Requested from peer: "
+ requestingPeer.displayName);
// Включает кнопку Accept (Принять) (и скрывает Send (отправить)и Message (Сообщение)) [некоторый код опущен]
ProximityHelpers.id("peerFinder_AcceptRequest").style.display = "inline";
}
Соединение устанавливается путём передачи данного объекта ). Это вызовет показ запроса для получения согласия пользователя, и получив это согласие, обработчик завершения полкчит объект Windows.Networking.Sockets.StreamSocket, о котором мы уже говорили в Главе 3.
function peerFinder_AcceptRequest() {
ProxNS.PeerFinder.connectAsync(requestingPeer).done(function (proximitySocket) {
startSendReceive(proximitySocket);
});
}
С этого момента вы можете отправлять любые данные, с использованием любого протокола, при условии, конечно, что приложение на другом конце сможет распознать то, что вы отправили. Это не проблема, когда на обеих концах соединения находится одно и то же приложение; разные приложения, конечно, нуждаются в использовании какого-то известного и одному и другому протокола. В примере "протокол" обмена предельно прост, но он отражает сущность всего этого процесса.
Если нужно прекратить объявление о доступности подключения, можно воспользоваться методом PeerFinder.stop. Для того, чтобы закрыть конкретное подключение, вызовите метод сокета close.
С другой стороны бесконтактного взаимодействия, приложение может искать одноранговые приложения, которые предлагают подключение по WiFi Direct или Bluetooth. В примере о бесконтактном взаимодействии, кнопка Browse Peers (Найти доступные подключения) доступна, если доступен вид обнаружения browse. Нажатие на кнопку приводит к вызову следующей функции (js/PeerFinder.js), которая использует PeerFinder.findAllPeersAsync (http://msdn.microsoft.com/library/windows/apps/windows.networking.proximity.peerfinder.findallpeersasync.aspx) для заполнения списка возможных соединений, включая соединения от различных приложений:
function peerFinder_BrowsePeers() {
// Очищение текущего списка опций [код опущен]
ProxNS.PeerFinder.findAllPeersAsync().done(function (peerInfoCollection) {
// Добавление найденного предложения о подключении в выпадающий список.
for (i = 0; i<peerInfoCollection.size; i++) {
var peerInformation = peerInfoCollection[i];
// Создание и добавление элемента опции с использованием peerInformation.displayName
// к элементу управления peerFinder_FoundPeersList [код опущен]
}
});
}
Когда вы выбираете одно из предложений для подключения, пример берет его объект PeerInformation и вызывает PeerFinder.connectAsync как и ранее (при этом у пользователя запрашивается согласие):
function peerFinder_Connect() {
var foundPeersList = ProximityHelpers.id("peerFinder_FoundPeersList");
var peerToConnect = discoveredPeers[foundPeersList.selectedIndex];
ProxNS.PeerFinder.connectAsync(peerToConnect).done(
function (proximitySocket) {
startSendReceive(proximitySocket);
});
}
Снова, здесь вы получаете, в качестве результата StreamSocket , которым можно пользоваться так, как нужно. Для завершения соединения, вызовите метод сокета close.
Для того, чтобы обнаружить непосредственное сближение устройств с NFC-модулем (касание, поднесение) которое используется для соединения приложений, исполняющихся на двух устройствах, нужно прослушивать событие ) (событие WinRT, имя которого я написал, используя "верблюжий" стиль, чтобы его можно было нормально прочесть!). В ответ на это запускают PeerFinder:
ProxNS.PeerFinder.ontriggeredconnectionstatechanged = triggeredConnectionStateChangedEventHandler;
ProxNS.PeerFinder.start();
Процесс соединения посредством касания проходит через последовательность изменения состояния (включая согласие пользователя), эти состояния описаны в перечислении ): )), и когда дело доходит до completed, свойство socket в аргументах события будет содержать StreamSocket для соединения:
function triggeredConnectionStateChangedEventHandler(e) {
// [Другие случаи опущены]
if (e.state === ProxNS.TriggeredConnectState.completed) {
startSendReceive(e.socket);
}
}
Снова, с этого момента, возможна передача данных через сокет – NFC-касание – это лишь средство для установления соединения. И, снова, вызовите метод close сокета, когда завершите работу с ним.
Когда NFC-касание подразумевает связь экземпляров одного и того же приложения на разных устройствах, можно организовать и запуск приложения по касанию на одном из устройств. Таким образом, когда приложение исполняется на одном из устройств и запустило PeerFinder, Windows значет, что это за приложение и может произвести поиск его копии на другом устройстве. Если устройство найдено, система может его запустить (или активировать, если оно уже запущено). Обработчик активации приложения вызывается с видом активации launch, где eventArgs.detail.arguments будет содержать строку "Windows.Networking.Proximity.PeerFinder:StreamSocket" (смотрите js/default.js):
var tapLaunch = ((eventObject.detail.kind === Windows.ApplicationModel.Activation.ActivationKind.launch)
pgpg (eventObject.detail.arguments === "Windows.Networking.Proximity.PeerFinder:StreamSocket"));
if (tapLaunch) {
url = scenarios[0].url; // Выполнение сценария 0, если запущено по касанию, для запуска PeerFinder.
}
return WinJS.Navigation.navigate(url, tapLaunch);
Код Сценария 1 учитывает это условие (параметр tapLaunch в WinJS.Navigation.Navigate установлен в true) и автоматически вызвает PeerFinder.start вместо того, чтобы ожидать нажатия на кнопку. При запуске, приложение так же регистрирует собственный обработчик triggeredConnectionStateChanged таким образом оно получит сокет, когда процесс соединения завершится.
Хотя PeerFinder настраивает StreamSocket и это хорошо подходит для сценариев, которые предусматривают длительное взаимодействие, другие сценарии – такие, как отправка фотографии, ссылку, или данных любого рода, в том числе – данных с RFID-метки – нужно лишь отправить некоторые данные с одного устройства на другое и больше ничего.
Для подобных целей у нас есть класс ), который можно получить следующим образом:
var proximityDevice = Windows.Networking.Proximity.ProximityDevice.getDefault();
Приложение, у которого есть данные, которыми оно хочет поделиться с другоими "публикует" сообщение об этом в форме строки, URI или буфера двоичных данных. RFID-метки публикуют свои сообщения пассивно. Приложение, с другой стороны, использует класс ), ), и ) (и метод stopPublishing). Например, вот код, взятый из Сценария 2 примера о бесконтактном взаимодействии (js/ProximityDevice.js, здесь publishText содержит данные из элемента управления):
var publishedMessageId = proximityDevice.publishMessage("Windows.SampleMessageType", publishText);
С другой стороны, приложение, которое хочет принять подобное сообщение, вызывает ), передавая имя сообщения, которое оно ожидает вместе с обработчиком, куда прибывает сообщение:
var subscribedMessageId = proximityDevice.subscribeForMessage
("Windows.SampleMessageType", messageReceived);
function messageReceived(receivingDevice, message) {
// Обработка сообщения
}
Если приложение больше не заинтересовано в подобных сообщениях, оно вызывает ).
На примере этого простого протокола, вы можете видеть, что приложение, которое поддерживает возможность "Поднести и отправить" ("Tap to share") (как она называется) может публиковать сообщения, когда у него есть подходящее содержимое. Оно так же может использовать события devicearrived (http://msdn.microsoft.com/library/windows/apps/windows.networking.proximity.proximitydevice.devicearrived.aspx) и devicedeparted (http://msdn.microsoft.com/library/windows/apps/windows.networking.proximity.proximitydevice.devicedeparted.aspx) объекта ProximityDevice для того, чтобы узнать, когда другое одноранговое устройство, поддерживающее возможность "Поднести и отправить" оказывается в зоне ближнего взаимодействия, то есть сообщение можно публиковать (это события WinRT). Событие devicearrived – это инструмент, с помощью которого можно обнаружить, что RFID-метка оказалась в зоне ближнего взаимодействия (смотрите ниже).
О чем интересно подумать, однако, так это о том, какие данные можно передавать таким способом. Рассмотрим приложение для организации путешествий, в котором вы можете бронировать авиабилеты, отели, заказывать аренду автомобилей, и, возможно, делать многое другое. Оно может, конечно, публиковать сообщения с основными сведениями, но так же может опубликовать и двоичное сообщение с подробными сведениями, которое позволит передать все сведения о вашем путешествии тому же самому приложению, которое исполняется на другом устройстве, обычно – другому пользователю. Это позволит одному человеку спланировать путешествие и потом передать эти данные другому, который потом лишь нажмет кнопку "Забронировать" и всё будет сделано! Это может быть гораздо более эффективным подходом, чем использование электронной почты для передачи подобных данных о путешествии в виде обычного текста, который другому человеку потом придется вручную вводить в программу.
Публикация URI методом "Поднести и отправить" делает предельно простой возможность, с помощью которой один пользователь может передать другому то, что видит сам, опять же, избегая обходных путей с использованием электронной почты или других форм передачи данных. Быстрое прикосновение – и вы видите то же, что вижу я. Опять же, есть много всего, что можно передать подобным образом, таким образом над этим стоит подумать, особенно если вы разрабатываете своё приложение для мобильных устройств. "Чем обычно заняты люди, которые находятся поблизости друг от друга?". Это – хороший вопрос и ответить на него вы можете с помощью отличного приложения, реализующего возможности бесконтактного взаимодействия.
Обратите внимание, что URI, которое вы передаете, может и не быть в форме http:// - ссылки на вебсайт, но может содержать любую схему URI. Если есть приложение, сопоставленное с данной схемой URI, операция "Поднести и отправить" превращается в операцию касания для активации, так как Windows запустит приложение по умолчанию для данного сопоставления. А если сопоставления не найдено Windows спросит, хотите ли вы загрузить подходящее приложение из Магазина Windows. Вы, конечно, можете использовать и URI Магазина Windows, которые ведут пользователя к прямой возможности установки приложения. Эти URI описаны в материале "Ссылки на приложение" (http://msdn.microsoft.com/library/windows/apps/hh974767.aspx).
Подобные URI делают возможным реализацию сценарий отправки данных и активации приложений для RFID-меток, сообщения в которых обычно записаны в неизменяемую память устройства. Когда вы касаетесь RFID-метки устройством с NFC-модулем, объект ProximityDevice вызывает событие devicearrived. Приложение затем может принять сообщение от метки посредством ProximityDevice.subscribeForMessage. Это означает, что приложению нужно знать тип сообщения, которое может быть отправлено от подобной метки – это может быть некий стандартный тип, или приложение может быть специально написано для конкретного вида меток. Например, художественная галерея может расположить метки около каждого экспоната и разместить в Магазине Windows приложение для данной галереи (или для любых других галерей, которые работают вместе). Это приложение будет знать, какие сообщения могут приходить от меток. Если сообщение имеет подходящую схему URI, прикосновение к RFID-метке может помочь пользователю получить приложение и наслаждаться расширенными возможностями.
Для того, чтобы узнать об этом больше, обратитесь к сообщениям, имеющим отношение к NFC, в блоге для разработчиков приложений для Windows (http://blogs.msdn.com/b/windowsappdev_ru /).
Соединение с устройствами, которые расположены близко устройства, на котором исполняется ваше приложение, это одна из областей, в которой я ожидаю увидеть самые креативные инновации в ближайшие годы, так как ПК всё чаще комплектуются соответствующим аппаратным обеспечением. В данном случае мы действительно говорим об "устройствах" в более общем смысле, чем обычно. В некоторых случаях это – отдельные самостоятельные устройства, в частности, Bluetooth-устройства или RFID-метки. Но мы так же говорим о приложениях, исполняющихся на компьютере, подключенных либо к собственному экземпляру, исполняющемуся на другом компьютере, либо к другому приложению с другого ПК. В этом смысле приложения могут взаимодействовать друг с другом так, если бы они сами были отдельными "устройствами".
Предостережение. Хотя различные приложения могут знать друг о друге и взаимодействовать друг с другом, требования Магазина Windows по сертификации не позволяют приложениям быть взаимозависимыми. Сценарии взаимодействия приложений – это способ расширить их функциональность, но приложения должны предоставлять ценность и тогда, когда исполняются в изоляции от других приложений.
Технология Near Field Communication (NFC) – это один из ключевых способов, с помощью которых приложения могут подключаться к устройствам и взаимодействовать, исполняясь на разных устройствах. NFC работает с электромагнитными датчиками (включая RFID-метки, которые не имеют автономного питания), которые входят друг с другом в резонанс, находясь рядом, в пределах 3-4 сантиметров. Практически говоря, это означает, что устройства физически контактируют друг с другом, что позволяет эффективно инициировать цифровое рукопожатие, установление соединения, начинающее процесс обмена данными. Когда это происходит между двумя копиями приложения, исполняющимися на разных устройствах, этот процесс известен как образование пар, соединение (pairing), в итоге, у приложений появляется возможность вести непрерывный обмен данными.
Думая в этой связи об "устройствах", учтите, что они могут очень сильно различаться. Таким образом, устройства, которые устанавливают соединение, не должны быть одинаковыми. Одно устройство может быть, например, вашим планшетным компьютером, а другое – чем-то от большого, включающего в себя массу функций дисплея ПК, до простой RFID-метки, вмонтированной в плакат или в бейдж с именем.
Приложения так же могут узнавать о других приложениях, исполняющихся на других устройствах, посредством WiFi Direct (если беспроводной адаптер это поддерживает) и Bluetooth. В подобных случаях возможно, чтобы приложение произвело поиск доступных (объявленных) соединений на других устройствах, которые могут исходить от копии того же самого приложения, а могут и от другого.
В любом случае, работа с бесконтактным взаимодействием устройств – как обо всём этом можно сказать – полезна для многих сценариев, таких, как передача полезного содержимого, многопользовательские игры, широковещательная передача данных и, на самом деле, всё что угодно другое, предусмативающее обмен какими-то данными, в том числе – единовременная передача каких-либо данных или установка постоянного соединения.
Существуют три основных условия для использования возможностей бесконтактного взаимодействия (смотрите материал "Руководство по разработке с использованием бесконтактного взаимодействия" (http://msdn.microsoft.com/library/windows/apps/hh465215.aspx)):
API для работы с бесконтактного взаимодействия находятся в пространстве имен Windows.Networking.Proximity ( http://msdn.microsoft.com/library/windows/apps/windows.networking.proximity.aspx), как в примере "Бесконтактное взаимодействие" (http://code.msdn.microsoft.com/windowsapps/Proximity-Sample-88129731), с которым мы будем здесь работать. Понятно, что разработка для бесконтактного взаимодействия требует наличия двух компьютеров, оборудованных соответствующим образом (если только вы не работаете только с RFID-метками). Для NFC-соединения между двумя устройствами имеется пример драйвера в Windows Driver Kit, который имитирует NFC-соединение, используя обычное сетевое соединение. Для того, чтобы его использовать, учтите, что вам так же понадобится Visual Studio 2012 Ultimate Edition; Express-версия не поддерживает разработку драйверов. Больше смысла будет в том, чтобы просто приобрести несколько планшетных компьютеров, поддерживающих NFC.
В любом случае, для установки Windows Driver Kit, следуйте инструкциям о том, как это сделать (http://msdn.microsoft.com/en-US/windows/hardware/gg487428) после установки Visual Studio 2012 Ultimate. Когда вы начнете загрузку, не пугайтесь указанного размера в 1 Гб. Запустите установщик (его размер 937 Кб), и затем выберите опцию для получения набора для использования на другом компьютере (что, на самом деле, приводит к загрузке 307 Мб). Затем, следуя странице описания примера бесконтактного взаимодействия:
После того, как вы установите WDK и примеры, вы можете найти пример реализации драйвера бесконтактного взаимодействия в папке src\nfp там, куда вы установили примеры WDK. Просмотрите файл NetNfpProvider.html в папке src\nfp\net для того, чтобы найти инструкции по построению и запуску имитатора. [Примечание: не забудьте задать целью построения Windows 8]. После запуска имитатора, он выполняется в фоновом режиме, пока ваше приложение для работы с бесконтактным взаимодействием исполняется на переднем плане. Ваше приложение должно работать на переднем плане для того, чтобы имитация касания устройств могла работать.
Принимая во внимание, таким образом, что у вас есть среда, где бесконтактное взаимодействие можно, по крайней мере, имитировать, посмотрим на два основных сценария в следующих разделах. Первый использует класс PeerFinder для создания соединения на основе сокетов между двумя одноранговыми приложениями для продолжительного сеанса связи. Второй использует класс ProximityDevice для передачи пакетов между устройствами.
Для реализации поиска одноранговых приложений, приложение на одном из компьютеров может объявить о своей доступности, таким образом, приложения на других устройствах могут обнаружить экземпляры приложения, заявившие о себе и инициировать подключение через WiFi Direct или Bluetooth. Второй способ поиска заключается в использовании касания NFC. Оба метода показаны в Сценарии 1 примера "Бесконтактное взаимодействие" (http://code.msdn.microsoft.com/windowsapps/Proximity-Sample-88129731), но три различные функции: объявление, поиск и касание для соединения перемешаны, так как каждая из них использует и отдельные части класса Windows.Networking.Proximity.PeerFinder (http://msdn.microsoft.com/library/windows/apps/windows.networking.proximity.peerfinder.aspx), и, в то же время, некоторые общие для всех части.
В частности, общее у них статическое свойство PeerFinder.supportedDiscoveryTypes, которое указывает на то, как может быть выполнено подключение. Оно содержит комбинацию значений из перечисления PeerDiscoveryTypes и зависит от доступного на устройстве аппаратного обеспечения. Это следующие значения: browse (доступен WiFi Direct), triggered (доступно касание NFC), и none (нет возможности пользоваться PeerFinder). Вы можете использовать эти значения для выборочного включения или выключения определенных возможностей приложения. Сценарий 1 примера о бесконтактном взаимодействии, например, проверяет доступные типы подключения для установки некоторых флагов и включения кнопок для работы с NFC. В противном случае он просто показывает разочарующие сообщения (код взят из js/PeerFinder.js, и обратите внимание на переменную для пространства имен в верхней части):
var ProxNS = Windows.Networking.Proximity;
var supportedDiscoveryTypes = ProxNS.PeerFinder.supportedDiscoveryTypes;
// Активировать интерфейс, предназначенный для реализации NFC-касаний при наличии поддержки аппаратного обеспечения
if (supportedDiscoveryTypes pg ProxNS.PeerDiscoveryTypes.triggered) {
triggeredConnectSupported = true;
} else {
peerFinderErrorMsg = "Tap based discovery of peers not supported \n";
}
// Активировать кнопки, связанные с просмотром только при наличии поддержки соответтсвующего аппаратного обеспечения
if (supportedDiscoveryTypes pg ProxNS.PeerDiscoveryTypes.browse) {
browseConnectSupported = true;
// [Добавить прослушиватели к кнопкам, опущено]
} else {
// [Покаать сообщения, опущено]
}
if (triggeredConnectSupported || browseConnectSupported) {
// [Настроить дополнительный пользовательский интерфейс]
}
// ...
}
Теперь давайте посмотрим, как приложения узнают друг о друге.
Процесс предложения подключения состоит из двух частей: объявление о возможности принять подключение и прослушивание на предмет входящих подключений.
Предполагая, что доступен какой-либо способ взаимодействия, первый шаг заключается в конфигурировании PeerFinder с помощью displayName , которое будет видно другим устройствам, когда вы объявите о возможности подключения и установка параметров allowBluetooth, allowInfrastructure, и allowWiFiDirect желаемым образом для позволения обнаружения устройства с помощью дополнительных способов связи (infrastructure jnyjcbncz r TCP/IP). Если не устанавливать ни один из этих флагов, то соединение, всё равно, будет доступно посредством NFC-касания, которое активировано всегда.
Далее, нужно настроить обработчик для события ), за которым следует вызов статического метода PeerFinder.start (снова, ProxNS это переменная для пространства имен):
ProxNS.PeerFinder.onconnectionrequested = connectionRequestedEventHandler; ProxNS.PeerFinder.start();
Примечание. connectionrequested это событие, которое исходит из WinRT. Так как вы, возможно, будете прослушивать это событие лишь временно, не забудьте вызвать removeEventListener или присвоить null свойству события для предотвращения утечки памяти. Подробнее об этом – в Главе 3 курса "Введение в разработку приложений для Windows 8 с использованием HTML, CSS и JavaScript".
Событие ), который содержит единственное свойство – ). Это простой объект, он содержит лишь displayName, но этого достаточно чтобы установить соединение.
function connectionRequestedEventHandler(e) {
requestingPeer = e.peerInformation;
ProximityHelpers.displayStatus("Connection Requested from peer: "
+ requestingPeer.displayName);
// Включает кнопку Accept (Принять) (и скрывает Send (отправить)и Message (Сообщение)) [некоторый код опущен]
ProximityHelpers.id("peerFinder_AcceptRequest").style.display = "inline";
}
Соединение устанавливается путём передачи данного объекта ). Это вызовет показ запроса для получения согласия пользователя, и получив это согласие, обработчик завершения полкчит объект Windows.Networking.Sockets.StreamSocket, о котором мы уже говорили в Главе 3.
function peerFinder_AcceptRequest() {
ProxNS.PeerFinder.connectAsync(requestingPeer).done(function (proximitySocket) {
startSendReceive(proximitySocket);
});
}
С этого момента вы можете отправлять любые данные, с использованием любого протокола, при условии, конечно, что приложение на другом конце сможет распознать то, что вы отправили. Это не проблема, когда на обеих концах соединения находится одно и то же приложение; разные приложения, конечно, нуждаются в использовании какого-то известного и одному и другому протокола. В примере "протокол" обмена предельно прост, но он отражает сущность всего этого процесса.
Если нужно прекратить объявление о доступности подключения, можно воспользоваться методом PeerFinder.stop. Для того, чтобы закрыть конкретное подключение, вызовите метод сокета close.
С другой стороны бесконтактного взаимодействия, приложение может искать одноранговые приложения, которые предлагают подключение по WiFi Direct или Bluetooth. В примере о бесконтактном взаимодействии, кнопка Browse Peers (Найти доступные подключения) доступна, если доступен вид обнаружения browse. Нажатие на кнопку приводит к вызову следующей функции (js/PeerFinder.js), которая использует PeerFinder.findAllPeersAsync (http://msdn.microsoft.com/library/windows/apps/windows.networking.proximity.peerfinder.findallpeersasync.aspx) для заполнения списка возможных соединений, включая соединения от различных приложений:
function peerFinder_BrowsePeers() {
// Очищение текущего списка опций [код опущен]
ProxNS.PeerFinder.findAllPeersAsync().done(function (peerInfoCollection) {
// Добавление найденного предложения о подключении в выпадающий список.
for (i = 0; i<peerInfoCollection.size; i++) {
var peerInformation = peerInfoCollection[i];
// Создание и добавление элемента опции с использованием peerInformation.displayName
// к элементу управления peerFinder_FoundPeersList [код опущен]
}
});
}
Когда вы выбираете одно из предложений для подключения, пример берет его объект PeerInformation и вызывает PeerFinder.connectAsync как и ранее (при этом у пользователя запрашивается согласие):
function peerFinder_Connect() {
var foundPeersList = ProximityHelpers.id("peerFinder_FoundPeersList");
var peerToConnect = discoveredPeers[foundPeersList.selectedIndex];
ProxNS.PeerFinder.connectAsync(peerToConnect).done(
function (proximitySocket) {
startSendReceive(proximitySocket);
});
}
Снова, здесь вы получаете, в качестве результата StreamSocket , которым можно пользоваться так, как нужно. Для завершения соединения, вызовите метод сокета close.
Для того, чтобы обнаружить непосредственное сближение устройств с NFC-модулем (касание, поднесение) которое используется для соединения приложений, исполняющихся на двух устройствах, нужно прослушивать событие ) (событие WinRT, имя которого я написал, используя "верблюжий" стиль, чтобы его можно было нормально прочесть!). В ответ на это запускают PeerFinder:
ProxNS.PeerFinder.ontriggeredconnectionstatechanged = triggeredConnectionStateChangedEventHandler;
ProxNS.PeerFinder.start();
Процесс соединения посредством касания проходит через последовательность изменения состояния (включая согласие пользователя), эти состояния описаны в перечислении ): )), и когда дело доходит до completed, свойство socket в аргументах события будет содержать StreamSocket для соединения:
function triggeredConnectionStateChangedEventHandler(e) {
// [Другие случаи опущены]
if (e.state === ProxNS.TriggeredConnectState.completed) {
startSendReceive(e.socket);
}
}
Снова, с этого момента, возможна передача данных через сокет – NFC-касание – это лишь средство для установления соединения. И, снова, вызовите метод close сокета, когда завершите работу с ним.
Когда NFC-касание подразумевает связь экземпляров одного и того же приложения на разных устройствах, можно организовать и запуск приложения по касанию на одном из устройств. Таким образом, когда приложение исполняется на одном из устройств и запустило PeerFinder, Windows значет, что это за приложение и может произвести поиск его копии на другом устройстве. Если устройство найдено, система может его запустить (или активировать, если оно уже запущено). Обработчик активации приложения вызывается с видом активации launch, где eventArgs.detail.arguments будет содержать строку "Windows.Networking.Proximity.PeerFinder:StreamSocket" (смотрите js/default.js):
var tapLaunch = ((eventObject.detail.kind === Windows.ApplicationModel.Activation.ActivationKind.launch)
pgpg (eventObject.detail.arguments === "Windows.Networking.Proximity.PeerFinder:StreamSocket"));
if (tapLaunch) {
url = scenarios[0].url; // Выполнение сценария 0, если запущено по касанию, для запуска PeerFinder.
}
return WinJS.Navigation.navigate(url, tapLaunch);
Код Сценария 1 учитывает это условие (параметр tapLaunch в WinJS.Navigation.Navigate установлен в true) и автоматически вызвает PeerFinder.start вместо того, чтобы ожидать нажатия на кнопку. При запуске, приложение так же регистрирует собственный обработчик triggeredConnectionStateChanged таким образом оно получит сокет, когда процесс соединения завершится.
Хотя PeerFinder настраивает StreamSocket и это хорошо подходит для сценариев, которые предусматривают длительное взаимодействие, другие сценарии – такие, как отправка фотографии, ссылку, или данных любого рода, в том числе – данных с RFID-метки – нужно лишь отправить некоторые данные с одного устройства на другое и больше ничего.
Для подобных целей у нас есть класс ), который можно получить следующим образом:
var proximityDevice = Windows.Networking.Proximity.ProximityDevice.getDefault();
Приложение, у которого есть данные, которыми оно хочет поделиться с другоими "публикует" сообщение об этом в форме строки, URI или буфера двоичных данных. RFID-метки публикуют свои сообщения пассивно. Приложение, с другой стороны, использует класс ), ), и ) (и метод stopPublishing). Например, вот код, взятый из Сценария 2 примера о бесконтактном взаимодействии (js/ProximityDevice.js, здесь publishText содержит данные из элемента управления):
var publishedMessageId = proximityDevice.publishMessage("Windows.SampleMessageType", publishText);
С другой стороны, приложение, которое хочет принять подобное сообщение, вызывает ), передавая имя сообщения, которое оно ожидает вместе с обработчиком, куда прибывает сообщение:
var subscribedMessageId = proximityDevice.subscribeForMessage
("Windows.SampleMessageType", messageReceived);
function messageReceived(receivingDevice, message) {
// Обработка сообщения
}
Если приложение больше не заинтересовано в подобных сообщениях, оно вызывает ).
На примере этого простого протокола, вы можете видеть, что приложение, которое поддерживает возможность "Поднести и отправить" ("Tap to share") (как она называется) может публиковать сообщения, когда у него есть подходящее содержимое. Оно так же может использовать события devicearrived (http://msdn.microsoft.com/library/windows/apps/windows.networking.proximity.proximitydevice.devicearrived.aspx) и devicedeparted (http://msdn.microsoft.com/library/windows/apps/windows.networking.proximity.proximitydevice.devicedeparted.aspx) объекта ProximityDevice для того, чтобы узнать, когда другое одноранговое устройство, поддерживающее возможность "Поднести и отправить" оказывается в зоне ближнего взаимодействия, то есть сообщение можно публиковать (это события WinRT). Событие devicearrived – это инструмент, с помощью которого можно обнаружить, что RFID-метка оказалась в зоне ближнего взаимодействия (смотрите ниже).
О чем интересно подумать, однако, так это о том, какие данные можно передавать таким способом. Рассмотрим приложение для организации путешествий, в котором вы можете бронировать авиабилеты, отели, заказывать аренду автомобилей, и, возможно, делать многое другое. Оно может, конечно, публиковать сообщения с основными сведениями, но так же может опубликовать и двоичное сообщение с подробными сведениями, которое позволит передать все сведения о вашем путешествии тому же самому приложению, которое исполняется на другом устройстве, обычно – другому пользователю. Это позволит одному человеку спланировать путешествие и потом передать эти данные другому, который потом лишь нажмет кнопку "Забронировать" и всё будет сделано! Это может быть гораздо более эффективным подходом, чем использование электронной почты для передачи подобных данных о путешествии в виде обычного текста, который другому человеку потом придется вручную вводить в программу.
Публикация URI методом "Поднести и отправить" делает предельно простой возможность, с помощью которой один пользователь может передать другому то, что видит сам, опять же, избегая обходных путей с использованием электронной почты или других форм передачи данных. Быстрое прикосновение – и вы видите то же, что вижу я. Опять же, есть много всего, что можно передать подобным образом, таким образом над этим стоит подумать, особенно если вы разрабатываете своё приложение для мобильных устройств. "Чем обычно заняты люди, которые находятся поблизости друг от друга?". Это – хороший вопрос и ответить на него вы можете с помощью отличного приложения, реализующего возможности бесконтактного взаимодействия.
Обратите внимание, что URI, которое вы передаете, может и не быть в форме http:// - ссылки на вебсайт, но может содержать любую схему URI. Если есть приложение, сопоставленное с данной схемой URI, операция "Поднести и отправить" превращается в операцию касания для активации, так как Windows запустит приложение по умолчанию для данного сопоставления. А если сопоставления не найдено Windows спросит, хотите ли вы загрузить подходящее приложение из Магазина Windows. Вы, конечно, можете использовать и URI Магазина Windows, которые ведут пользователя к прямой возможности установки приложения. Эти URI описаны в материале "Ссылки на приложение" (http://msdn.microsoft.com/library/windows/apps/hh974767.aspx).
Подобные URI делают возможным реализацию сценарий отправки данных и активации приложений для RFID-меток, сообщения в которых обычно записаны в неизменяемую память устройства. Когда вы касаетесь RFID-метки устройством с NFC-модулем, объект ProximityDevice вызывает событие devicearrived. Приложение затем может принять сообщение от метки посредством ProximityDevice.subscribeForMessage. Это означает, что приложению нужно знать тип сообщения, которое может быть отправлено от подобной метки – это может быть некий стандартный тип, или приложение может быть специально написано для конкретного вида меток. Например, художественная галерея может расположить метки около каждого экспоната и разместить в Магазине Windows приложение для данной галереи (или для любых других галерей, которые работают вместе). Это приложение будет знать, какие сообщения могут приходить от меток. Если сообщение имеет подходящую схему URI, прикосновение к RFID-метке может помочь пользователю получить приложение и наслаждаться расширенными возможностями.
Для того, чтобы узнать об этом больше, обратитесь к сообщениям, имеющим отношение к NFC, в блоге для разработчиков приложений для Windows (http://blogs.msdn.com/b/windowsappdev_ru /).
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.