在Windows上使用WiFi Direct Api?

问题描述 投票:1回答:1

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

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

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

我找到了WiFi Direct API,但他们看起来面向通用Windows(UWP),而我希望能够在一个简单的C#应用​​程序中使用它们。 This post展示了如何破解系统并使用简单的C#控制台应用程序使用API​​。到目前为止,这么好,它有效。

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

它失败的地方是我使用流光(类似于防溅板)并在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());
        }
    }
}

我将非常感谢一些教程,示例,提示,以及任何可以帮助我的内容。谢谢!

c# windows wifi wifi-direct wlan
1个回答
0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.