diff options
| author | Roy Ben-Shabat <Roy@Twine-s.com> | 2018-08-15 11:57:12 +0300 |
|---|---|---|
| committer | Roy Ben-Shabat <Roy@Twine-s.com> | 2018-08-15 11:57:12 +0300 |
| commit | bbbf57af4d61e1b6d61b67418415008f58dadb3c (patch) | |
| tree | df4bf18101bf5fcbda5140ea5f951a8c30d7b686 /Software/Visual_Studio/Tango.WiFi/Wifi.cs | |
| parent | bd012a8edd576026f8277ab0b462197482df9285 (diff) | |
| download | Tango-bbbf57af4d61e1b6d61b67418415008f58dadb3c.tar.gz Tango-bbbf57af4d61e1b6d61b67418415008f58dadb3c.zip | |
Added Tango.WiFi
Diffstat (limited to 'Software/Visual_Studio/Tango.WiFi/Wifi.cs')
| -rw-r--r-- | Software/Visual_Studio/Tango.WiFi/Wifi.cs | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/Software/Visual_Studio/Tango.WiFi/Wifi.cs b/Software/Visual_Studio/Tango.WiFi/Wifi.cs new file mode 100644 index 000000000..8929eacf1 --- /dev/null +++ b/Software/Visual_Studio/Tango.WiFi/Wifi.cs @@ -0,0 +1,152 @@ +using Tango.WiFi.Win32; +using System; +using System.Collections.Generic; +using System.Text; +using System.Linq; +using Tango.WiFi.Win32.Interop; + +using NotifCodeACM = Tango.WiFi.Win32.Interop.WlanNotificationCodeAcm; +using NotifCodeMSM = Tango.WiFi.Win32.Interop.WlanNotificationCodeMsm; + +namespace Tango.WiFi +{ + public class Wifi + { + public event EventHandler<WifiStatusEventArgs> ConnectionStatusChanged; + + private WlanClient _client; + private WifiStatus _connectionStatus; + private bool _isConnectionStatusSet = false; + public bool NoWifiAvailable = false; + + public Wifi() + { + _client = new WlanClient(); + NoWifiAvailable = _client.NoWifiAvailable; + if (_client.NoWifiAvailable) + return; + + foreach (var inte in _client.Interfaces) + inte.WlanNotification += inte_WlanNotification; + } + + /// <summary> + /// Returns a list over all available access points + /// </summary> + public List<AccessPoint> GetAccessPoints() + { + List<AccessPoint> accessPoints = new List<AccessPoint>(); + if (_client.NoWifiAvailable) + return accessPoints; + + foreach (WlanInterface wlanIface in _client.Interfaces) + { + WlanAvailableNetwork[] rawNetworks = wlanIface.GetAvailableNetworkList(0); + List<WlanAvailableNetwork> networks = new List<WlanAvailableNetwork>(); + + // Remove network entries without profile name if one exist with a profile name. + foreach (WlanAvailableNetwork network in rawNetworks) + { + bool hasProfileName = !string.IsNullOrEmpty(network.profileName); + bool anotherInstanceWithProfileExists = rawNetworks.Where(n => n.Equals(network) && !string.IsNullOrEmpty(n.profileName)).Any(); + + if (!anotherInstanceWithProfileExists || hasProfileName) + networks.Add(network); + } + + foreach (WlanAvailableNetwork network in networks) + { + accessPoints.Add(new AccessPoint(wlanIface, network)); + } + } + + return accessPoints; + } + + /// <summary> + /// Disconnect all wifi interfaces + /// </summary> + public void Disconnect() + { + if (_client.NoWifiAvailable) + return; + + foreach (WlanInterface wlanIface in _client.Interfaces) + { + wlanIface.Disconnect(); + } + } + public WifiStatus ConnectionStatus + { + get + { + if (!_isConnectionStatusSet) + ConnectionStatus = GetForcedConnectionStatus(); + + return _connectionStatus; + } + private set + { + _isConnectionStatusSet = true; + _connectionStatus = value; + } + } + + private void inte_WlanNotification(WlanNotificationData notifyData) + { + if (notifyData.notificationSource == WlanNotificationSource.ACM && (NotifCodeACM)notifyData.NotificationCode == NotifCodeACM.Disconnected) + OnConnectionStatusChanged(WifiStatus.Disconnected); + else if (notifyData.notificationSource == WlanNotificationSource.MSM && (NotifCodeMSM)notifyData.NotificationCode == NotifCodeMSM.Connected) + OnConnectionStatusChanged(WifiStatus.Connected); + } + + private void OnConnectionStatusChanged(WifiStatus newStatus) + { + ConnectionStatus = newStatus; + + if (ConnectionStatusChanged != null) + ConnectionStatusChanged(this, new WifiStatusEventArgs(newStatus)); + } + + // I don't like this method, it's slow, ugly and should be refactored ASAP. + private WifiStatus GetForcedConnectionStatus() + { + if (NoWifiAvailable) + return WifiStatus.Disconnected; + + bool connected = false; + + foreach (var i in _client.Interfaces) + { + try + { + var a = i.CurrentConnection; // Current connection throws an exception if disconnected. + connected = true; + } + catch { } + } + + if (connected) + return WifiStatus.Connected; + else + return WifiStatus.Disconnected; + } + } + + public class WifiStatusEventArgs : EventArgs + { + public WifiStatus NewStatus { get; private set; } + + internal WifiStatusEventArgs(WifiStatus status) : base() + { + this.NewStatus = status; + } + + } + + public enum WifiStatus + { + Disconnected, + Connected + } +} |
