我想要一个带有两个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,稍后在枚举设备时,它可以正常工作。有谁知道为什么会这样?
答案 0 :(得分:0)
在这两种情况下,AQS选择器字符串是什么样的?
问题是:
基本上,过滤器用于匹配当前处于KM PnP状态的设备接口上的属性。如果接口的属性与选择器中逻辑请求的属性匹配,则将其添加到设备信息集合中。
也许在没有选择器的情况下尝试FindAllAsync,然后看看KM PnP当前正在枚举哪些接口。请求选择器中的属性。一旦你看到你认为应该看到的界面,就逻辑地找出它与选择器不匹配的原因。
如果设备没有配对,那么就不会有任何devnodes或接口代表它。因此,FindAllAsync
无法发现它蓝牙总线驱动程序仅为其理解的配置文件创建PnP状态。 FindAllAsync需要PnP状态才能找到它。 RFCOMM是一个基本的,所以它应该工作。
无论如何,首先要写一些测试代码,如1中所述。这会给你一些信息,以便进一步调查。
另外,请检查Windows.Devices.Enumeration的新Windows 10 API更改。有一些新方法可以发现蓝牙设备。
萨姆