【问题标题】:WiFiDirectDevice::FromIdAsync throws in Win32 Console AppWiFiDirectDevice::FromIdAsync 在 Win32 控制台应用程序中抛出
【发布时间】:2015-12-11 13:30:00
【问题描述】:

我正在尝试使用 Windows 10 SDK 中的 WiFiDirect API 并在 Win32 控制台应用程序中实现连接器方案。我已经在基本控制台应用程序中启用了 C++/CX,并集成了来自 Microsoft's example on GitHub 的代码。

现在,如果设备已经配对,我可以成功发现设备,甚至可以连接和传输数据。但是当我尝试从头开始配对它们时,FromIdAsync 任务以 Canceled 结束,下面的最后一行抛出异常,提示 “远程过程调用失败。”

        WiFiDirectConnectionParameters^ connectionParams = ref new WiFiDirectConnectionParameters();
        connectionParams->GroupOwnerIntent = (short)(wcstoul(txtGOIntent->Text->Data(), nullptr, 10));

        // IMPORTANT: FromIdAsync needs to be called from the UI thread
        concurrency::task<WiFiDirectDevice^> fromIdTask(WiFiDirectDevice::FromIdAsync(discoveredDevice->DeviceInfo->Id, connectionParams));
        fromIdTask.then([this](concurrency::task<WiFiDirectDevice^> fromIdResultTask)
        {
            try
            {
                WiFiDirectDevice^ wfdDevice = fromIdResultTask.get();

我认为它无法显示带有 PIN 输入的弹出窗口,但是如何克服这个问题?

【问题讨论】:

  • 据记载,[MarshalingBehavior(Agile)] 表示您不能从控制台模式应用程序调用它。没有什么“敏捷”的。
  • @HansPassant 这使得 WiFi Direct 完全无法从桌面应用程序中使用。我能做点什么吗?我不知道,也许从我的应用程序或其他技巧创建 UI 线程?
  • 相当晦涩,我猜你需要用 this web page 中提到的 [Platform::STAThread] 来装饰 main()。从未尝试过。请记住,如果它决定显示一个弹出窗口,那么什么都不会发生,应该死锁。

标签: windows-runtime wifi-direct c++-cx


【解决方案1】:

我在做完全相同的事情时面临同样的问题,但使用的是 C# 而不是 C++。缺少关于 WiFiDirectDevice 的文档有点让人恼火,但我发现了类似的 in a relatively similar class remarks,说需要从 UI 线程调用 FromIdAsync 才能显示同意提示(正如你我所怀疑的那样)。

出于某种原因,Microsoft 认为强制开发人员依赖特定的 UI 框架来使用 WiFiDirect 是个好主意。但是,这似乎只是第一次是强制性的,因为正如您已经实现的那样,一旦两个设备相互信任,就可以通过命令行应用程序进行连接。所以也许一个“连接两个设备”的简单应用程序就可以完成工作。

事实证明,测试这种行为很困难:受信任的设备列在Settings &gt; Privacy &gt; Other devices 下,但取消选中另一台计算机只会使尝试连接的应用程序(而不是宣传它的应用程序)失败,不再请求许可,并且为了再次显示同意提示,没有“忘记此设备”之类的东西。

编辑:似乎如果您使用控制面板中的设备和打印机菜单从另一个设备中删除一个设备,您必须在另一台计算机上执行完全相同的操作,否则您将在执行 @ 时收到描述性异常 Element not found 987654329@ 在广告机上。

编辑 2:在 WPF 应用程序的 UI 线程上运行 FromIdAsync 也不起作用(在 Remote procedure call failed 异常中再次重新使用),这让我认为它试图调用一些 Store 特定功能不适用于其他类型的应用程序。微软像这样将 WiFiDirect 这样一个惊人的功能与他们的通用应用程序平台联系在一起,这真是令人难过。

编辑 3:我看到您将另一个答案标记为正确。您能否分享一下 Windows 10 Threshold 2 似乎提供的解决方案?我还没有找到解决方法。

【讨论】:

  • 你是说只能通过某种特定的 WinRT UI 线程来完成,而无法在桌面应用程序中获取它?
  • 顺便说一句,通过单击删除设备,可以从控制面板中的设备和打印机菜单中轻松“忘记”设备
  • @Yrchgrchh WiFiDirect 服务是 Windows 10 中的新功能(允许您在一台机器上宣传一个或多个不同的服务),允许您修改身份验证方法(例如让您设置一个特定的 pin可以在两侧进行硬编码,甚至没有 pin),但 WiFiDirectDevice.FromIdAsync 需要从 UI 线程 github.com/Microsoft/Windows-universal-samples/blob/master/… 运行
  • @Yrchgrchh 顺便说一句,我从“设备和打印机”中删除了其他设备,但它仍然显示在“设置”>“隐私”>“其他设备”中 :(
  • @Yrchgrchh 我发现了一个名为DeviceInformationPairing 的类,它有一个名为PairAsync 的方法,您可以在其中设置保护级别,从而消除PIN 识别。我没有将其添加为答案,因为我无法让它工作。有一个 UWP sample 从客户端使用它,但不知道应该如何启动 GO 端的广告商......如果你用这个完成了一些事情,请告诉我!
【解决方案2】:

[更新] TH2 已经发布了一段时间,所以 custom device pairing API 是我最初提到的。还有一个SDK sample 向您展示如何使用它。示例中的结帐方案 9。

需要明确的是,您可以通过 3-4 种方式在应用中配对设备:

  1. 使用设备选择器控件,可以内联设备配对
  2. 使用简单的配对 API。如前所述,它必须在应用程序 UI 线程上调用,否则 shell 可能无法确定在何处绘制应用程序模式对话框
  3. 使用自定义设备配对 API
  4. 使用入站配对 API(仅适用于 IoT 设备上的蓝牙)

Windows.Devices.Enumeration* 中的大多数 API 都被视为“双重”API,这意味着它们可以在应用容器以及中等 IL win32 类型的进程中工作。例外是生成 UI 的 API(即 #1 和 #2),因此在您的场景中,只有 #3 可以在桌面控制台应用程序中工作。

在 TH2 之前,上面的#2 会隐式发生。 RPC 调用失败,因为控制台应用不在应用容器中,因此 shell 无法注入模态对话框。

[原始回复] 显然这是一个应该可行的方案。您应该在Threshold 2 中寻找对使用 WiFiDirect WinRT API 的 win32 应用程序的更好支持,该 API 即将发布给所有人。您现在可以使用 Windows 10 的内部版本进行试用。我认为您问题中的场景应该可以正常工作。

我建议在 TH2 SDK 发布时查看它。检查是否有新的 API 可以解决您的问题。发货后联系我,我可以为您提供有关如何管理 WFD 配对的更多详细信息。

【讨论】:

    猜你喜欢
    • 2011-03-10
    • 1970-01-01
    • 2010-11-04
    • 1970-01-01
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    • 2017-09-15
    • 1970-01-01
    相关资源
    最近更新 更多