【发布时间】:2019-08-02 21:34:36
【问题描述】:
我目前正在开发一个应用程序,我需要在桌面应用程序(在 Windows 10 上)和平板电脑(Android,但这无关紧要)之间创建一个链接(阅读:WiFi 链接) .工作流程:按钮 -> 根据需要提升权限 -> 创建类似托管网络的 WiFi 网络 -> 允许设备连接提供SSID/密码/动态 IP 地址...
以前,我使用对 netsh 的系统调用(以提升的权限运行应用程序)来创建托管网络。现在看来,以这种方式进行的可能性越来越小(例如:在同一台计算机上,它在 Win 7 上运行,但在 Win 10 上不再运行)。这似乎是一个驱动程序问题,因为它仍然适用于外部 USB 天线,但不适用于内部天线。无论如何,我不想在这个解决方案上走得更远。
我的目标:能够使用 API 以编程方式执行此操作。我看到很多关于 WiFi Direct vs Hosted Network 的讨论,似乎 Hosted Network 是一种正在消失的技术而 WiFi Direct 有着辉煌的未来???我不知道。
我找到了 WiFi Direct API,但它们看起来面向 Universal Windows (UWP),而我希望能够以简单的方式使用它们C# 应用程序。 This post 展示了如何破解系统并将 API 与简单的 C# 控制台应用程序一起使用。到目前为止,一切都很好,它奏效了。
为了简单起见,我在 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());
}
}
}
如果对教程、示例、提示以及任何对我有帮助的内容,我将不胜感激。谢谢!
【问题讨论】:
-
事实上,您可以同时使用这两种 API(HostedNetwork 或 WiFiDirect),但应该知道并非所有 WiFi 适配器都支持托管网络和/或 WiFiDirect。 WiFi 适配器可能仅支持托管网络或仅支持 WiFi Direct。因此,您的应用程序必须同时支持两者。另一个问题是 SoftAP 模式(旧版)中的托管网络和 WiFi Direct 在您的 PC 上创建了虚拟 AP。取而代之的是 WiFiDirect 创建了具有更好功能和生产力的简单点对点连接。您可以查看我们支持 WiFi Direct 和托管网络的 WiFi 框架 (btframework.com)
-
是否有一些可以设置的设置(除了SSID/pwd)?对于这些 API,MS doc 非常糟糕...
-
取决于您的需要。对于 AdHock(托管网络),只能设置 SSID 和 PWD。因为它显示为接入点。 WiFiDirect Legacy SoftAP 模式也是如此。但是,普通 WiFiDirect 允许提供很多设置:身份验证方法、组所有者、组 ID、支持的服务等。
-
实际上,正如我所写,我的流媒体在使用 WiFi Direct 一段时间后断开连接,但在使用托管网络时却没有。我无法启动托管网络,所以我想使用 WiFi Direct。 这些 API 是否有一些教程和/或示例?
标签: c# windows wifi-direct wifi