如何在C#中检测蜂窝连接

时间:2019-03-13 17:12:46

标签: c# wpf network-programming

我正在开发“常规” C#WPF应用程序(没有UWP应用程序),并且我需要知道我是否在蜂窝连接上。蜂窝连接既可以在设备内部使用Simcard,也可以在手机中使用热点时使用。

我该如何实现?

背景: 由于该应用程序可能会下载大量数据,因此我希望用户可以选择是否要避免通过蜂窝网络下载)

其他SO问题: 我见过this questionthis question,他们专注于UWP功能。还有this one,它只关注连接本身,而不是蜂窝连接。

2 个答案:

答案 0 :(得分:1)

您可以使用System.Net.NetworkInformation来标识您的计算机网络适配器。

此外,您可以利用属性NetworkInterface.OperationalStatus来过滤当前连接的适配器,并利用NetworkInterfaceType来标识连接的类型。请查看下面的示例。

不幸的是,我的机器上没有蜂窝调制解调器来检查它是否返回了所需的结果,但是请尝试一下并让我们知道它是否可以工作。

 NetworkInterface[] interfaces = NetworkInterface.GetAllNetworkInterfaces();
 foreach (NetworkInterface adapter in interfaces)
    {
        //Check if it's connected
        if (adapter.OperationalStatus == OperationalStatus.Up
            //The network interface uses a mobile broadband interface for WiMax devices.
            && (adapter.NetworkInterfaceType == NetworkInterfaceType.Wman
                //The network interface uses a mobile broadband interface for GSM-based devices.
                || adapter.NetworkInterfaceType == NetworkInterfaceType.Wwanpp
                //The network interface uses a mobile broadband interface for CDMA-based devices.
                || adapter.NetworkInterfaceType == NetworkInterfaceType.Wwanpp2))
        {
            //adapter probably is cellular
        }                
    }

答案 1 :(得分:1)

我尝试了UWP库,并能够使用UWP参考来解决它。

我添加了此引用:

C:\Program Files (x86)\Windows Kits\10\References\10.0.17763.0\Windows.Foundation.UniversalApiContract\7.0.0.0\Windows.Foundation.UniversalApiContract.winmd

并使用此代码检查计量连接:

private void CheckIsMetered()
{
    var profile = Windows.Networking.Connectivity.NetworkInformation.GetInternetConnectionProfile();
    IsInternetAvailable = profile != null && profile.GetNetworkConnectivityLevel() == NetworkConnectivityLevel.InternetAccess;
    if (IsInternetAvailable)
        IsMetered = profile.GetConnectionCost().NetworkCostType != Windows.Networking.Connectivity.NetworkCostType.Unrestricted;
}

我使用NetworkStatusChanged事件重新检查IsMetered。

CheckIsMetered();
NetworkInformation.NetworkStatusChanged += (s) => CheckIsMetered(); 

这在我的WPF应用程序中有效。