DeviceInformation :: FindAllAsync无法找到具有RFCOMM服务ID的设备

时间:2014-08-22 16:58:41

标签: windows-runtime windows-phone-8.1 rfcomm

我想要一个带有两个Windows Phone的简单客户端/服务器设置,我正在使用以下代码来设置服务器:

auto providerTask = create_task(RfcommServiceProvider::CreateAsync(RfcommServiceId::FromUuid(GetServiceGUID())));

providerTask.then([this](RfcommServiceProvider^ p) -> task < void >
{
    this->provider = p;

    this->listener = ref new StreamSocketListener();
    listener->ConnectionReceived += ref new Windows::Foundation::TypedEventHandler < Windows::Networking::Sockets::StreamSocketListener ^,
        Windows::Networking::Sockets::StreamSocketListenerConnectionReceivedEventArgs ^ >
        (this, &ConnectionManager::OnConnectionReceived);

    return create_task(listener->BindServiceNameAsync(provider->ServiceId->AsString())).then([this]()
    {
        this->provider->StartAdvertising(listener);
    });

}).then([](task<void> t)
{
    //handle exceptions at the end of the chain
    try
    {
        t.get();
    }
    catch (Platform::Exception^ ex)
    {
        if (ex->HResult == 0x9000000F)
        {
            OutputDebugString(L"Bluetooth is disabled.\n");
        }
        else throw ex;
    }
});

GetServiceGUID()只返回我使用VS的内置GUID工具为我的应用程序创建的标识符;同样的一个也在app清单中声明。

在第二台设备上,我正在寻找这样的服务器:

auto query = RfcommDeviceService::GetDeviceSelector(RfcommServiceId::FromUuid(GetServiceGUID()));

create_task(DeviceInformation::FindAllAsync(query))
    .then([this](DeviceInformationCollection^ services)
{
    if (services->Size > 0)
    {
        OutputDebugString(L"We've found a server!\n");
        OutputDebugString(services->First()->Current->Name->Data());
    }
});

对FindAllAsync的调用始终返回空集合,即使这两个设备在设置中显示为已配对。但是,如果我在设置服务器时使用RfcommServiceId :: ObexObjectPush而不是FromUuid,稍后在枚举设备时,它可以正常工作。有谁知道为什么会这样?

1 个答案:

答案 0 :(得分:0)

在这两种情况下,AQS选择器字符串是什么样的?

问题是:

  1. 选择器未与系统上的界面意外匹配
  2. 基本上,过滤器用于匹配当前处于KM PnP状态的设备接口上的属性。如果接口的属性与选择器中逻辑请求的属性匹配,则将其添加到设备信息集合中。

    也许在没有选择器的情况下尝试FindAllAsync,然后看看KM PnP当前正在枚举哪些接口。请求选择器中的属性。一旦你看到你认为应该看到的界面,就逻辑地找出它与选择器不匹配的原因。

    1. 设备未配对。
    2. 如果设备没有配对,那么就不会有任何devnodes或接口代表它。因此,FindAllAsync

      无法发现它
      1. 设备已配对,但没有您认为的配置文件。
      2. 蓝牙总线驱动程序仅为其理解的配置文件创建PnP状态。 FindAllAsync需要PnP状态才能找到它。 RFCOMM是一个基本的,所以它应该工作。

        无论如何,首先要写一些测试代码,如1中所述。这会给你一些信息,以便进一步调查。

        另外,请检查Windows.Devices.Enumeration的新Windows 10 API更改。有一些新方法可以发现蓝牙设备。

        萨姆