在Windows上使用WiFi Direct Api吗?

时间:2019-03-12 12:02:37

标签: c# windows wifi wifi-direct wlan

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

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

我的目标:能够使用API​​以编程方式执行此操作。我看到了很多有关 WiFi Direct vs 托管网络的讨论,看来托管网络是一种消失的技术而 WiFi Direct 有着光明的未来???我不知道。

我找到了 WiFi Direct API,但它们看起来面向 Universal Windows UWP ),而我希望能够简单地使用它们C#应用。 This post显示了如何通过简单的C#控制台应用程序破解系统并使用API​​。到目前为止,效果很好,

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

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

与此同时,我无法在网络上找到文档。 Microsoft Wlanapi.dll documentation太一般了...我仍然不知道我是否必须专注于 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());
        }
    }
}

我希望能参考一些教程,示例,提示,无论有什么帮助。谢谢!

1 个答案:

答案 0 :(得分:0)

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

我必须说这些信息不容易找到...