PeerFinder.FindAllPeersAsync Метод
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Асинхронно просматривает одноранговые устройства, на которых выполняется одно и то же приложение в диапазоне беспроводной связи.
public:
static IAsyncOperation<IVectorView<PeerInformation ^> ^> ^ FindAllPeersAsync();
/// [Windows.Foundation.Metadata.RemoteAsync]
static IAsyncOperation<IVectorView<PeerInformation>> FindAllPeersAsync();
[Windows.Foundation.Metadata.RemoteAsync]
public static IAsyncOperation<IReadOnlyList<PeerInformation>> FindAllPeersAsync();
function findAllPeersAsync()
Public Shared Function FindAllPeersAsync () As IAsyncOperation(Of IReadOnlyList(Of PeerInformation))
Возвращаемое значение
Асинхронная операция для просмотра одноранговых устройств, на которых выполняется приложение.
- Атрибуты
Требования к Windows
Возможности приложения |
ID_CAP_NETWORKING [Windows Phone]
ID_CAP_NETWORKING [Windows Phone]
proximity
ID_CAP_PROXIMITY [Windows Phone]
|
Примеры
protected override void OnNavigatedTo(NavigationEventArgs e)
{
DisplayNameTextBox.Text = Windows.Networking.Proximity.PeerFinder.DisplayName;
Windows.Networking.Proximity.PeerFinder.ConnectionRequested += ConnectionRequested;
// If activated from launch or from the background, create a peer connection.
var args = e.Parameter as Windows.ApplicationModel.Activation.LaunchActivatedEventArgs;
if (args != null && args.Kind == Windows.ApplicationModel.Activation.ActivationKind.Launch)
{
if (args.Arguments == "Windows.Networking.Proximity.PeerFinder:StreamSocket")
{
AdvertiseForPeersButton_Click(null, null);
}
}
}
protected override void OnNavigatingFrom(NavigatingCancelEventArgs e)
{
if (_started)
{
// Detach the callback handler (there can only be one PeerConnectProgress handler).
Windows.Networking.Proximity.PeerFinder.TriggeredConnectionStateChanged -= TriggeredConnectionStateChanged;
// Detach the incoming connection request event handler.
Windows.Networking.Proximity.PeerFinder.ConnectionRequested -= ConnectionRequested;
Windows.Networking.Proximity.PeerFinder.Stop();
CloseSocket();
_started = false;
}
}
// Write a message to MessageBlock on the UI thread.
private Windows.UI.Core.CoreDispatcher messageDispatcher = Window.Current.CoreWindow.Dispatcher;
async private void WriteMessageText(string message, bool overwrite = false)
{
await messageDispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,
() =>
{
if (overwrite)
MessageBlock.Text = message;
else
MessageBlock.Text += message;
});
}
bool _started = false;
// Click event handler for "Advertise" button.
private void AdvertiseForPeersButton_Click(object sender, RoutedEventArgs e)
{
if (_started)
{
WriteMessageText("You are already advertising for a connection.\n");
return;
}
Windows.Networking.Proximity.PeerFinder.DisplayName = DisplayNameTextBox.Text;
if ((Windows.Networking.Proximity.PeerFinder.SupportedDiscoveryTypes &
Windows.Networking.Proximity.PeerDiscoveryTypes.Triggered) ==
Windows.Networking.Proximity.PeerDiscoveryTypes.Triggered)
{
Windows.Networking.Proximity.PeerFinder.TriggeredConnectionStateChanged +=
TriggeredConnectionStateChanged;
WriteMessageText("You can tap to connect a peer device that is " +
"also advertising for a connection.\n");
}
else
{
WriteMessageText("Tap to connect is not supported.\n");
}
if ((Windows.Networking.Proximity.PeerFinder.SupportedDiscoveryTypes &
Windows.Networking.Proximity.PeerDiscoveryTypes.Browse) !=
Windows.Networking.Proximity.PeerDiscoveryTypes.Browse)
{
WriteMessageText("Peer discovery using Wi-Fi Direct is not supported.\n");
}
Windows.Networking.Proximity.PeerFinder.Start();
_started = true;
}
private void TriggeredConnectionStateChanged(
object sender,
Windows.Networking.Proximity.TriggeredConnectionStateChangedEventArgs e)
{
if (e.State == Windows.Networking.Proximity.TriggeredConnectState.PeerFound)
{
WriteMessageText("Peer found. You may now pull your devices out of proximity.\n");
}
if (e.State == Windows.Networking.Proximity.TriggeredConnectState.Completed)
{
WriteMessageText("Connected. You may now send a message.\n");
SendMessage(e.Socket);
}
}
// Click event handler for "Browse" button.
async private void FindPeersButton_Click(object sender, RoutedEventArgs e)
{
if ((Windows.Networking.Proximity.PeerFinder.SupportedDiscoveryTypes &
Windows.Networking.Proximity.PeerDiscoveryTypes.Browse) !=
Windows.Networking.Proximity.PeerDiscoveryTypes.Browse)
{
WriteMessageText("Peer discovery using Wi-Fi Direct is not supported.\n");
return;
}
try
{
var peerInfoCollection = await Windows.Networking.Proximity.PeerFinder.FindAllPeersAsync();
if (peerInfoCollection.Count > 0)
{
// Connect to first peer found - example only.
// In your app, provide the user with a list of available peers.
ConnectToPeer(peerInfoCollection[0]);
}
}
catch (Exception err)
{
WriteMessageText("Error finding peers: " + err.Message + "\n");
}
}
async private void ConnectToPeer(Windows.Networking.Proximity.PeerInformation peerInfo)
{
WriteMessageText("Peer found. Connecting to " + peerInfo.DisplayName + "\n");
try
{
Windows.Networking.Sockets.StreamSocket socket =
await Windows.Networking.Proximity.PeerFinder.ConnectAsync(peerInfo);
WriteMessageText("Connection successful. You may now send messages.\n");
SendMessage(socket);
}
catch (Exception err)
{
WriteMessageText("Connection failed: " + err.Message + "\n");
}
requestingPeer = null;
}
// Click event handler for "Stop" button.
private void StopFindingPeersButton_Click(object sender, RoutedEventArgs e)
{
_started = false;
Windows.Networking.Proximity.PeerFinder.Stop();
if (proximitySocket != null) { CloseSocket(); }
}
// Handle external connection requests.
Windows.Networking.Proximity.PeerInformation requestingPeer;
private void ConnectionRequested(object sender,
Windows.Networking.Proximity.ConnectionRequestedEventArgs e)
{
requestingPeer = e.PeerInformation;
WriteMessageText("Connection requested by " + requestingPeer.DisplayName + ". " +
"Click 'Accept Connection' to connect.");
}
private void AcceptConnectionButton_Click(object sender, RoutedEventArgs e)
{
if (requestingPeer == null)
{
WriteMessageText("No peer connection has been requested.");
return;
}
ConnectToPeer(requestingPeer);
}
Protected Overrides Sub OnNavigatedTo(e As Navigation.NavigationEventArgs)
DisplayNameTextBox.Text = Windows.Networking.Proximity.PeerFinder.DisplayName
AddHandler Windows.Networking.Proximity.PeerFinder.ConnectionRequested, AddressOf ConnectionRequested
' If activated from launch or from the background, create a peer connection.
Dim args = TryCast(e.Parameter, Windows.ApplicationModel.Activation.LaunchActivatedEventArgs)
If args IsNot Nothing AndAlso args.Kind = Windows.ApplicationModel.Activation.ActivationKind.Launch Then
If args.Arguments = "Windows.Networking.Proximity.PeerFinder:StreamSocket" Then
AdvertiseForPeersButton_Click()
End If
End If
End Sub
Protected Overrides Sub OnNavigatingFrom(e As Navigation.NavigatingCancelEventArgs)
If _started Then
' Detach the callback handler (there can only be one PeerConnectProgress handler).
RemoveHandler Windows.Networking.Proximity.PeerFinder.TriggeredConnectionStateChanged, AddressOf TriggeredConnectionStateChanged
' Detach the incoming connection request event handler.
RemoveHandler Windows.Networking.Proximity.PeerFinder.ConnectionRequested, AddressOf ConnectionRequested
Windows.Networking.Proximity.PeerFinder.Stop()
CloseSocket()
_started = False
End If
End Sub
' Write a message to MessageBlock on the UI thread.
Private Async Sub WriteMessageText(message As String, Optional overwrite As Boolean = False)
Await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,
Sub()
If overwrite Then
MessageBlock.Text = message
Else
MessageBlock.Text &= message
End If
End Sub)
End Sub
Private _started As Boolean = False
' Click event handler for "Advertise" button.
Private Sub AdvertiseForPeersButton_Click()
If _started Then
WriteMessageText("You are already advertising for a connection." & vbCrLf)
Return
End If
Windows.Networking.Proximity.PeerFinder.DisplayName = DisplayNameTextBox.Text
If ((Windows.Networking.Proximity.PeerFinder.SupportedDiscoveryTypes And
Windows.Networking.Proximity.PeerDiscoveryTypes.Triggered) =
Windows.Networking.Proximity.PeerDiscoveryTypes.Triggered) Then
AddHandler Windows.Networking.Proximity.PeerFinder.TriggeredConnectionStateChanged,
AddressOf TriggeredConnectionStateChanged
WriteMessageText("You can tap to connect a peer device that is " &
"also advertising for a connection." & vbCrLf)
Else
WriteMessageText("Tap to connect is not supported." & vbCrLf)
End If
If (Windows.Networking.Proximity.PeerFinder.SupportedDiscoveryTypes And
Windows.Networking.Proximity.PeerDiscoveryTypes.Browse) <>
Windows.Networking.Proximity.PeerDiscoveryTypes.Browse Then
WriteMessageText("Peer discovery using Wifi-Direct is not supported." & vbCrLf)
End If
Windows.Networking.Proximity.PeerFinder.Start()
_started = True
End Sub
Private Sub TriggeredConnectionStateChanged(
sender As Object,
e As Windows.Networking.Proximity.TriggeredConnectionStateChangedEventArgs)
If e.State = Windows.Networking.Proximity.TriggeredConnectState.PeerFound Then
WriteMessageText("Peer found. You may now pull your devices out of proximity." & vbCrLf)
End If
If e.State = Windows.Networking.Proximity.TriggeredConnectState.Completed Then
WriteMessageText("Connected. You may now send a message." & vbCrLf)
SendMessage(e.Socket)
End If
End Sub
' Click event handler for "Browse" button.
Private Async Sub FindPeersButton_Click()
If (Windows.Networking.Proximity.PeerFinder.SupportedDiscoveryTypes And
Windows.Networking.Proximity.PeerDiscoveryTypes.Browse) <>
Windows.Networking.Proximity.PeerDiscoveryTypes.Browse Then
WriteMessageText("Peer discovery using Wifi-Direct is not supported." & vbCrLf)
Return
End If
Try
Dim peerInfoCollection = Await Windows.Networking.Proximity.PeerFinder.FindAllPeersAsync()
If peerInfoCollection.Count > 0 Then
' Connect to first peer found - example only.
' In your app, provide the user with a list of available peers.
ConnectToPeer(peerInfoCollection(0))
End If
Catch err As Exception
WriteMessageText("Error finding peers: " & err.Message & vbCrLf)
End Try
End Sub
Private Async Sub ConnectToPeer(peerInfo As Windows.Networking.Proximity.PeerInformation)
WriteMessageText("Peer found. Connecting to " & peerInfo.DisplayName & vbCrLf)
Try
Dim socket = Await Windows.Networking.Proximity.PeerFinder.ConnectAsync(peerInfo)
WriteMessageText("Connection successful. You may now send messages." & vbCrLf)
SendMessage(socket)
Catch err As Exception
WriteMessageText("Connection failed: " & err.Message & vbCrLf)
End Try
requestingPeer = Nothing
End Sub
' Click event handler for "Stop" button.
Private Sub StopFindingPeersButton_Click()
_started = False
Windows.Networking.Proximity.PeerFinder.Stop()
If proximitySocket IsNot Nothing Then CloseSocket()
End Sub
' Handle external connection requests.
Private requestingPeer As Windows.Networking.Proximity.PeerInformation
Private Sub ConnectionRequested(sender As Object,
e As Windows.Networking.Proximity.ConnectionRequestedEventArgs)
requestingPeer = e.PeerInformation
WriteMessageText("Connection requested by " & requestingPeer.DisplayName & ". " &
"Click 'Accept Connection' to connect.")
End Sub
Private Sub AcceptConnectionButton_Click()
If requestingPeer Is Nothing Then
WriteMessageText("No peer connection has been requested.")
Return
End If
ConnectToPeer(requestingPeer)
End Sub
Комментарии
Если приложение выполняется на компьютере, вы можете найти одноранговые компьютеры, на которых выполняется приложение. Обнаружение одноранговых узлов в этом случае выполняется Wi-Fi Direct. Если приложение работает на телефоне, вы можете найти одноранговые телефоны, на которых выполняется приложение. В этом случае обнаружение одноранговых узлов выполняется по Bluetooth. Так как транспорт, используемый для обнаружения одноранговых узлов, отличается между компьютером и телефоном, приложение, работающее на компьютере, может находить только одноранговые компьютеры, а приложение, работающее на телефоне, — только одноранговые телефоны.
После успешного завершения асинхронной операции просмотра возвращается список одноранговых узлов, находящихся в диапазоне беспроводной связи. Одноранговый узел — это устройство, на котором на переднем плане выполняется приложение с соответствующим идентификатором приложения. Одноранговый узел также может иметь соответствующий идентификатор обзора, указанный в качестве альтернативного удостоверения. Дополнительные сведения см. в разделе AlternateIdentities.
Если приложение вызывает метод ConnectAsync для создания соединения с одноранговым элементом, приложение больше не будет объявлять о подключении и не будет найдено методом FindAllPeersAsync, пока приложение не вызовет метод Close , чтобы закрыть подключение сокета.
Одноранговые узлы будут находиться только в том случае, если устройство находится в диапазоне беспроводной связи, а одноранговые приложения работают на переднем плане. Если одноранговое приложение работает в фоновом режиме, близкое взаимодействие не объявляет одноранговые подключения.
В качестве альтернативы методу FindAllPeersAsync можно динамически искать одноранговые приложения по мере их обнаружения в диапазоне с помощью объекта PeerWatcher .
Windows Phone 8
Wi-Fi Direct не поддерживается в Windows Phone 8.