[英]On using the WiFi Direct Api on Windows?
我目前正在開發一個應用程序,我需要在桌面應用程序(在 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。 到目前為止,很好,它奏效了。
為了簡單使用,我在Legacy模式下使用 API,以平板電腦看到網絡的方式提供 SSID 和密碼。 WiFiDirectAdvertisementPublisherAdvertisement.LegacySettings.IsEnabled = true;
連接速度非常快,一切都很好。
它失敗的地方是我使用了一個流光(類似飛濺的東西)並且它在 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());
}
}
}
我將不勝感激參考教程、示例、提示以及任何可以幫助我的內容。 謝謝!
在查看 Mike Petrichenko 引用的示例后,我最終在此頁面中找到了此鏈接:(要下載的本地 c++ 示例) 。 它在傳統模式下使用 WiFiDirect 來模擬托管網絡。 它使用 WRL。 沒有要破解的*.vcxproj
文件,也沒有要鏈接到的“奇怪”庫。 也有一些或多或少有用的解釋在這里。 正是我想要的。
我必須說,這些信息並不容易找到......
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.