关于在 Windows 上使用 WiFi Direct Api?

dom*_*eau 5 c# windows wifi wifi-direct

我目前正在开发一个应用程序,我需要在桌面应用程序(Windows 10 上)和平板电脑(Android,但不相关)之间创建链接(阅读: WiFi 链接)。工作流程:按下按钮->如果需要提升权限->创建类似托管网络的 WiFi 网络->允许设备连接并提供 SSID/密码/动态 IP 地址...

以前,我使用对netsh 的系统调用(以提升的权限运行应用程序)来创建托管网络。现在看来,以这种方式进行下去的可能性越来越小(例如:在同一台计算机上,它可以在 Win 7 上运行,但不再可以在 Win 10 上运行)。这似乎是一个驱动程序问题,因为它仍然可以使用外部 USB 天线,但不能使用内部天线。无论如何,我不想进一步讨论这个解决方案。

我的目标:能够使用 API 以编程方式完成此操作。我看到了很多关于WiFi Direct 托管网络的讨论,似乎托管网络是一项正在消失的技术,而WiFi Direct却拥有光明的未来???我不知道。

我找到了WiFi Direct API,但它们看起来面向通用 Windows ( UWP ),而我希望能够在简单的 C# 应用程序中使用它们。这篇文章展示了如何破解系统并通过简单的 C# 控制台应用程序使用 API。到目前为止,效果很好,成功了。

为了简单使用,我在传统模式下使用 API,提供 SSID 和密码,这样我的平板电脑就能看到网络。WiFiDirectAdvertisementPublisherAdvertisement.LegacySettings.IsEnabled = true;连接速度非常快,一切都很好。

失败的地方是我使用了流媒体(类似于splashtop),并且它在1-2分钟后断开连接(流媒体断开连接,而不是WiFi)。相反,如果我只是进入 Windows 设置中的“无线接入点”表单并激活它,通信将保持超过 24 小时(并且现在仍在运行,没有任何缺陷)。因此,问题不在于流媒体,也不在于 WiFi 设备硬件/驱动程序。我的第一个想法是WiFi Direct设置设置不当,无法维持流数据流。

随之而来的是我无法在网上找到文档。Microsoft Wlanapi.dll文档一般般...我仍然不知道我是否必须专注于WiFi Direct(真的吗?)还是坚持使用托管网络因为它证明它工作正常?

这是我的代码,可以很好地维持 WiFi 链接,但会使流媒体很快断开连接:

using System;
using Windows.Devices.WiFiDirect;
using Windows.Security.Credentials;

namespace WFDcs_1
{
    class Program
    {
        private WiFiDirectAdvertisementPublisher mPublisher = null;
        private bool mConnected = false;

        static void Main(string[] args)
        {
            Program zeProgram = new Program(args);
        }

        Program(string[] args)
        {
            StartAdvertisement(WiFiDirectAdvertisementListenStateDiscoverability.Normal);

            Console.WriteLine("Hit a key to quit...");
            Console.ReadKey();
        }

        void StopAdvertisement()
        {
            if (mConnected)
            {
                mPublisher.Stop();
                mPublisher.StatusChanged -= OnStatusChanged;
            }
        }

        void StartAdvertisement(WiFiDirectAdvertisementListenStateDiscoverability discoverability)
        {
            if ( mPublisher == null )
            {
                mPublisher = new WiFiDirectAdvertisementPublisher();
            }

            mPublisher.StatusChanged += OnStatusChanged;
            mPublisher.Advertisement.IsAutonomousGroupOwnerEnabled = true;
            mPublisher.Advertisement.LegacySettings.IsEnabled = true;
            mPublisher.Advertisement.LegacySettings.Ssid = "MyGloriousSSID";

            PasswordCredential lCred = new PasswordCredential();
            lCred.Password = "test1234";

            mPublisher.Advertisement.LegacySettings.Passphrase = lCred;

            mPublisher.Advertisement.ListenStateDiscoverability = discoverability;
            mPublisher.Start();
        }

        void OnStatusChanged(WiFiDirectAdvertisementPublisher sender, WiFiDirectAdvertisementPublisherStatusChangedEventArgs statusEventArgs)
        {
            // *** 1 ***
            Console.WriteLine("OnStatusChanged(...): New connection status: {0}", statusEventArgs.Status.ToString());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望能得到一些教程、示例、提示以及任何可以帮助我的东西的参考。谢谢你!

dom*_*eau 1

在查看了 Mike Petrichenko 引用的示例后,我终于找到了这个链接:(native c++ example to download) in this page。它在传统模式下使用 WiFiDirect 来模拟托管网络。它使用 WRL。没有*.vcxproj要破解的文件,没有要链接到的“奇怪”库。这里还有一些或多或少有用的解释。正是我想要的。

不得不说,这些信息并不容易找到……