PeerFinder.FindAllPeersAsync Metodo
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
Cerca in modo asincrono i dispositivi peer che eseguono la stessa app all'interno dell'intervallo wireless.
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))
Restituisce
Operazione asincrona per l'esplorazione di dispositivi peer che eseguono l'app.
- Attributi
Requisiti Windows
Funzionalità dell'app |
ID_CAP_NETWORKING [Windows Phone]
ID_CAP_NETWORKING [Windows Phone]
proximity
ID_CAP_PROXIMITY [Windows Phone]
|
Esempio
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
Commenti
Se l'app è in esecuzione in un PC, è possibile cercare PC peer che eseguono l'app. L'individuazione peer in questo caso avviene su Wi-Fi Direct. Se l'app è in esecuzione su un telefono, è possibile cercare telefoni peer che eseguono l'app. In questo caso, l'individuazione peer avviene tramite Bluetooth. Poiché il trasporto usato per l'individuazione peer differisce tra PC e telefono, l'app in esecuzione su un PC può trovare solo PC peer e l'app in esecuzione su un telefono può trovare solo telefoni peer.
Al termine dell'operazione di esplorazione asincrona, restituisce un elenco di peer all'interno dell'intervallo wireless. Un peer è un dispositivo con un'app in esecuzione in primo piano con un ID app corrispondente. Un peer può anche avere un ID di esplorazione corrispondente specificato come identità alternativa. Per altre informazioni, vedere AlternateIdentities.For more information, see AlternateIdentities.
Se un'app chiama il metodo ConnectAsync per creare una connessione con un peer, l'app non annuncia più una connessione e non verrà trovata dal metodo FindAllPeersAsync finché l'app non chiama il metodo Close per chiudere la connessione socket.
Troverai solo i peer in cui il dispositivo è compreso nell'intervallo wireless e l'app peer è in esecuzione in primo piano. Se un'app peer è in esecuzione in background, la prossimità non annuncia le connessioni peer.
In alternativa al metodo FindAllPeersAsync, è possibile cercare in modo dinamico le app peer non appena vengono individuate all'interno dell'intervallo usando l'oggetto PeerWatcher .
Windows Phone 8
Wi-Fi Direct non è supportato in Windows Phone 8.