リモート デバイスの検出Discover remote devices

アプリは、ワイヤレス ネットワーク、Bluetooth、およびクラウド接続を使って、検出側デバイスと同じ Microsoft アカウントでサインインしている Windows デバイスを検出できます。Your app can use the wireless network, Bluetooth, and cloud connection to discover Windows devices that are signed on with the same Microsoft account as the discovering device. リモート デバイスを検出するために特別なソフトウェアをインストールする必要はありません。The remote devices do not need to have any special software installed in order to be discoverable.

注意

このガイドでは、「リモート アプリの起動」の手順に従うことで、リモート システム機能へのアクセスが既に許可されていることを前提としています。This guide assumes you have already been granted access to the Remote Systems feature by following the steps in Launch a remote app.

検出可能な一連のデバイスのフィルター処理Filter the set of discoverable devices

フィルターに RemoteSystemWatcher を使うことで、検出可能な一連のデバイスを絞り込むことができます。You can narrow the set of discoverable devices by using a RemoteSystemWatcher with filters. フィルターは、検出の種類 (隣接ネットワーク、ローカル ネットワーク、またはクラウド接続)、デバイスの種類 (デスクトップ、モバイル デバイス、Xbox、Hub、ホログラフィック)、利用可能ステータス (デバイスがリモート システム機能を利用可能かどうかのステータス) を検出できます。Filters can detect the discovery type (proximal vs. local network vs. cloud connection), device type (desktop, mobile device, Xbox, Hub, and Holographic), and availability status (the status of a device's availability to use Remote System features).

RemoteSystemWatcher オブジェクトを初期化する前か、その初期化中に、フィルター オブジェクトを作成する必要があります。コンストラクターにパラメーターとして渡されるためです。Filter objects must be constructed before or while the RemoteSystemWatcher object is initialized, because they are passed as a parameter into its constructor. 次のコードでは、利用可能な各種類のフィルターを作成し、一覧に追加します。The following code creates a filter of each type available and then adds them to a list.

注意

この例のコードでは、ファイルに using Windows.System.RemoteSystems ステートメントがあることを利用としています。The code in these examples requires that you have a using Windows.System.RemoteSystems statement in your file.

private List<IRemoteSystemFilter> makeFilterList()
{
    // construct an empty list
    List<IRemoteSystemFilter> localListOfFilters = new List<IRemoteSystemFilter>();

    // construct a discovery type filter that only allows "proximal" connections:
    RemoteSystemDiscoveryTypeFilter discoveryFilter = new RemoteSystemDiscoveryTypeFilter(RemoteSystemDiscoveryType.Proximal);


    // construct a device type filter that only allows desktop and mobile devices:
    // For this kind of filter, we must first create an IIterable of strings representing the device types to allow.
    // These strings are stored as static read-only properties of the RemoteSystemKinds class.
    List<String> listOfTypes = new List<String>();
    listOfTypes.Add(RemoteSystemKinds.Desktop);
    listOfTypes.Add(RemoteSystemKinds.Phone);

    // Put the list of device types into the constructor of the filter
    RemoteSystemKindFilter kindFilter = new RemoteSystemKindFilter(listOfTypes);


    // construct an availibility status filter that only allows devices marked as available:
    RemoteSystemStatusTypeFilter statusFilter = new RemoteSystemStatusTypeFilter(RemoteSystemStatusType.Available);


    // add the 3 filters to the listL
    localListOfFilters.Add(discoveryFilter);
    localListOfFilters.Add(kindFilter);
    localListOfFilters.Add(statusFilter);

    // return the list
    return localListOfFilters;
}

注意

"proximal" フィルター値は、物理的な近さの度合いを保証するものではありません。The "proximal" filter value does not guarantee the degree of physical proximity. 確実に物理的に近いことが求められるシナリオでは、フィルターに RemoteSystemDiscoveryType.SpatiallyProximal を使用します。For scenarios that require reliable physical proximity, use the value RemoteSystemDiscoveryType.SpatiallyProximal in your filter. 現時点では、このフィルターで許容されるデバイスは Bluetooth 経由で検出されたものに限られます。Currently, this filter only allows devices that are discovered by Bluetooth. 物理的に隣接していることを保証する新しい検出メカニズムとプロトコルがサポートされたら、このフィルターにも組み込まれます。As new discovery mechanisms and protocols which guarantee physical proximity are supported, they will be included here as well.
また、検出したデバイスが実際に物理的に近い範囲内にあるかどうかを示す、RemoteSystem.IsAvailableBySpatialProximity という、RemoteSystem クラスのプロパティもあります。There is also a property in the RemoteSystem class that indicates whether a discovered device is in fact within physical proximity: RemoteSystem.IsAvailableBySpatialProximity.

注意

ローカル ネットワーク経由でデバイスを検出する場合 (検出の種類のフィルターの選択で決定されます)、ネットワークで "プライベート" または "ドメイン" プロファイルを使用する必要があります。If you intend to discover devices over a local network (determined by your discovery type filter selection), your network needs to be using a "private" or "domain" profile. デバイスでは、"パブリック" ネットワーク経由で他のデバイスを検出しません。Your device will not discover other devices over a "public" network.

IRemoteSystemFilter オブジェクトの一覧を作成すると、RemoteSystemWatcher のコンストラクターに渡すことができます。Once a list of IRemoteSystemFilter objects is created, it can be passed into the constructor of a RemoteSystemWatcher.

// store filter list
List<IRemoteSystemFilter> listOfFilters = makeFilterList();

// construct watcher with the list
m_remoteSystemWatcher = RemoteSystem.CreateWatcher(listOfFilters);

このウォッチャーの Start メソッドが呼び出されると、次の条件を満たすデバイスが検出された場合のみ RemoteSystemAdded イベントが発生します。When this watcher's Start method is called, it will raise the RemoteSystemAdded event only if a device is detected that meets all of the following criteria:

  • 近接接続によって検出可能It is discoverable by proximal connection
  • デスクトップまたは携帯電話であるIt is a desktop or phone
  • 利用可能として分類されているIt is classified as available

これ以降、イベントの処理、RemoteSystem オブジェクトの取得、リモート デバイスへの接続の手順は「リモート アプリの起動」とまったく同じ手順です。From there, the procedure for handling events, retrieving RemoteSystem objects, and connecting to remote devices is exactly the same as in Launch a remote app. つまり、RemoteSystem オブジェクトは、各 RemoteSystemAdded イベントで渡される RemoteSystemAddedEventArgs オブジェクトのプロパティとして格納されます。In short, the RemoteSystem objects are stored as properties of RemoteSystemAddedEventArgs objects, which are passed in with each RemoteSystemAdded event.

アドレス入力によるデバイスの検出Discover devices by address input

ユーザーに関連付けられていないか、スキャンで検出することができないデバイスでも、検出側のアプリが直接アドレスを使う場合はアクセスできます。Some devices may not be associated with a user or discoverable with a scan, but they can still be reached if the discovering app uses a direct address. リモート デバイスのアドレスを表すには、HostName クラスを使います。The HostName class is used to represent the address of a remote device. これは多くの場合 IP アドレスの形式で保存されますが、他のいくつかの形式も使うことができます (詳しくは、「HostName コンス トラクター」をご覧ください)。This is often stored in the form of an IP address, but several other formats are allowed (see the HostName constructor for details).

RemoteSystem オブジェクトは、有効な HostName オブジェクトが指定された場合に取得されます。A RemoteSystem object is retrieved if a valid HostName object is provided. アドレス データが無効な場合、null オブジェクト参照が返されます。If the address data is invalid, a null object reference is returned.

private async Task<RemoteSystem> getDeviceByAddressAsync(string IPaddress)
{
    // construct a HostName object
    Windows.Networking.HostName deviceHost = new Windows.Networking.HostName(IPaddress);

    // create a RemoteSystem object with the HostName
    RemoteSystem remotesys = await RemoteSystem.FindByHostNameAsync(deviceHost);

    return remotesys;
}

リモート システムの機能の照会Querying a capability on a remote system

検出フィルタリングからは分離されていますが、デバイスの機能を照会することが検出プロセスの重要な要素になることがあります。Although separate from discovery filtering, querying device capabilities can be an important part of the discovery process. RemoteSystem.GetCapabilitySupportedAsync メソッドを使うと、リモート セッション接続や空間エンティティ (ホログラフィック) 共有などの特定の機能が、検出されたリモートシステムでサポートされているかどうかを照会できます。Using the RemoteSystem.GetCapabilitySupportedAsync method, you can query discovered remote systems for support of certain capabilities such as remote session connectivity or spatial entity (holographic) sharing. 照会可能な機能の一覧については、KnownRemoteSystemCapabilities クラスをご覧ください。See the KnownRemoteSystemCapabilities class for the list of queryable capabilities.

// Check to see if the given remote system can accept LaunchUri requests
bool isRemoteSystemLaunchUriCapable = remoteSystem.GetCapabilitySupportedAsync(KnownRemoteSystemCapabilities.LaunchUri);

ユーザー間の検出Cross-user discovery

開発者は、同一ユーザーに登録されているデバイスだけでなく、クライアント デバイスの近くにある_すべての_デバイスを検出するように指定できます。Developers can specify the discovery of all devices in proximity to the client device, not just devices registered to the same user. これは、特別な IRemoteSystemFilter である、RemoteSystemAuthorizationKindFilter を通じて実装されます。This is implemented through a special IRemoteSystemFilter, RemoteSystemAuthorizationKindFilter. その実装は、他の種類のフィルターと同じように行われます。It is implemented like the other filter types:

// Construct a user type filter that includes anonymous devices
RemoteSystemAuthorizationKindFilter authorizationKindFilter = new RemoteSystemAuthorizationKindFilter(RemoteSystemAuthorizationKind.Anonymous);
// then add this filter to the RemoteSystemWatcher
  • RemoteSystemAuthorizationKind の値 Anonymous では、信頼されていないユーザーのデバイスも含めて、すべての近接デバイスを検出できるようになります。A RemoteSystemAuthorizationKind value of Anonymous will allow the discovery of all proximal devices, even those from non-trusted users.
  • SameUser では、クライアント デバイスと同じユーザーに登録されているデバイスのみを検出するようにフィルター処理が行われます。A value of SameUser filters the discovery to only devices registered to the same user as the client device. これは既定の動作です。This is the default behavior.

ユーザー間共有設定の確認Checking the Cross-User Sharing settings

サインイン済みのデバイスで他のユーザーとエクスペリエンスを共有できるようにするには、検出アプリで上記のフィルターを指定することに加えて、クライアント デバイス自体の構成も必要になります。In addition to the above filter being specified in your discovery app, the client device itself must also be configured to allow shared experiences from devices signed in with other users. このシステム設定は、次のように RemoteSystem クラスで静的メソッドを使用することで照会できます。This is a system setting that can be queried with a static method in the RemoteSystem class:

if (!RemoteSystem.IsAuthorizationKindEnabled(RemoteSystemAuthorizationKind.Anonymous)) {
    // The system is not authorized to connect to cross-user devices. 
    // Inform the user that they can discover more devices if they
    // update the setting to "Anonymous".
}

この設定を変更するには、ユーザーが設定アプリを開く必要があります。To change this setting, the user must open the Settings app. [ System > デバイス間でのシステム共有エクスペリエンスの > 共有] メニューにはドロップダウンボックスがあり、ユーザーはそのシステムで共有できるデバイスを指定できます。In the System > Shared experiences > Share across devices menu, there is a drop-down box where the user can specify which devices their system can share with.

[共有エクスペリエンス] 設定ページ