发现远程设备

你的应用可以使用无线网络、蓝牙和云连接来发现使用发现设备的相同 Microsoft 帐户登录的 Windows 设备。 无需安装任何特殊软件,即可发现远程设备。

注意

本指南假设你已经按照启动远程应用中的步骤授予远程系统功能的访问权限。

筛选可发现的设备集

你可以将 RemoteSystemWatcher 与筛选器结合使用,缩小可发现的设备集。 筛选器可以检测发现类型(邻近与本地网络与云连接)、设备类型(桌面设备、移动设备、Xbox、Hub 和全息设备)以及可用性状态(要使用远程系统功能的设备的可用性状态)。

在初始化 RemoteSystemWatcher 对象之前或之时,必须构建筛选器对象,因为它们将作为一项参数传入它的构造函数中。 以下代码可为每一种可用类型都创建一个筛选器,然后将它们添加到列表。

注意

这些示例中的代码要求文件中具有 using Windows.System.RemoteSystems 语句。

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”筛选器值不能保证位置邻近的程度。 对于需要可靠的位置邻近的情形,请在你的筛选器中使用值 RemoteSystemDiscoveryType.SpatiallyProximal。 当前,此筛选器只允许通过蓝牙发现的设备。 当支持新发现机制和保证位置邻近的协议时,此处也会将其包括进来。
RemoteSystem 类中还有一个属性用于指示已发现的设备是否实际处于邻近位置:RemoteSystem.IsAvailableBySpatialProximity

注意

如果打算通过本地网络发现设备(由发现类型筛选条件选择决定),则网络需要使用“私有”或“域”配置文件。 你的设备不会通过“公共”网络发现其他设备。

创建 IRemoteSystemFilter 对象列表后,可以将其传入 RemoteSystemWatcher 的构造函数。

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

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

当调用该观察程序的 Start 方法时,只有检测到满足以下全部条件的设备,才会引发 RemoteSystemAdded 事件。

  • 可以通过邻近连接发现该设备
  • 它是一台桌面设备或手机
  • 它被归类为可用

从此处开始,处理事件、检索 RemoteSystem 对象和连接到远程设备的过程与启动远程应用中的过程完全相同。 简而言之,RemoteSystem 对象作为 RemoteSystemAddedEventArgs 对象的属性存储,这些都随每个 RemoteSystemAdded 事件传递。

通过地址输入发现设备

某些设备可能与用户没有关联,或无法通过扫描发现,但是如果发现应用使用直接地址,仍可以查找到它们。 HostName 类用于表示远程设备的地址。 该地址通常以 IP 地址的形式存储,但也允许存储为其他几种格式(请参阅 HostName 构造函数,了解详细信息)。

如果提供了有效的 HostName 对象,即可检索 RemoteSystem 对象。 如果地址数据无效,将返回 null 对象引用。

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;
}

查询远程系统上的功能

尽管与发现筛选分离,但查询设备功能也是发现过程中的一个重要部分。 使用 RemoteSystem.GetCapabilitySupportedAsync 方法,你可以查询已发现的远程系统是否支持特定功能,如远程会话连接或空间实体(全息)共享。 有关可查询功能的列表,请参阅 KnownRemoteSystemCapabilities 类。

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

跨用户发现

开发人员可以指定发现邻近客户端设备的所有设备,而不仅仅是已向同一用户注册的设备。 这是通过特殊的 IRemoteSystemFilter - RemoteSystemAuthorizationKindFilter 来实现的。 其实现与其他筛选器类型相似:

// Construct a user type filter that includes anonymous devices
RemoteSystemAuthorizationKindFilter authorizationKindFilter = new RemoteSystemAuthorizationKindFilter(RemoteSystemAuthorizationKind.Anonymous);
// then add this filter to the RemoteSystemWatcher
  • RemoteSystemAuthorizationKindAnonymous 将允许发现所有邻近设备,即使来自不受信任的用户也是如此。
  • SameUser 只将发现筛选到与客户端设备注册到同一用户的设备。 这是默认行为。

检查跨用户共享设置

除了在发现应用中指定的上述筛选器外,还必须对客户端设备本身进行配置,以允许来自登录设备的与其他用户之间的共享体验。 这是一种系统设置,可用 RemoteSystem 类中的静态方法进行查询:

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".
}

若要更改此设置,用户必须打开设置应用。 在系统>共享体验>跨设备共享菜单中有一个下拉框,用户可在此指定系统可与哪些设备共享体验。

共享体验设置页面