簡體   English   中英

在 Windows 上使用 WiFi Direct Api?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM