C#打開WiFi熱點,WiFi共享的四種方式總結(三)


拚忘的博客園要開始寫隨筆了,第一期就先講講wifi熱點吧.....

持續更新C#、wpf、.NetCore相關內容,歡迎關注!!

 

C#打開WiFi熱點,WiFi共享的四種方式總結(一)

C#打開WiFi熱點,WiFi共享的四種方式總結(二)

C#打開WiFi熱點,WiFi共享的四種方式總結(三)

C#打開WiFi熱點,WiFi共享的四種方式總結(四)

C# Windows系統 ,WiFi共享的方式,打開WiFi熱點我最近研究總結了又四種方式開啟。

1.通過netsh wlan命令行開啟

2.通過wlanapi接口共享

3.通過Win10 Api開啟,Windows.Devices.WiFiDirect

4.通過Win10 api,Windows.Networking.NetworkOperators.NetworkOperatorTetheringManager 開啟電腦自帶的熱點。

 

三、第三種方式是通過win10的APi開啟,

官網種說明這些API用於Windows 10上的UWP應用程序開發。那么在WPF種是否可以使用呢,答案是肯定的。

 

 

 

 

如何在wpf或者是winform使用這些API呢?參考:https://www.cnblogs.com/panwangvie/p/14870183.html

微軟官網中的API在Windows.Devices.WiFiDirect.dll類庫中; 詳細介紹https://docs.microsoft.com/en-us/uwp/api/windows.devices.wifidirect?view=winrt-20348

 詳細代碼如下:

   private WiFiDirectAdvertisementPublisher publisher_;
        private WiFiDirectAdvertisement advertisement_;
        private WiFiDirectLegacySettings legacySettings_;
        private WiFiDirectConnectionListener connectionListener_;
        private readonly List<WiFiDirectDevice> connectedDevices_;

        private string ssid_;
        private string passphrase_;
    private void StartConnectionListener()
        {
            connectionListener_ = new WiFiDirectConnectionListener();
            connectionListener_.ConnectionRequested += ConnectionListenerOnConnectionRequested;
        }

        private async void ConnectionListenerOnConnectionRequested(WiFiDirectConnectionListener sender,
            WiFiDirectConnectionRequestedEventArgs args)
        {
            try
            {
                var connectionRequest = args.GetConnectionRequest();

                if (connectionRequest == null)
                {
                   throw new WlanHostedNetworkException(
                        "Call to ConnectionRequestedEventArgs.GetConnectionRequest() return a null result.");
                }

                var deviceInfo = connectionRequest.DeviceInformation;

                var wiFiDirectDevice = await WiFiDirectDevice.FromIdAsync(deviceInfo.Id);
                
                if (wiFiDirectDevice == null)
                {
                    throw new WlanHostedNetworkException($"Connection to {deviceInfo.Id} failed;");
                }

                if (wiFiDirectDevice.ConnectionStatus == WiFiDirectConnectionStatus.Connected)
                {
                    var endpointPairs = wiFiDirectDevice.GetConnectionEndpointPairs();
                    var connection = endpointPairs.First();
                    var remoteHostName = connection.RemoteHostName;
                    var remoteHostNameDisplay = remoteHostName.DisplayName;
                    RaiseDeviceConnected(wiFiDirectDevice, $"{remoteHostNameDisplay} connected.");
                    connectedDevices_.Add(wiFiDirectDevice);
                }
                wiFiDirectDevice.ConnectionStatusChanged += WfdDeviceOnConnectionStatusChanged;
            }catch(Exception ex)
            {
                throw new WlanHostedNetworkException(ex.Message, ex);
            }
        }


        private void WfdDeviceOnConnectionStatusChanged(WiFiDirectDevice wiFiDirectDevice, object args)
        {
            var endpointPairs = wiFiDirectDevice.GetConnectionEndpointPairs();
            var connection = endpointPairs.First();
            var remoteHostName = connection.RemoteHostName;
            var remoteHostNameDisplay = remoteHostName.DisplayName;
            var status = wiFiDirectDevice.ConnectionStatus;
            if (status == WiFiDirectConnectionStatus.Connected)
            {
                RaiseDeviceConnected(wiFiDirectDevice, $"{remoteHostNameDisplay} connected");
            }
            else
            {
                if (connectedDevices_.Contains(wiFiDirectDevice))
                {
                    connectedDevices_.Remove(wiFiDirectDevice);
                }
                RaiseDeviceDisconnected(wiFiDirectDevice, $"{remoteHostNameDisplay} disconnected.");
            }
        }


        public void Start()
        {
            Reset();

            publisher_ = new WiFiDirectAdvertisementPublisher();
            publisher_.StatusChanged += PublisherOnStatusChanged;

            advertisement_ = publisher_.Advertisement;
            advertisement_.IsAutonomousGroupOwnerEnabled = true;

            legacySettings_ = advertisement_.LegacySettings;
            legacySettings_.IsEnabled = true;

            if (SsidProvided)
            {
                legacySettings_.Ssid = Ssid;
            }
            else
            {
                ssid_ = legacySettings_.Ssid;
            }

            var passwordCredentials = legacySettings_.Passphrase;
            if (PassphraseProvided)
            {
                passwordCredentials.Password = Passphrase;
            }
            else
            {
                passphrase_ = passwordCredentials.Password;
            }

            publisher_.Start();
        }

        public void Stop()
        {
            publisher_?.Stop();
        }

        private void PublisherOnStatusChanged(WiFiDirectAdvertisementPublisher sender, WiFiDirectAdvertisementPublisherStatusChangedEventArgs args)
        {
            try
            {
                var status = args.Status;

                switch (status)
                {
                    case WiFiDirectAdvertisementPublisherStatus.Started:
                        {
                          StartConnectionListener();
                            RaiseAdvertisementStarted("Advertisement started.");
                            break;
                        }
                    case WiFiDirectAdvertisementPublisherStatus.Aborted:
                        {
                            var error = args.Error;
                           
                                string message;

                                switch (error)
                                {
                                    case WiFiDirectError.RadioNotAvailable:
                                        message = "Advertisement aborted, Wi-Fi radio is turned off";
                                        break;

                                    case WiFiDirectError.ResourceInUse:
                                        message = "Advertisement aborted, Resource In Use";
                                        break;
                                    
                                    default:
                                        message = "Advertisement aborted, unknown reason";
                                        break;
                                }

                                RaiseAdvertisementAborted(message);
                            break;
                        }
                    case WiFiDirectAdvertisementPublisherStatus.Stopped:
                        {
                            RaiseAdvertisementStopped("Advertisement stopped");
                            break;
                        }
                }
            }
            catch (WlanHostedNetworkException ex)
            {
                RaiseAsyncException(ex.Message);
            }
        }

這種方法的好處:

是直接調用封裝好的dll方便,且能夠監聽到設備連接情況。

缺點:

但是這個方法並非是直接打開win電腦中自帶的那個移動熱點。當我把電腦中自帶的移動熱點打開時,此方法開啟的熱點會斷開。

 

如何開啟電腦自帶的移動熱點呢,看下一篇。C#打開WiFi熱點,WiFi共享的四種方式總結(四)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM