一台電腦,有時通過有線網連接網絡(調制解調器/局域網),如有網卡也可連接wifi。
那么如何獲取WLAN是否連接,和相應的信號強度呢?
就以下倆點:
- 獲取電腦連網狀態
- 獲取無線網絡的信號強度
獲取電腦連網狀態
通過IsNetworkAlive可獲取當前環境是否已經連接網絡。詳見《C# 獲取電腦的網絡連接狀態》
流程:網絡是否連接->是否有無線網連接->獲取無線網狀態(信號強度)->返回網絡狀態
1 [DllImport("sensapi.dll", SetLastError = true)] 2 private static extern bool IsNetworkAlive(out int connectionDescription); 3 public NetworkStatus GetNetworkStatusByNetworkAlive() 4 { 5 var networkStatus = NetworkStatus.InternetWithError; 6 7 int flags = 0; 8 var isNetworkAlive = IsNetworkAlive(out flags); 9 10 int errCode = Marshal.GetLastWin32Error(); 11 if (errCode != 0) 12 { 13 throw new InvalidOperationException($"通過{nameof(IsNetworkAlive)}非托管DLL,獲取網絡狀態時,遇到異常"); 14 } 15 if (isNetworkAlive) 16 { 17 // 獲取WLAN網絡狀態 18 var wlanStatus = GetWlanStatus(); 19 if (isNetworkAlive && wlanStatus == NetworkStatus.WifiWithErro) 20 { 21 networkStatus = NetworkStatus.Internet; 22 } 23 else 24 { 25 networkStatus = wlanStatus; 26 } 27 } 28 return networkStatus; 29 }
網絡狀態枚舉值
暫時只定義了有線網和無線網的狀態
1 /// <summary> 2 /// 網絡狀態 3 /// </summary> 4 public enum NetworkStatus 5 { 6 Internet, 7 InternetWithError, 8 WifiWithErro, 9 WifiWithOneBar, 10 WifiWithTwoBars, 11 WifiWithThreeBars, 12 WifiWithFourBars, 13 }
那么,具體是否有線/還是無線網絡,如何判斷?見下面~
獲取無線網絡的信號強度
獲取WLAN的名稱與信號強度
無線網的信息,可以通過第三方開源ManagedWifi來獲取。
ManagedWifi.Dll也可以從我的雲盤下載:https://pan.baidu.com/s/1CjSUIMr0DuVqDZrdZCx_mA 密碼:2d2o
下載后引用到項目中
1. WlanClient wlanClient = new WlanClient();
2. 循環foreach(WlanClient.WlanInterface wlanIface in wlanClient.Interfaces)
3. Wlan.WlanAvailableNetwork[] networks = wlanIface.GetAvailableNetworkList(0);
值得注意的是,
- WlanClient只在有網卡的系統中能初始化--所以如果WlanClient不能初始化,且IsNetworkAlive返回true,則意味着當前是有線連接網線
- WlanInterfacer的GetAvailableNetworkList方法,獲取的是附近wifi熱點列表,和任務欄下熱點列表的順序無關。
- WlanAvailableNetwork的wlanSignalQuality信號強度,100以內,如要轉換成信號格數,需要整除25
- profileName,對已連接的熱點profileName顯示完整,未連接的熱點profileName為empty.
獲取無線網連接狀態:
1 private NetworkStatus GetWlanStatus() 2 { 3 var wlanStatus = NetworkStatus.WifiWithErro; 4 try 5 { 6 WlanClient wlanClient = new WlanClient(); 7 8 foreach (WlanClient.WlanInterface wlanIface in wlanClient.Interfaces) 9 { 10 if (wlanIface.InterfaceState == Wlan.WlanInterfaceState.Connected && wlanIface.CurrentConnection.isState == Wlan.WlanInterfaceState.Connected) 11 { 12 Wlan.WlanAvailableNetwork[] networks = wlanIface.GetAvailableNetworkList(0); 13 foreach (var network in networks) 14 { 15 if (network.profileName == wlanIface.CurrentConnection.profileName 16 && (int)network.flags == (int)(Wlan.WlanAvailableNetworkFlags.Connected | Wlan.WlanAvailableNetworkFlags.HasProfile)) 17 { 18 switch (network.wlanSignalQuality / 25) 19 { 20 case 0: 21 wlanStatus = NetworkStatus.WifiWithOneBar; 22 break; 23 case 1: 24 wlanStatus = NetworkStatus.WifiWithTwoBars; 25 break; 26 case 2: 27 wlanStatus = NetworkStatus.WifiWithThreeBars; 28 break; 29 default: 30 wlanStatus = NetworkStatus.WifiWithFourBars; 31 break; 32 } 33 break; 34 } 35 } 36 break; 37 } 38 } 39 } 40 catch (Exception e) 41 { 42 } 43 return wlanStatus; 44 }
關鍵字:網絡連接狀態NetworkStatus,無線網絡強度(格數),ManagedWifi,IsNetworkAlive,GetLastError